![dd вылетает - что с этим делать](https://rvso.com/image/89177/dd%20%D0%B2%D1%8B%D0%BB%D0%B5%D1%82%D0%B0%D0%B5%D1%82%20-%20%D1%87%D1%82%D0%BE%20%D1%81%20%D1%8D%D1%82%D0%B8%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C.png)
У меня 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
.