dd пробегает конец устройства ввода
Я пытаюсь использовать 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
На этой последней итерации он должен был пройти далеко от конца привода, но он продолжал работать. Клон монтируется, но явно повреждены и отсутствуют данные.
- Что-то не так с моей математикой или аргументами, которые я использовал
dd
? - Есть ли лучший способ написать команду 'dd', чтобы получить данные кусками по 10 ГБ?
Ответы
Проблема в том, что вы предполагаете, что seek
принимает байтовое значение, тогда как на самом деле требуется счетчик блоков. Вы должны использовать seek=0
, 78125
, 156250
и т.д.
Однако вы можете значительно упростить его, избавившись от dd
:
split -b 10G < /dev/sdd
Я пытаюсь использовать dd для клонирования отремонтированного мной жесткого диска
Не надо.
Используйте ddrescueвместо него, который хорошо справляется с нечитаемыми блоками и другими ошибками мультимедиа.
Я обнаружил, что причиной неудачного решения было непонимание того, что делает флаг поиска. Это было только смещение места записи на выходном диске. Таким образом, скрипт снова и снова копировал первые 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
), являются лучшим способом восстановить поврежденные диски и выполнить сегментированные передачи соответственно.