![使用 dd 复制 SD 卡时无法准确复制](https://linux22.com/image/994674/%E4%BD%BF%E7%94%A8%20dd%20%E5%A4%8D%E5%88%B6%20SD%20%E5%8D%A1%E6%97%B6%E6%97%A0%E6%B3%95%E5%87%86%E7%A1%AE%E5%A4%8D%E5%88%B6.png)
我正在尝试复制我的 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 卡主文件夹中有一个名为音乐包含带有 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 卡。