Интерпретация dd Ошибка ввода / вывода

Я попытался скопировать /dev/Storage/Storage (LV под LVM) в файл изображения с помощью dd | pv | dd dd | pv | dd dd | pv | dd . dd сообщила об ошибке, и я хочу знать, закончил ли dd копирование моего диска или остановился из-за ошибки. Я не уверен, так как он дал мне два разных выхода: один с ошибкой наверху и один без. Я бы предположил и сказал, что это не так, потому что между двумя есть только дополнительные 0,1 секунды и никаких дополнительных данных, но я не уверен, что это так или нет. /dev/Storage/Storage – это 1 ТБ диск (терабайт = 10 12 = 1000 4 ) или 931,51 гигабайта (gibibyte = 2 30 = 1024 3 ) или 1953513472 секторов. Файловая система на диске испорчена и не работает должным образом.

 $ sudo dd if=/dev/Storage/Storage | pv | dd of=Storage.img dd: error reading '/dev/Storage/Storage': Input/output error ] 1627672400+0 records ins] [ <=> ] 1627672400+0 records out 833368268800 bytes (833 GB) copied, 75181 s, 11.1 MB/s 776GB 20:53:01 [10.6MB/s] [ <=> ] 1627672400+0 records in 1627672400+0 records out 833368268800 bytes (833 GB) copied, 75181.1 s, 11.1 MB/s 

  • Вы используете размер блока размером 512 байтов по умолчанию. Вы значительно улучшили бы производительность, используя больший размер блока, скажем 128k или даже 1m .

  • Есть два выхода, потому что вы выполняете две команды dd , первый из которых является устройством чтения устройства, и он показывает ошибку ввода-вывода.

  • Вероятно, вы используете LVM, используя имя устройства, которое вы используете: /dev/Storage/Storage . Вы уверены, что это весь диск, а не подмножество? Используйте lvdisplay чтобы выяснить, что стоит за этим именем устройства.

Просмотрите сообщения журнала ядра ( dmesg или /var/log/kern.log ) для получения более подробных сообщений от драйверов SATA, если это была аппаратная ошибка. Также полезно: smartctl -x /dev/sda . Если это была просто попытка прочитать конец раздела или что-то еще, это может также отображаться в журнале ядра.

Чтобы заставить dd продолжать работу после ошибки ввода-вывода, чтобы прочитать прочитанные части, которые следуют за ошибкой, используйте

 dd if=... of=... conv=noerror bs=128k # it doesn't get any faster beyond about 128k, because of L2 cache size 

(Как упоминалось в комментариях к OP, ddrescue имеет это и более. conv=noerror был добавлен в GNU dd после существования ddrescue , IIRC.)

Если вы хотите conv=notrunc где вы остановились, вы можете использовать параметры seek и conv=notrunc с помощью conv=notrunc .


Если вы действительно хотите увидеть, как далеко по дд, посмотрите на позицию файла его stdin:

 cat /proc/$(pidof dd)/fdinfo/0 # dd opens its infile as fd #0 

(или ls -lh размер выходного файла). Копирование всего объема данных с жестким диском 2 раза больше, пробивая его через что-то, кажется мне глупым, так как он просто сделает ваш компьютер немного медленнее, чем нужно, на часы, которые займет копия.

Или, по крайней мере, выполните:

 dd if=... conv=noerror bs=128k | pv > Storage.img 

У меня была одна и та же проблема, и ни одна из обучающих программ или SO-сообщений о dd специально не помогала в моей конкретной форме этой проблемы. После некоторого рытья я нашел этот вопрос . Это решение действительно сработало для меня.

Вот пример вашего варианта использования:

 $ sudo apt-get install gddrescue $ sudo ddrescue /dev/Storage/Storage Storage.img | pv 

Общая форма:

 $ sudo ddrescue <in_file> <out_file> 

и, конечно же, | pv | pv если вы хотите подключить stdout к инструменту мониторинга прогресса.