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

bla*_*ght 14 linux dd clonezilla gparted

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

dd if=/dev/sda of=/dev/sdb bs=1024k status=progress
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 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
Run Code Online (Sandbox Code Playgroud)

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

ddrescue -v /dev/sdb /dev/sdc tmp --force
Run Code Online (Sandbox Code Playgroud)

它运行了超过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
Run Code Online (Sandbox Code Playgroud)

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

roa*_*ima 46

错误是 ,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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • @blacKnight 你不能 - 它们是坏扇区 (7认同)
  • @blacKnight您至少可以尝试[识别哪些文件已损坏](https://wiki.archlinux.org/title/Identify_damaging_files#Find_damaging_files_2),如果您幸运的话,它们不是超级重要或者可以替换。 (2认同)

小智 7

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

因此,虽然 dd可以完成这项工作,并且几十年来一直被用来完成这项工作,但可能还有其他更适合的工具。