如何挂载Raspberry Pi Linux发行映像?


37

普通文件系统映像可以很容易地挂载:

mount system.img /mnt

检查并修改。但是,当我用Raspberry Pi系统映像(例如raspbian)尝试此操作时,我得到:

mount: unknown filesystem type '(null)'

而且无论我尝试什么-t,它都行不通。如何安装该映像?


Answers:


71

这个问题是对其他问题的回答的一部分,但是在这里应进行规范处理,因此不必重复。

您无法将映像整体安装,因为它实际上包含两个分区和一个引导扇区。但是,如果知道各个分区在文件中的偏移量,则可以在映像中装入各个分区。要找到它们,请使用作为块设备检查图像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分区的块来找到以字节为单位的偏移量:

  • 第一分区512 * 8192 = 4194304
  • 第二分区512 * 122880 = 62914560

这些可以与命令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系统运行时,第一个分区可能安装在第二个分区上。


12
kpartx使您更轻松:kpartx -a whatever.img创建适当的(循环)节点,以后可以随意安装。运行kpartx -d whatever.img以删除(卸载的)循环节点。


如何同时安装根分区和引导分区:unix.stackexchange.com/q/342463/9689
Grzegorz Wierzowiecki

1
PS如果要同时安装两个分区,为了避免“重叠”错误,只需使用sizelimit选项指定分区的大小即可。有关更多信息:unix.stackexchange.com/a/342466/9689。(顺便说一句,以上答案可能会更新,以提供该选项的示例用法)
Grzegorz Wierzowiecki

2
您可以使用bash的Arithmetic Expansion:而不是手动乘法$((8192*512))
Ruslan

20

losetup通过提供分区探测-P。使用此功能非常容易安装完整磁盘映像(例如Raspbian SD卡映像)的分区:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot

这似乎不太容易出现人为错误。我还可以在mount命令中使用标签吗?
ctrl-alt-delor '18

1

最初,我使用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}

这将为您创建一个临时目录,自动分配下一个循环设备,并为您将其设置为p1p2分区设备,并挂载启动和root用户。

您还可以将清理部分放在出口陷阱中,因此,如果出现故障,则不会有挂接的挂载/文件:

set -e
function cleanup {
  sudo umount -f $TMP/boot/
  sudo umount -f $TMP
  rmdir $TMP
}
trap cleanup EXIT

0

如果fdisk -l在Arch linux上显示的是扇区而不是块,则...在“重叠循环错误”的情况下查找块数的另一种方法是从第二个分区中减去第一个分区的字节偏移量再除以二 例如(62914560-4194304)/ 2 = 29360128

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.