windows下有很多可视化的工具可以对镜像文件修改,这里不做介绍。windows很多文件不支持读取linux文件系统,这里安利一个小工具 Linux_Reader,可以支持非常多种的镜像格式,包含虚拟机。
本文介绍losetup、mount两个命令对img镜像文件的挂载和修改进行介绍。
losetup命令用于设置循环设备。
循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。
$ losetup -help
Usage:
losetup [options] [<loopdev>]
losetup [options] -f | <loopdev> <file>
Set up and control loop devices.
Options:
-a, --all list all used devices
-d, --detach <loopdev>... detach one or more devices
-f, --find find first unused device
-P, --partscan create a partitioned loop device
...
关注的参数有
当挂载含分区img文件时,需要添加-p参数。
下面演示如何losetup、mount来挂载img文件。
以树莓派为例备份一个系统镜像img文件,使用 fdisk -l filename.img
查看信息如下:
$ fdisk -l raspios_copy_cm4.img
Disk raspios_copy_cm4.img: 7.3 GiB, 7818182656 bytes, 15269888 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xadf6c25e
Device Boot Start End Sectors Size Id Type
raspios_copy_cm4.img1 8192 532479 524288 256M c W95 FAT32 (LBA)
raspios_copy_cm4.img2 532480 15269887 14737408 7G 83 Linux
整个镜像占用7.3G,未进行系统压缩(系统压缩参 树莓派系统最小img镜像的制作-备份与还原),含有两个分区,一个是固定的 256M 的boot启动分区,另一个是约7G的rootfs文件系统。
(1)查看下一个可用的loop设备
使用命令losetup -f
查询到的下一个可用loop设备文件为 /dev/loop19。
$ losetup -f
/dev/loop19
(2)使用 losetup -p 参数挂载img文件
$ sudo losetup -P /dev/loop19 raspios_copy_cm4.img
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 32.3M 1 loop /snap/snapd/12883
... // 省略
loop18 7:18 0 2.5M 1 loop /snap/gnome-system-monitor/174
loop19 7:19 0 7.3G 0 loop
├─loop19p1 259:0 0 256M 0 loop
└─loop19p2 259:1 0 7G 0 loop
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 930.1G 0 part /
└─sda3 8:3 0 977M 0 part
可以看到设备 loop19下有两个分区加载,大小和树莓派系统镜像一致,loop19p1是启动分区boot,loop19p2是文件系统分区rootfs。
当需要卸载img镜像文件时,使用命令 losetup -d
,例如 losetup -d /dev/loop19。
(3)挂载文件系统
创建两个文件夹 rootfs 和 boot,并分别使用mount
命令挂载loop19p1和loop19p2
$ mkdir boot
$ mkdir rootfs
$ sudo mount /dev/loop19p1 ./boot/
$ sudo mount /dev/loop19p2 ./rootfs/
(4)查看和修改分区文件
分别进入 rootfs 和 boot,就是在树莓派启动后看到的文件内容。
$ ls ./boot/
COPYING.linux bcm2709-rpi-2-b.dtb cmdline.txt fixup_db.dat start4.elf
LICENCE.broadcom bcm2710-rpi-2-b.dtb config.txt fixup_x.dat start4cd.elf
'System Volume Information' bcm2710-rpi-3-b-plus.dtb dt-blob.bin issue.txt start4db.elf
bcm2708-rpi-b-plus.dtb bcm2710-rpi-3-b.dtb fixup.dat kernel.img start4x.elf
bcm2708-rpi-b-rev1.dtb bcm2710-rpi-cm3.dtb fixup4.dat kernel7.img start_cd.elf
bcm2708-rpi-b.dtb bcm2711-rpi-4-b.dtb fixup4cd.dat kernel7l.img start_db.elf
bcm2708-rpi-cm.dtb bcm2711-rpi-400.dtb fixup4db.dat kernel8.img start_x.elf
bcm2708-rpi-zero-w.dtb bcm2711-rpi-cm4.dtb fixup4x.dat overlays
bcm2708-rpi-zero.dtb bootcode.bin fixup_cd.dat start.elf
$ ls ./rootfs/
bin dev home lost+found mnt proc run srv tmp usr
boot etc lib media opt root sbin sys upgrade var
之后,我们可以像进入了一个启动的树莓派系统一样进行文件的增删改了,但是要注意路径的操作。
$ sudo umount /dev/loop19p
$ sudo umount /dev/loop19p2
$ sudo losetup -d /dev/loop19