dd пробегает конец устройства ввода

Aug 18 2020

Я пытаюсь использовать ddдля клонирования отремонтированного мной жесткого диска. Я пытаюсь ddскопировать данные с диска кусками по 10 ГБ, однако он передает больше данных, чем должен содержать диск. Сам накопитель функционирует, и перегородку на нем можно смонтировать.

С помощью df -hя получил размер диска 1000204886016 байт (диск 1 ТБ).

Сначала я попробовал:

sudo dd if=/dev/sdb of=/dev/sdd status=progress

Однако это замедлилось до сканирования примерно после 300 ГБ и в конечном итоге не удалось из-за ошибки чтения. Я решил попробовать скопировать его кусками по 10 ГБ. Я подсчитал, что чтение 10 ГБ с размером блока 128 КБ требует копирования 78125 блоков.

Для этого я использую:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n

ddсообщал, что каждый раз передавалось 10240000000 байтов. Чтобы вычислить значение поиска для каждой итерации, я суммировал переданные байты и вычитал 1 ГБ, чтобы обеспечить некоторое перекрытие. В результате получается следующая последовательность:

seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000

Я написал их в сценарии оболочки с дискретными командами dd и запустил его. Я оставил последнюю итерацию свободной, чтобы скопировать столько данных, сколько нужно.

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
    ...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000

На этой последней итерации он должен был пройти далеко от конца привода, но он продолжал работать. Клон монтируется, но явно повреждены и отсутствуют данные.

  1. Что-то не так с моей математикой или аргументами, которые я использовал dd?
  2. Есть ли лучший способ написать команду 'dd', чтобы получить данные кусками по 10 ГБ?

Ответы

3 thatotherguy Aug 18 2020 at 02:31

Проблема в том, что вы предполагаете, что seekпринимает байтовое значение, тогда как на самом деле требуется счетчик блоков. Вы должны использовать seek=0, 78125, 156250и т.д.

Однако вы можете значительно упростить его, избавившись от dd:

split -b 10G < /dev/sdd
3 roaima Aug 18 2020 at 06:36

Я пытаюсь использовать dd для клонирования отремонтированного мной жесткого диска

Не надо.

Используйте ddrescueвместо него, который хорошо справляется с нечитаемыми блоками и другими ошибками мультимедиа.

2 alphasierra Aug 21 2020 at 03:06

Я обнаружил, что причиной неудачного решения было непонимание того, что делает флаг поиска. Это было только смещение места записи на выходном диске. Таким образом, скрипт снова и снова копировал первые 10 ГБ в выходной файл. Он никогда не достигнет конца устройства.

Чтобы сместить ввод, также нужно было использовать флаг пропуска:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n

Установка oflag=seek_bytesи iflag=skip_bytesпозволит производить вычисления в байтах, а не в блоках.

Однако варианты, представленные roaima (используйте ddrescue) и другим парнем ( split -b 10G < /dev/sdd), являются лучшим способом восстановить поврежденные диски и выполнить сегментированные передачи соответственно.