dd 崩溃 - 该怎么办

dd 崩溃 - 该怎么办

dd跑了几个小时后就崩溃了。通常带有类似这样的消息

Input/output error
68424+1 records in
68424+1 records out
342124883968 bytes (342 GB) copied, 5114.68 s, 66.9 MB/s

我能做点什么吗?有什么方法可以使用输出吗?或者从上次中断的地方重新开始?

是否有任何理由认为这是因为正在备份的分区正在被使用?

它总是在 70-80% 左右崩溃,通常是在分区应该较少使用的时候。

由于这个过程需要很长时间,因此很难尝试不同的事情。

我输出到图像。我可能可以使用分区,但涉及 LVM:

sudo lvmdiskscan
/dev/centos/swap [       3.89 GiB] 
/dev/sda1        [     500.00 MiB] 
/dev/centos/root [      50.00 GiB] 
/dev/sda2        [     465.27 GiB] LVM physical volume
/dev/centos/home [     411.38 GiB] 
/dev/sdb1        [     931.51 GiB] 
3 disks
2 partitions
0 LVM physical volume whole disks
1 LVM physical volume


dd conv=sync,noerror if=/dev/centos/home bs=2000000   of=/run/media/ob/X_1T_Media1GHD-PCTU3/c/sd9e22_cel.image
dd: error reading '/dev/centos/home': Input/output error
171062+1 records in
171063+0 records out
342126000000 bytes (342 GB) copied, 4625.3 s, 74.0 MB/s
220856+2 records in
220858+0 records out
441716000000 bytes (442 GB) copied, 6138.1 s, 72.0 MB/s

星期五早上 ddrescue --sector-size=2048 --cluster-size=$((256*512)) --sparse --verbose /dev/centos/home /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd7c_dd.image /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd7c_dd.map

GNU ddrescue 1.18.1 About to copy 441714 MBytes from /dev/centos/home to /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd7c_dd.image Starting positions: infile = 0 B, outfile = 0 B Copy block size: 131072 sectors Initial skip size: 32 sectors Sector size: 2048 Bytes

Press Ctrl-C to interrupt rescued: 441714 MB, errsize: 8192 B, current rate: 0 B/s ipos: 342124 MB, errors: 1, average rate: 60675 kB/s opos: 342124 MB, run time: 2.02 h, successful read: 9 s ago Finished

extundelete sd7c_dd.image --restore-directory /home/ob/p -o /tmp/tt extundelete: Bad magic number in super-block when trying to open filesystem sd7c_dd.image

/dev/mapper/centos-home on /home type xfs (rw,relatime,attr2,inode64,noquota) 

答案1

您永远不应该dd在已安装的文件系统上运行,因为这可能会损坏映像,尤其是。如果你想做备份。您可能想改用tar

如果您确定该设备是不是如果失败,您可以使用seek(用于在输出文件中查找 N 个块)和skip=N(用于跳过输入的 N 个块)标志。在Linux系统上,可以使用该dmesg命令获取当前的内核日志。

如果您不确定要从中复制的设备是否可能出现故障,我建议您使用ddrescue来获取设备的映像。该工具不会因读取错误而中止,并记录无法正确读取的块的位置。

答案2

如果您尝试对正在使用的分区进行映像复制,那么您将面临严重的失败。像这样复制分区需要不写入任何内容。完全没有。

如果您可以静默分区,则可以使用ddrescue,它旨在读取有故障扇区的磁盘和分区。提取/dev/sda1到图像文件的典型调用/media/sda1.img如下所示:

ddrescue --sector-size=2048 --cluster-size=$((64*512)) --sparse --verbose /dev/sda1 /media/sda1.img /media/sda1.map

扇区和簇大小设置ddrescue为读取 64MB 单位。您可能想尝试将其增加到 128MB 甚至 256MB,但请注意这不一定会增加吞吐量。

在您的特定情况下,您的源分区实际上是 LVM 卷,因此这是一个很大的帮助:您可以拍摄要备份的分区的快照。在此示例中,我将其称为home-snap.

lvcreate --snapshot --name home-snap --size 1G /dev/centos/home
ddrescue --sector-size=2048 --cluster-size=$((64*512)) --sparse --verbose /dev/centos/home-snap /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd9e22_cel.image /run/media/ob/X_1T_Media1GHD-PCTU3/c/sd9e22_cel.map
lvremove -y /dev/centos/home-snap

答案3

如果设备大于其复制的 342GB,则该磁盘上很可能存在坏扇区。

您可以使用seekskip具有相同的值来恢复。

dd <your previous options here ...> seek=68424 skip=68424 conv=notrunc

68424很可能会再次产生相同的 I/O 错误,因此您必须增加它。您没有说明您使用的块大小(我懒得做数学),为了跳过较小的错误区域,您可能更喜欢较小的块大小(然后您必须相应地进行调整seekskip

不要使用conv=noerror它会腐蚀事物。如果您遇到更多错误,请使用ddrescue,它是一个比 处理读取错误更好的工具dd

相关内容