为什么我的 dd 完整磁盘复制在 8 GB 时仍然失败?

为什么我的 dd 完整磁盘复制在 8 GB 时仍然失败?

我正在尝试将 500 GB SSD 克隆到 1TB SSD。由于某种原因,当复制的数据达到8GB时,它不断失败。这是我尝试过的第三个 1TB SSD,它们都卡在同一个地方。我运行了以下命令:

dd if=/dev/sda of=/dev/sdb bs=1024k status=progress

我还尝试使用 Clonezilla 克隆驱动器,但在同一位置失败。我使用 GParted 重新格式化驱动器并将其设置为 EXT4 文件系统,但它仍然卡在同一位置。 Sda是内部的,sdb是外部插入的。

我收到的错误说:

7977443328 bytes (8.0 GB, 7.4 GB) copied, 208s, 38.4 MB/s
dd: error reading '/dev/sda': Input/output error
7607+1 records in
7607+1 records out

感谢@roaima 在下面的回答。我能够运行ddrescue并且它复制了大部分数据。我取出内部 SSD,并通过 USB3 将新旧 SSD 连接到 CentOS 盒子。我运行了以下命令:

ddrescue -v /dev/sdb /dev/sdc tmp --force

它运行了超过15个小时。一夜之间就停了。但好处是,当我再次运行命令时,它又从上次停止的地方恢复过来。

我使用screen这样我就不会在第二次被锁定在一个会话中:)。我曾经Ctrl+c在 99.99% 的数据被拯救后退出 ddrescue 命令,因为它在那里挂了几个小时。我能够从新驱动器启动并且它立即启动。这是我退出 ddrescue 的状态:

Initial status (read from mapfile)
rescued: 243778 MB, tried: 147456 B, bad-sector: 0 B, bad areas: 0

Current status
     ipos:  474344 MB, non-trimmed:    1363 kB,  current rate:       0 B/s
     ipos:  474341 MB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:  474341 MB, non-scraped:   522752 B,  average rate:   8871 kB/s
non-tried:        0 B,  bad-sector:   143360 B,    error rate:       0 B/s
  rescued:  500107 MB,   bad areas:      123,        run time:  8h  1m 31s
pct rescued:   99.99%, read errors:      354,  remaining time:     14h 31m
                              time since last successful read:      6m  7s
Scraping failed blocks... (forwards)^C
  Interrupted by user

希望这对其他人有帮助。我认为我的旧驱动器开始出现故障。希望没有数据丢失。现在开始调整 LUKS 分区的大小:)

答案1

错误是,,dd: error reading '/dev/sda': Input/output error它告诉你问题是阅读源磁盘而不是写入目标。您可以多次更换目标磁盘,但这并不能解决读取源磁盘的问题。

不要使用dd,而是考虑在数据完全消失之前将数据从磁盘上拯救出来。使用rsync或之类的工具复制文件cp,或者使用ddrescue.

ddrescue -v /dev/sda /dev/sdb /some/path/not/on/sda_or_sdb

最后一个参数指向一个相对较小的临时文件(映射文件),该文件既不在也不/dev/sda/dev/sdb.如果您没有其他东西,它可能位于外部 USB 记忆棒上。

ddrescue命令了解到源磁盘可能有故障。它一次读取相对较大的块,直到遇到错误,此时它会标记该部分以进行更仔细的检查和较小的复制尝试。映射文件用于在源磁盘锁定且系统必须重新启动时允许重新启动和继续。它会尽力复制一切可以复制的东西。

复制磁盘后,您的/dev/sdb分区似乎仅与原始磁盘的大小相对应。之后您可以使用fdiskgparted/parted来解决这个问题。

如果复制数据时出错,您应该首先使用该fsck系列之一来检查并修复分区。例如,e2fsck -f /dev/sdb1

答案2

源介质上存在错误,并且 dd 默认情况下会在出现第一个错误时停止。复制部分损坏的源媒体的规范解决方案包括为其提供“conv=noerror,sync”选项。这告诉它忽略坏位,用空值替换它们,然后继续。在这种情况下,您使用的块大小应该与文件系统的块大小相匹配,否则一个有点坏的“扇区”将取出整个 dd 块。 (除了源介质上的坏数据之外,您还会丢失其他数据。)

所以,虽然 dd做这项工作,并且已经被用来做这件事几十年了,可能还有其他更适合的工具。

相关内容