当前位置: 首页 > article >正文

在Windows上读写Linux磁盘镜像的一种方法

背景

嵌入式开发中,经常会把系统的Linux磁盘镜像保存到Windows上,以便上传到网盘备份或发送给工厂,但是如果想读取/修改镜像中的某个文件,一般有2种方案:

直接访问

就是用虚拟磁盘软件将镜像文件挂载成磁盘,再用ext4分区驱动读写分区内的文件,这个方案目前看来困难重重,基本不可行(好吧看来我有一点标题党了)

一些失败的尝试

  • 试了Linux Reader这种直接读取的,发现无法打开ext4分区,放弃
  • 试了msys2,它的util-linux包里没有losetup命令,放弃
  • 试了安装Ext4Fsd这个Windows的ext4文件系统驱动,结果它不能跟Linux Reader配合,放弃
  • 试了安装Paragon ExtFS,根本用不了,放弃
  • 试了FileDevice,根据这篇文章操作也没用起来,估计要改BIOS关闭secure boot,还是不冒险了

间接访问(拷贝镜像文件)

就是将镜像拷贝到Linux系统里,再用losetup设置成一个loop设备,最后将loop设备内的感兴趣分区挂载后访问。

因为磁盘镜像一般都比较大,拷贝比较耗时,有没有不拷贝的方法?

间接访问(不拷贝镜像文件)

考虑从Linux虚拟机来访问window上的磁盘镜像,虽然比直接访问方案麻烦点,但至少能跑通,因为losetup等命令能很方便地用上,但是该怎么把Windows上的镜像文件挂载到Linux虚拟机呢?

一些对我的需求而言无效的机制

  • 试了VMware虚拟磁盘/虚拟光盘/虚拟软盘等功能,结果发现
    • 虚拟磁盘只支持VMware特有格式的,放弃
    • 虚拟光盘检测到的体积是实际值的4倍,放弃
    • 虚拟软盘检测到的体积只有4KB,放弃

后来发现VMware的这个机制有效

VMware的共享文件夹机制,有效

首先在VMware界面创建共享文件夹

将img文件所在目录定义成共享文件夹

然后在Linux虚拟机里挂载该虚拟文件夹

sudo mkdir -p /mnt/hgfs
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
ls /mnt/hgfs
  • 文件系统类型是fuse.vmhgfs-fuse
  • 挂载媒介是.host:/,表示宿主机当前配置的共享文件夹,即D:\work_dir\F264
  • 挂载目录是/mnt/hgfs,这个最好提前创建,mount命令是不会自动创建的
  • ls命令会列出共享文件夹下的所有文件,不仅仅是img文件

这条命令里并未出现共享文件夹的名称,猜测是因为VMware同一时刻仅允许存在一个共享文件夹

挂载并访问共享文件夹里的img文件

用losetup命令将img文件设置成磁盘

sudo losetup -P /dev/loop8 /path/to/F264_SD_20240905.img
lsblk
  • losetup命令用于将指定的img文件设置成一个loop磁盘,即/dev/loop8
  • losetup命令的-P选项用于扫描磁盘分区并为分区自动创建设备文件,这样我们就不用记分区在文件内的偏移了
  • lsblk命令用于显示系统当前所有的块设备

下面是lsblk命令的输出:

NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop8       7:8    0  7.4G  0 loop 
├─loop8p3 259:2    0    4G  0 loop 
├─loop8p1 259:0    0  100M  0 loop 
└─loop8p2 259:1    0    3G  0 loop 
sr0        11:0    1 1024M  0 rom  
fd0         2:0    1    4K  0 disk 
sda         8:0    0   20G  0 disk 
├─sda2      8:2    0    1K  0 part 
├─sda5      8:5    0  975M  0 part [SWAP]
└─sda1      8:1    0   19G  0 part /

可以看到,img文件内的3个分区都被losetup正确识别出来了分别是loop8p1 loop8p2 loop8p3

用mount命令挂载img文件内感兴趣的分区,访问分区内任意文件

直接挂载img文件的第二个分区,也就是root分区:

sudo mkdir -p /mnt/root
sudo mount /dev/loop8p2 /mnt/root
ls /mnt/root

输出

bin  boot  dev  etc  home  lib  lost+found  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var

总结

  • 我本以为实现这个不算冷门的需求花不了多长时间,没想到windows和linux的生态差异仍然巨大,弥合二者的工作仍然很艰巨。
  • 后面这个工作或许可以通过dokanx等类似Fuse的库来更简便地实现。

http://www.kler.cn/a/459767.html

相关文章:

  • pip下载包出现SSLError
  • GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网
  • 工厂模式与抽象工厂模式在Unity中的实际应用案例
  • DataV数据可视化
  • 树莓派linux内核源码编译
  • 移动端如何实现上拉加载
  • ElasticSearch 分布式部署
  • 现在Java面试需要提前准备哪些知识?
  • 仓颉语言实战——3.表达式
  • 如何学习、使用Ai,才能跟上时代的步伐?
  • # 光速上手 - JPA 原生 sql DTO 投影
  • Lucene 漏洞历险记:修复损坏的索引异常
  • 记录一个我在idea启动时的报错
  • CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决
  • upload-labs关卡记录12
  • 钉钉h5微应用,鉴权提示dd.config错误说明,提示“jsapi ticket读取失败
  • 如何做好IT类的技术面试?
  • Android Room 框架的初步使用
  • Vue3最新Router带来哪些颠覆性变化?
  • 排序算法(系列)
  • 智慧农业物联网传感器:开启农业新时代
  • 史上最全 Git 图文教程(非常详细)零基础入门到精通,收藏这一篇就够了
  • 如何在CentOS 6上安装和配置Apache与PHP?
  • 高效学习资源网站汇总
  • Centos 7 二进制安装时序数据库TDengine_我和国产时序数据库的第一次亲密接触
  • 服务器主机测试网络