.. _mount_img: =================== 挂载raw镜像(.img) =================== 我在实践 :ref:`install_kali_pi` 遇到了和 :ref:`pi_400_4k_display` 相同的显示黑边问题,需要参考树莓派 ``/boot/config.txt`` 配置进行调整。不过,由于我已经重新通过 ``dd`` 镜像的方式抹除了 :ref:`pi_400` 的树莓派操作系统用来安装 :ref:`kali_linux` 。好在安装Kali之前,我已经通过 :ref:`clone_pi` 方式完整备份了系统镜像,所以还是可以挂载镜像来查看。 .. note:: 在 :ref:`kvm` 虚拟化环境中,我们经常可能需要查看 raw images 中的内容,所以本文方法是一种通用运维技术。 - 在挂载物理设备之前,我们首先需要知道镜像的分区信息:: sudo fdisk -l pi400.img ``fdisk`` 命令的 ``-l`` 参数可以显示分区,如果需要使用不同的显示单位,还可以使用 ``-u`` 参数制定使用 ``cylinders`` 或 ``sectors`` (默认是sectors) 显示输出:: Disk pi400.img: 19.65 GiB, 21100823040 bytes, 41212545 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: 0x5b20ba64 Device Boot Start End Sectors Size Id Type pi400.img1 8192 532479 524288 256M c W95 FAT32 (LBA) pi400.img2 532480 41212544 40680065 19.4G 83 Linux 这里可以看到有2个分区,第一个分区是从 ``8192`` 扇区到 ``532479`` 扇区,分区类型是 FAT32;第二个分区则是从 ``532480`` 开始到 ``41212544`` ,分区类型是Linux。 - 挂载镜像分区的关键是指定正确的起始扇区,每个扇区是 ``512`` 字节,这里我们可以使用shell进行计算:: sudo mkdir /mnt/img1 sudo mount -t vfat -o loop,offset=$((8192 * 512)) pi400.img /mnt/img1 sudo mkdir /mnt/img2 sudo mount -t ext4 -o loop,offset=$((532480 * 512)) pi400.img /mnt/img2 第二次挂载会出现一个报错提示:: mount: /mnt/img2: overlapping loop device exists for /backup/pi400.img. 原因是挂载参数没有指定分区的扇区数量,导致两者覆盖 - 检查所有的 ``loop`` 设备:: sudo losetup -l 可以看到输出:: NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC /dev/loop1 0 0 1 1 /var/lib/snapd/snaps/core_10958.snap 0 512 /dev/loop6 0 0 0 0 /backup/pi400.img 0 512 /dev/loop4 0 0 1 1 /var/lib/snapd/snaps/anbox_180.snap 0 512 /dev/loop2 0 0 1 1 /var/lib/snapd/snaps/hello-world_29.snap 0 512 /dev/loop0 0 0 1 1 /var/lib/snapd/snaps/core_10908.snap 0 512 /dev/loop5 0 0 0 1 /snap/anbox/180/android.img 0 512 /dev/loop3 0 0 1 1 /var/lib/snapd/snaps/wechat_2.snap 0 512 - 需要先删除掉 ``loop6`` 设备才能重新挂载:: sudo losetup -d /dev/loop6 - 通过增加 ``sizelimit`` 参数避免多个分区重叠:: sudo mount -t vfat -o loop,offset=$((8192 * 512)),sizelimit=$((524288 * 512)) pi400.img /mnt/img1 sudo mount -t ext4 -o loop,offset=$((532480 * 512)),sizelimit=$((40680065 * 512)) pi400.img /mnt/img2 然后检查挂载:: df -h 挂载分区如下:: ... /dev/loop6 253M 48M 205M 19% /mnt/img1 /dev/loop7 20G 19G 48M 100% /mnt/img2 - 检查loop设备可以看到:: sudo losetup -l :: NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC ... /dev/loop6 268435456 4194304 1 0 /backup/pi400.img 0 512 ... /dev/loop7 20828193280 272629760 1 0 /backup/pi400.img 0 512 参考 ====== - `Tutorial: How to mount raw images (.img) images on Linux `_ - `How to find the type of an img file and mount it? `_ - `How to mount multiple partitions from disk image simultaneously? `_ -