背景
嵌入式Linux系统通常在调试稳定后,会对磁盘(SSD、NVME、SD卡、TF卡)做个镜像,通常是.img
后缀的文件,以后组装新设备时,就将镜像文件烧录到新磁盘即可,非常简单。
这种方法有个不便之处,就是当某些关键文件(LCD、触屏、按键等人机交互设备的驱动)有改动时,就需要重新对磁盘做镜像,如果手头没有相同容量的磁盘,就很麻烦。
思路
一种简单的办法是用Linux Reader打开img文件,更新其中内容后保存即可,但是该软件只能读,不能写,而且还收费,放弃。
想起Linux有loop设备的概念,类似于虚拟光驱
,如果能将img文件像下图一样加载就好了。
查了一圈资料,自己将资料综合起来并做实验,找到实现方法。
实现方法
关键工具是losetup
命令(桌面Linux自带),具体步骤如下示例:
- 将镜像文件Foo.img上传到一台桌面Linux环境(物理机/虚拟机均可)
- 进入桌面Linux的终端,执行
ls /dev/loop* | sort
命令,看loop设备编号用到几了,待会我们将img文件attach到几+1 - 如果你清楚分区信息,下面3个小步骤可以跳过,不清楚就不要跳过
3.a 执行sudo losetup /dev/loop14 Foo.img
,attach镜像文件Foo.img到/dev/loop14
3.b 执行sudo fdisk /dev/loop14
命令,获取磁盘的分区信息(具体步骤请参阅fdisk命令手册)
3.c 执行sudo losetup -d /dev/loop14
命令,detach镜像文件Foo.img - 执行
sudo losetup -o 1M --sizelimit 100M /dev/loop14 Foo.img
命令,attch到img的第一个分区,其他分区同理
4.a 选项-o
表示分区的起始偏移,选项--sizelimit
表示分区的大小 - 执行
sudo mount /dev/loop14 /mnt/p1/
命令,将新创建的loop设备挂载到/mnt/p1/目录
5.a 如果分区的文件系统比较小众,给mount添加适当的选项 - 根据自己的需求对/mnt/p1/目录做增删改查
- 执行
sudo umount /mnt/p1/
命令,卸载loop设备 - 执行
sudo losetup -d /dev/loop14
命令,从img的第一个分区detach
总结
只要思想不滑坡,办法总比困难多。