Я попытался скопировать /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
к инструменту мониторинга прогресса.