使用 dd 复制 SD 卡时无法准确复制

使用 dd 复制 SD 卡时无法准确复制

我正在尝试复制我的 SD 卡,以便将其移动到我的 64GB SD 卡。我已经使用 Raspberry Pi 的 SD 卡完成了此操作,没有任何问题。

SD 卡包含两个分区:引导(fat32)和Linux的(ext4)

我尝试使用以下方法制作整个 SD 卡的图像:

sudo dd of=Images/orangepi.img if=/dev/sdd bs=1M status=progress

并将其放回 SD 卡上:

sudo dd if=Images/orangepi.img of=/dev/sdd bs=1M status=progress

我无法安装该映像,因为它包含 2 个分区。所以我映像引导Linux的分别使用:

sudo dd of=linux.img if=/dev/sdd2 bs=1M status=progress 
sudo dd of=BOOT.img if=/dev/sdd1 bs=1M status=progress

正如您在我添加的屏幕截图中所看到的,从 SD 卡创建的图像(右侧)与 SD 卡(左侧)不匹配。

我的问题是:为什么会发生这种情况?我该如何制作 SD 卡的正确映像?

左侧是 SD 卡上的 Linux 分区,右侧是已安装的映像

我的 SD 卡主文件夹中有一个名为音乐包含带有 mp3 文件的文件夹。

我的图像有一个名为 x-font.ttf音乐. 文件夹在成像时似乎变成了随机文件。

SD 卡是我的 orangepi PC 的一个可用的 Ubuntu 磁盘,目前正在运行。

$ sudo apt install dcfldd
$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk 
└─sda2   8:2    0 465.8G  0 part /media/Shared
sdb      8:16   0 238.5G  0 disk 
├─sdb1   8:17   0   500M  0 part 
├─sdb2   8:18   0 116.8G  0 part 
├─sdb3   8:19   0 117.3G  0 part /
├─sdb4   8:20   0     1K  0 part 
└─sdb5   8:21   0   3.9G  0 part [SWAP]
sdc      8:32   1   7.5G  0 disk 
├─sdc1   8:33   1    64M  0 part /media/fhfs/BOOT
└─sdc2   8:34   1   7.4G  0 part /media/fhfs/linux
sdg      8:96   0 465.8G  0 disk 
└─sdg1   8:97   0 465.8G  0 part /media/fhfs/0c91eeb6-7199-47b6-a603-04432a091fdc
sr0     11:0    1  1024M  0 rom  
**ls -lha /dev | grep sd**
brw-rw----   1 root disk        8,   0 Oct 18 14:54 sda
brw-rw----   1 root disk        8,   2 Oct 18 14:54 sda2
brw-rw----   1 root disk        8,  16 Oct 18 14:54 sdb
brw-rw----   1 root disk        8,  17 Oct 18 14:54 sdb1
brw-rw----   1 root disk        8,  18 Oct 18 14:54 sdb2
brw-rw----   1 root disk        8,  19 Oct 18 14:54 sdb3
brw-rw----   1 root disk        8,  20 Oct 18 14:54 sdb4
brw-rw----   1 root disk        8,  21 Oct 18 14:54 sdb5
brw-rw----   1 root disk        8,  32 Oct 20 18:11 sdc
brw-rw----   1 root disk        8,  33 Oct 20 18:11 sdc1
brw-rw----   1 root disk        8,  34 Oct 20 18:11 sdc2
brw-rw----   1 root disk        8,  48 Oct 18 14:54 sdd
brw-rw----   1 root disk        8,  64 Oct 18 14:54 sde
brw-rw----   1 root disk        8,  80 Oct 18 14:54 sdf
brw-rw----   1 root disk        8,  96 Oct 18 14:54 sdg
brw-rw----   1 root disk        8,  97 Oct 18 14:54 sdg1

$ sudo dcfldd if=/dev/sdc2 of=linuxdcfl.img hash=md5,sha1 hashlog=hashlog.txt
242944 blocks (7592Mb) written.
243056+1 records in
243056+1 records out
**sudo dcfldd if=/dev/sdc2 vf=linuxdcfl.img verifylog=verify.log**
0 - 0: Mismatch
Total: Mismatch

我尝试了dcfldd一下,结果不匹配,但是没有错误日志。verify.log是空的。hashlog只有 sha 和 md5 总和。

答案1

dd长期以来一直致力于创建精确的位重复。diff可以很容易地证明这一点

注意:您没有提到您正在运行哪个版本的 Ubuntu。唯一不同的原因是状态开关的使用发生了变化。

Ubuntu 14.04 摘录自man dd

 status=WHICH
              WHICH info to suppress outputting to stderr; 'noxfer' suppresses
              transfer stats, 'none' suppresses all

Ubuntu 16.04 摘录自man dd

status=LEVEL
              The  LEVEL of information to print to stderr; 'none' suppresses everything but error messages, 'noxfer' suppresses
              the final transfer statistics, 'progress' shows periodic transfer statistics

除此之外,我能想到的唯一会导致图像文件的位模式与源文件不同的原因是:

用户错误:

A)尝试对已安装的分区进行映像处理(这是一个非常糟糕的主意)

B) 未能sync在内核缓冲区中留下数据。

或者

硬件故障:

C) 存储映像的磁盘上存在故障区域。这意味着驱动器即将发生故障(我希望您有备份,如果没有,请立即备份!)

D)连接不稳定,导致源媒体设备或目标媒体设备的连接性较差

你应该检查智能状态存储图像的驱动器。

导致不匹配的事实dcfldd让我相信您的电缆或存储介质出现故障(无论是在输入介质还是输出介质上)

答案2

这是关于 SD/microSD 芯片多么脆弱的评论。

我使用了上面的评论坏块^^ 测试 2 个新的 512GB microSD 芯片。考虑到它们的尺寸,我选择了 USB 3.0 读卡器,将其连接到 USB 3.0 端口。芯片很热,真的然后我使用磁盘确认其速度,使用我的标准测试1000样本(而不是标准的 100),同样在 USB 3.0 读卡器/3.0 端口上。1 通过了,另一个得到了 ~600 个样本,写入速度从 ~90 MB/s 降至 20 MB/s 以下。写入速度没有变回,所以我认为我“烧毁”了^由于 USB 3.0 端口上有可用的电源,因此该芯片

鉴于坏块是一个密集的、全磁盘的写入/读取过程,需要很长时间。我建议使用 USB 2.0 读卡器,或者最好在 USB 2.0 端口上使用 USB 3.0 读卡器,以尽量减少烧坏大型(昂贵)芯片的可能性。这会花费更长的时间,但那又怎样。然后我建议使用标准 磁盘100 个样本用于基准测试(USB 3.0 读卡器/USB 3.0 端口)。

我(不幸)使用了一些较小的 128GB microSD 芯片来确定上述程序。其中大部分芯片因未通过我的测试而被退回。这些芯片甚至不如 USB 3.0 拇指驱动器那么坚固,因此请谨慎购买。

^ 顺便说一句,如果您使用的是 USB 3.0 读卡器/USB 3.0 端口,并且您的芯片比同等尺寸的其他芯片所花费的时间更长,那么它可能已经被“烧毁”了。

^^摘自我从以下评论中了解到 badblocks 的用法:

在目标 SD 卡上运行 sudo badblocks -s -w /dev/sd#' 以运行写入模式模式测试。对 /dev/sd# 要非常小心。'badblocks -w' 是破坏性的!您可能需要根据 'ls -l /dev/disk/by-id/' 验证 /dev/sd#,以确保您拥有正确的块设备。

答案3

是的,就是你使用以下方式挂载映像中的分区kpartx

sudo apt install kpartx
cd Images 
sudo kpartx -a orangepi.img

它将在 /dev/mapper 下创建设备,并且 nautilus 应检测这些设备以允许安装其各自的分区。

要删除 /dev/mapper 下的设备,请在卸载分区后,

cd Images
sudo kpartx -d orangepi.img

至于为什么您的情况中的分区不同,我不知道您做了什么才导致这样的结果。它应该是相同的。

答案4

图片中两个文件列表的 .xsession-errors 文件日期和大小完全不同。'dd' 无法做到这一点,否则整个文件系统将变得面目全非。

您不应在已安装的文件系统上使用 dd。大多数系统在您插入 SD 卡后就会自动安装,因此很难避免这种情况。

使用“df”和“dmesg”查找 SD 卡的 /dev/sd_#。警告:如果 SD 卡上有多个分区,则可能存在多个分区。

sudo umount /dev/sd_#

卸载 SD 卡,但它仍将连接并且不会被弹出。

再次运行“df”来验证它已被卸载。

您现在可以使用“dd”来读取或写入整个 SD 卡(原始海报的第一对“dd”)。

告诉系统弹出 SD 卡。[在 Ubuntu 16.04 中,右键单击 SD 卡并选择“弹出父驱动器”。他们真的应该添加“安装”和“卸载”选项] 如果您找不到弹出选项,请运行“同步”并等待提示返回以刷新写入缓冲区,然后再移除 SD 卡。

相关内容