使用dd命令进行SD卡克隆

我正在尝试克隆一张可能包含多个分区的SD卡,其中一些分区Ubuntu无法识别。通常情况下,我希望克隆整个卷,而不仅仅是某些分区。因此,我挂载了SD卡并在日志查看器中看到类似以下内容:

kernel: [  262.025221]  sdc: sdc1 sdc2

alex@u120432:~$ ls /dev/sdc*
/dev/sdc  /dev/sdc1  /dev/sdc2

由于我想要复制整个磁盘,所以我执行以下操作:
dd if=/dev/sdc of=sdimage.img bs=4M

文件sdimage.img,大小7.9 GB(7,944,011,776 字节),已创建(SD卡为8 GB)。现在我插入另一张SD卡并执行以下操作:
dd if=sdimage.img of=/dev/sdc bs=4M

问题是第二个dd命令在某个阶段挂起,永远无法成功。之后,我无法重新启动或关闭计算机,只能直接切断电源。
这是正确的方法吗?也许还有其他克隆SD卡的方式吗?
操作系统:Ubuntu 12.04(Precise Pangolin),32位。

你能挂载创建的镜像文件并查看它是否正确创建了吗? - Milan Todorovic
@MilanTodorovic - 我该怎么做? - Alex F
如果我记得正确的话:使用命令“mount -o loop sdimage.img /path/to/mount”将sdimage.img文件挂载到指定路径。然后检查是否能够正确浏览img文件。 - Milan Todorovic
@MilanTodorovic:我尝试了sudo mount -o sdimage.img /dev/mydisk,结果显示:mount: can't find /dev/mydisk in /etc/fstab or /etc/mtab。可能需要在之前创建一些dev条目。你能否以回答的形式发布这个问题,并附上一些详细信息?谢谢。 - Alex F
尝试使用sudo mount -o loop sdimage.img /dev/mydisk(你忘记在-o后面加上loop) - Milan Todorovic
@MilanTodorovic:mount:挂载点/dev/mydisk不存在(这次使用循环)。 - Alex F
让我们继续在聊天中进行这个讨论 - Milan Todorovic
1你不应该在已挂载的设备上使用dd。先卸载所有分区,然后你的命令应该可以执行。 - ubfan1
@ubfan1 - 谢谢,你的建议有效。请将其发布为答案,我会接受的。 - Alex F
在复制过程中,bs=4M的值需要保持一致吗? - daparic
如果你不坚持使用 dd,那么你可以运行Gnome Disks,它可以让你随意挂载/卸载设备,并且可以从任何设备创建镜像文件。 - Ondra Žižka
5个回答

插入原始SD卡并检查设备的名称(通常为mmcblkXsdcX):
sudo fdisk -l

你可能会看到:
Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *       2048  2099199  2097152    1G  c W95 FAT32 (LBA)
/dev/mmcblk0p2      2099200 31116287 29017088 13.9G 83 Linux

在我的情况下,SD卡是/dev/mmcblk0*p1*p2是分区)。
现在你需要卸载设备:
sudo umount /dev/mmcblk0

现在来创建设备的图像:
sudo dd if=/dev/mmcblk0 of=~/sd-card-copy.img bs=1M status=progress

这需要一些时间。

完成后,插入空的SD卡。如果设备不同(USB或其他类型的SD卡读卡器),请验证其名称并确保卸载它:

sudo fdisk -l
sudo umount /dev/mmcblk0

将图像写入设备:
sudo dd if=~/sd-card-copy.img of=/dev/mmcblk0 bs=1M status=progress

写操作比以前慢得多。

16在复制大量数据时,您应该设置一个比默认块大小更大的块大小,否则您可能需要等很长时间。 sudo dd if=/dev/mmcblk0 of=~/sd-card-copy.img bs=4M 当复制大量数据时,您应该设置一个比默认块大小更大的块大小,否则您可能需要等很长时间。 - xaedes
我们可以将结果为sd-card-copy.img的文件复制到同一张存储卡上吗? - Ciasto piekarz
3dd命令中真的很让人烦恼的一件事是,默认情况下没有任何输出。你可以通过在命令末尾添加status=progress来改变这一点。 因此,它将变为:sudo dd if=/dev/mmcblk0 of=/media/data/sd-card-copy.img status=progress - desmond13
1注意:在我的情况下,设备的名称是sdc,而不是像这个答案中写的sdcX,因为sdcX被用于分区,例如分区被命名为sdc1sdc2。至少这个答案帮助我通过使用/dev/sdc而不是/dev/sdc1来使dd命令工作。 - baptx

你不应该在挂载的设备上使用dd命令。首先卸载所有分区,然后再执行你的命令就可以了。

3为什么对我来说是相反的呢?我使用的是Ubuntu 12.10,这个命令只在挂载了分区的情况下才有效... - Luca Davanzo
3@Velthune 你确定吗?如果是的话,我建议你自己提出问题。 - Vreality

我正在使用dd工具克隆带有多个分区的USB闪存盘,这是我的命令:
sudo dd if=/dev/sdb of=/dev/sdc bs=4096 conv=notrunc,noerror

notrunc - 不截断输出文件
noerror - 在读取错误后继续执行


2@PeterMortensen 是的,许多人使用那种四合一的适配器。 - Teque5

dd还可以,但我更喜欢cat /dev/sdc/ > ~/backup.iso这种方式。如果你想再次将其放入SD卡中,只需运行cat ~/backup.iso > /dev/sdc即可。

两个SD卡都是8GB的。可以使用cat命令制作SD卡镜像,但如果要制作另一个SD卡,应该使用dd命令,对吗? - Alex F

以下是我在Ubuntu上成功恢复映像文件(在我的情况下为~/raspberrypi2.img)到新SD卡的步骤(受Alon上面的回复的启发):
  1. 通过读卡器插入微型SD卡。
  2. 打开磁盘应用程序。
  3. 快速格式化整个卡(而不是特定的分区)。
  4. 关闭磁盘应用程序。
  5. 打开终端并执行:

    sudo fdisk -l
    
相关输出(显示整个卡片由于快速格式化而没有分区):
Disk /dev/sdb: 7.4 GiB, 7948206080 bytes, 15523840 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 
Disklabel type: dos 
Disk identifier: 0x6957f2f2

sudo dd if=~/raspberrypi2.img of=/dev/sdb

这个步骤需要几分钟的时间(即使是在USB3上也是如此)。请确保不要通过任何调用挂载的操作(例如打开文件或磁盘应用程序)来中断它。
感谢大家的回答。