Answers:
这个问题是对其他问题的回答的一部分,但是在这里应进行规范处理,因此不必重复。
您无法将映像整体安装,因为它实际上包含两个分区和一个引导扇区。但是,如果知道各个分区在文件中的偏移量,则可以在映像中装入各个分区。要找到它们,请使用作为块设备检查图像fdisk -l whatever.img
。输出应包括这样的表:
Device Boot Start End Blocks Id System
whatever.img1 8192 122879 57344 c W95 FAT32 (LBA)
whatever.img2 122880 5785599 2831360 83 Linux
这是两个分区。第一个标记为“ FAT32”,另一个标记为“ Linux”。在此表上方,有关于设备整体的其他信息,包括:
Units: sectors of 1 * 512 = 512 bytes
我们可以通过将该单位大小乘以Start
分区的块来找到以字节为单位的偏移量:
这些可以与命令offset
选项一起使用mount
。我们还提供了有关的每个分区类型的线索fdisk
。因此,假设我们有目录/mnt/img/one
并且/mnt/img/two
可以用作挂载点:
mount -v -o offset=4194304 -t vfat whatever.img /mnt/img/one
mount -v -o offset=62914560 -t ext4 whatever.img /mnt/img/two
如果在此出现“重叠循环”错误,则您的版本mount
要求您指定第一个分区的大小以及偏移量。卸下它,并使用块数(57344)* 512(= 29360128):
mount -v -o offset=4194304,sizelimit=29360128 \
-t vfat whatever.img /mnt/img/one
第二个分区不需要大小限制,因为映像中没有任何限制。
现在,您可以访问两个分区。如果您不想更改其中的任何内容,也可以使用-r
(只读)开关。 如果您进行任何更改,这些更改将包含在.img
文件中。
请注意,/boot
系统运行时,第一个分区可能安装在第二个分区上。
sizelimit
选项指定分区的大小即可。有关更多信息:unix.stackexchange.com/a/342466/9689。(顺便说一句,以上答案可能会更新,以提供该选项的示例用法)
$((8192*512))
。
losetup
通过提供分区探测-P
。使用此功能非常容易安装完整磁盘映像(例如Raspbian SD卡映像)的分区:
losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
最初,我使用awk / grep解析fdisk并提取偏移量,但是发现它可能有点复杂,易碎,并且以后很难理解。我发现的最简单的方法是:
IMAGE_FILE="YOUR IMAGE FILE GOES HERE"
TMP=$(mktemp -d)
LOOP=$(sudo losetup --show -fP "${IMAGE_FILE}")
sudo mount ${LOOP}p2 $TMP
sudo mount ${LOOP}p1 $TMP/boot/
# do stuff to ${TMP}/ which is rpi filesystem
# cleanup
umount ${TMP}/boot/
umount ${TMP}
rmdir ${TMP}
这将为您创建一个临时目录,自动分配下一个循环设备,并为您将其设置为p1
和p2
分区设备,并挂载启动和root用户。
您还可以将清理部分放在出口陷阱中,因此,如果出现故障,则不会有挂接的挂载/文件:
set -e
function cleanup {
sudo umount -f $TMP/boot/
sudo umount -f $TMP
rmdir $TMP
}
trap cleanup EXIT