如何使用DD从磁盘映像克隆分区?


9

我有一个磁盘映像,它是一个“整个”磁盘映像,例如,包含多个分区,并且我只想将其中一个分区(而不是第一个分区)克隆到外部驱动器上具有多个分区的分区上(我也没有将其克隆到磁盘的第一个分区上...)

FDisk的映像处理如下:

#fdisk -l 2013-02-09-wheezy-raspbian.img 

磁盘2013-02-09-wheezy-raspbian.img:1939 MB,1939865600字节
255个磁头,63个扇区/磁道,235个圆柱体,总计3788800个扇区
单位= 1 * 512的扇区= 512字节
扇区大小(逻辑/物理):512字节/ 512字节
I / O大小(最小/最佳):512字节/ 512字节
磁盘标识符:0x00014d34

                         设备启动开始端块ID系统
2013-02-09-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32(LBA)
2013-02-09-wheezy-raspbian.img2 122880 3788799 1832960 83 Linux
#

块设备如下所示:

#fdisk -l / dev / sdc

磁盘/ dev / sdc:8014 MB,8014266368字节
247个喷头,62个扇区/磁道,1022个圆柱体,总计15652864个扇区
单位= 1 * 512的扇区= 512字节
扇区大小(逻辑/物理):512字节/ 512字节
I / O大小(最小/最佳):512字节/ 512字节
磁盘标识符:0x00000000

   设备启动开始端块ID系统
/ dev / sdc1 2048 131071 64512 e W95 FAT16(LBA)
/ dev / sdc2 131072 15652863 7760896 83 Linux
#

我希望图像的第二个分区替换块设备的第二个分区。不用担心尾随的损坏的可用空间,我将使用GParted进行清理,无论如何我都需要它。


确切指定要克隆分区的位置以及映像文件的位置!
fromnaboo

Answers:


8
# losetup --find --show --partscan --read-only 2013-02-09-wheezy-raspbian.img
/dev/loop7
# dd if=/dev/loop7p2 of=/dev/narnia bs=1M

如果--partscan不起作用,也可以使用以下之一:

# partx -a /dev/loop7
# kpartx /dev/loop7

或类似的分区映射解决方案。

您可能应该首先安装它,只是看它是否正确。

当然,你也可以阅读fdisk的输出,并给予ddskip=131072或什么的,直接的,即使其跳过输入的很多块,这样它开始于所在的分区所在阅读; 但是最好看到带有循环设备的实际分区。


您的losetup命令无效-表示无法识别的选项--find。我删除了它,说它不认识--show。脱掉它引起了抱怨--partscan,这时我意识到命令不会很快对我做任何事情。我决定尝试其他方法,但都尝试partxkpartx返回“找不到命令”。
JamesTheAwesomeDude

我会跑步dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc skip=122880,但是那回来了dd: ‘2013-02-09-wheezy-raspbian.img’: cannot skip: Invalid argument
JamesTheAwesomeDude

1
skip取决于bs,因此,如果您使用了bs=1M(或具有执行此操作的别名),那将解释为什么它不起作用。尝试一下bs=512。另外,为什么fdisk说131072时是122880?我的失败也是losetup from util-linux 2.22.2。对于partx也是一样。kpartx来自多路径工具(使用的设备映射器)。
frostschutz

kpartx用于LVM。 partprobe也可以从分装的包装中完成这项工作。
psusi

@frostschutz从图像文件的开头起12280字节。
JamesTheAwesomeDude13年

0

这样的事情应该起作用:

dd if=/path/to/2013-02-09-wheezy-raspbian.img2 of=/dev/sdc2 bs=4096 conv=notrunc,noerror

if =设置要克隆的图像

of =设置您要在其中克隆映像的目标分区


1
我得到了预期的错误:dd: opening ‘2013-02-09-wheezy-raspbian.img2’: No such file or directory
JamesTheAwesomeDude

您是否将/path/to/2013-02-09-wheezy-raspbian.img2替换为图像文件的真实路径?:|
fromnaboo

1
**** facepalm ****是的,就像您说的那样,我只是将2附加到末尾。
JamesTheAwesomeDude

这行不通,dd在这样的图像文件上看不到分区
Michal Artazov

0
  1. 将映像挂载为回送设备: losetup -fP yourImage.img
  2. 您现在可以直接访问映像的每个分区。如果必须使用dd,您可以做dd if=/dev/loop0p1 of=image.img,但我认为您会cat更好。在root shell中,只需执行cat /dev/loop0p1 > image.img。两个示例均假定您需要第一个分区,并且分配给您的环回设备是/dev/loop0
  3. 完成环回设备的操作后,您可以使用分离它losetup -d /dev/loop0。再次假设这/dev/loop0是您的回送设备。

0

您可以这样做:

sudo partx --add -v 2013-02-09-wheezy-raspbian.img 
# time sudo dd if=/dev/loop0p1 |pv -s 80M |sudo dd of=/dev/sdc1
time sudo dd if=/dev/loop0p2 |pv -s 4G |sudo dd of=/dev/sdc2
sudo partx --delete -v /dev/loop0

0

您可以使用此仅将第二个分区复制到单独的映像

dd if=2013-02-09-wheezy-raspbian.img of=second.img bs=512 skip=122880

然后,您可以复制它代替磁盘上的分区

dd if=second.img of=/dev/sdc2 bs=512

或者你甚至可以用一个命令

dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc2 bs=512 skip=122880

只需确保在写入之前先卸载/ dev / sdc2。

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.