如何挂载用dd创建的SD卡图像?


21

我使用以下命令创建了Raspberry Pi SD卡的图像dd

sudo dd if=/dev/sdf of=/home/myusername/raspberry-backup-2014-04-10.img

SD卡包括两个分区(一个vfat,一个ext4),当我将其插入时会自动安装。

我的问题:如何从.img文件挂载这些分区?


更多细节:

$ fdisk -l raspberry-backup-2014-04-10.img 

Disk raspberry-backup-2014-04-10.img: 3974 MB, 3974103040 bytes
255 heads, 63 sectors/track, 483 cylinders, total 7761920 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
Disk identifier: 0x000981cb

                          Device Boot      Start         End      Blocks   Id  System
raspberry-backup-2014-04-10.img1            8192      122879       57344    c  W95 FAT32 (LBA)
raspberry-backup-2014-04-10.img2          122880     7761919     3819520   83  Linux

您要挂载映像而不将其写入de SD卡吗?
OrangeTux

是的,我想完全访问.img文件中存储的文件系统,以便可以复制/修改/删除/ etc。没有SD卡的文件
MrD

也许这个问题对您有帮助。
OrangeTux

不幸的是,这没有用,尝试了两次。第一个没有创建/ dev / loop0p1设备。第二个(我已经据此计算了起点)引发了一个wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other error问题
MrD 2014年

此外,sudo fdisk -l /dev/loop0声明:磁盘/ dev / loop0不包含有效的分区表。
MrD 2014年

Answers:


33

为避免需要为每个分区创建单独的映像或安装诸如的实用程序kpartx,可以通过offsetmount命令中指定来分别挂载每个分区。

首先检查映像文件中的分区,并使用fdisk以下命令确定偏移量:

$ fdisk -u -l rpi_image280914 

Disk rpi_image280914: 16.0 GB, 16012804096 bytes
255 heads, 63 sectors/track, 1946 cylinders, total 31275008 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
Disk identifier: 0x000cdac7

           Device Boot      Start         End      Blocks   Id  System
rpi_image280914p1   *        2048      514047      256000    c  W95 FAT32 (LBA)
rpi_image280914p2          540672    31242239    15350784   83  Linux

取所需Start分区的扇区,然后将该值乘以Units大小。因此,如果您想要第二个分区,您将得到540672 * 512 = 276824064

现在创建一个文件夹并挂载分区:

mkdir rpi_partition2
sudo mount -o loop,offset=276824064 rpi_image280914 rpi_partition2/

完成分区数据所需的操作后:

sudo umount rpi_partition2/
rm -r rpi_partition2/

17

经过一些附加测试,我自己找到了解决方案: kpartx

sudo kpartx -a raspberry-backup-2014-04-10.img

此命令创建/dev/mapper/loop0p1/dev/mapper/loop0p2。之后,可以将这些分区直接安装:

sudo mount -o rw -t ext4 /dev/mapper/loop0p2 mount_target/

1

如果您的目标是浏览或修改分区(文件系统)的内容,则此命令行会将sd卡转储my_sdcard_dump.img的文件系统安装到目录mount_dir中

part_id=2; INFILE=my_sdcard_dump.img; MOUNTPT=mount_dir PARTITION=${part_id}; sudo mount "$INFILE" "$MOUNTPT" -o loop,offset=$[ `/sbin/sfdisk -d "$INFILE" | grep "start=" | head -n $PARTITION | tail -n1 | sed 's/.*start=[ ]*//' | sed 's/,.*//'` * 512 ]

0

处理具有多个分区的整个磁盘的映像非常棘手。Linux并非旨在从常规文件中读取分区表,即使连接到回送设备也是如此,因此您必须仔细识别分区的偏移量并将其传递给mount命令。

最好的方法是为每个分区创建单独的映像:

sudo dd if=/dev/sdf1 of=/home/myusername/raspberry-backup-sdf1-2014-04-10.img
sudo dd if=/dev/sdf2 of=/home/myusername/raspberry-backup-sdf2-2014-04-10.img

现在,您可以轻松地将这些文件视为磁盘上的单个分区,通过将它们映射到循环设备,像平常实际磁盘分区一样装入它们。循环设备或回送设备是为Linux提供转换层以将文件视为块设备(如磁盘或分区)的虚拟设备。

回路设备通常/dev/loop0通过/dev/loop8。使用以下losetup命令标识未使用的环路设备:

$ sudo losetup /dev/loop0
loop: can't get info on device /dev/loop0: No such device or address

该响应指示未分配的环路设备。现在,我们可以将循环设备分配给我们的图像文件之一:

$ sudo losetup /dev/loop0 /home/myusername/raspberry-backup-sdf1-2014-04-10.img

该命令没有输出表示成功。现在/dev/loop0,在大多数情况下,其功能/dev/sdf1与您的SD卡相同,您可以照常安装它:

sudo mount -t vfat /dev/loop0 /media/sdimage-1

使用另一个循环设备重复该过程,以挂载另一个分区。完成后,卸载文件系统并取消分配循环设备:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0

我想避免创建两个图像文件,因为除其他一些次要原因外,我想将图像分发给其他人,以便他们可以使用它来初始化其SD卡。因此,不同的分区(如/ boot等)必须位于一个文件中。
MrD 2014年
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.