如何安装用dd创建的SD卡图像?

我使用dd创建了Raspberry Pi SD卡的图像:

 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 

为避免为每个分区创建单独的映像或安装kpartx实用程序,可以通过在mount命令中指定offset来单独装入每个分区。

首先检查映像文件中的分区,然后使用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/ 

经过一些额外的测试后,我自己找到了解决方案: 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/ 

如果您的目标是探索或修改分区(文件系统)的内容,则此命令行会将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 ] 

处理具有多个分区的整个磁盘的映像非常棘手 。 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在大多数情况下function上等同于SD卡的/dev/sdf1 ,您可以像往常一样安装它:

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

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

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