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для чтения блоков по 64 МБ. Вы можете попробовать увеличить это до 128 МБ или даже 256 МБ, но учтите, что это не обязательно увеличит пропускную способность.

В вашем конкретном случае ваш исходный раздел на самом деле является томом 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

Если объем скопированного устройства превышает 342 ГБ, скорее всего, на этом диске есть поврежденный сектор.

Для возобновления можно использовать seekи с одинаковыми значениями.skip

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

68424скорее всего, снова выдаст ту же ошибку ввода-вывода, поэтому вам придется увеличить его. Вы не сказали, какой размер блока вы использовали (и мне лень заниматься математикой), для пропуска меньших областей ошибок вы можете предпочесть меньший размер блока (тогда вам придется адаптироваться seekи skipсоответственно).

Не используйте conv=noerror,это портит вещи. Если вы столкнулись с большим количеством ошибок, используйте ddrescue, это инструмент, который обрабатывает ошибки чтения лучше, чем dd.

Связанный контент