Я создаю сжатый образ внутреннего диска ноутбука на внешний USB-диск с помощью системы LiveCD GNU/Linux. Также я использую PV для мониторинга прогресса. Вот как выглядит команда:

dd if=/dev/sda bs=8M conv=noerror,sync | pv -pterab -s 298G /
| gzip -c --fast > /mnt/backup/image.dd.bz

USB-накопитель ADATA HD710. Я знаю, что у этих накопителей, как правило, очень слабый USB-штекер - он может легко отключить диск, если я его переместлю. Процесс, кажется, занимает больше времени, чем я ожидал, и я боюсь, что мне придется переместить ноутбук и диск. Я боюсь, что это отключит диск, остановит процесс дублирования и заставит меня сделать это снова и снова.

Я уже проверил, могу ли я отключить диск после приостановки процесса (с помощью комбинации клавиш Ctrl+Z). Это можно сделать только в "ленивом" режиме, что означает, что диск на самом деле не размонтирован, он только отсоединен от его dir монтирования. Я подождал, пока накопитель не закончил работу (перестал мигать его светодиод), и отключил его. Я снова подключил его, подключил к тому же каталогу, к которому он был подключен ранее, и возобновил процесс командой

fg 1

Gzip завершил работу с ошибкой ввода / вывода.

Зачем? Я не мог размонтировать диск, даже если dd был остановлен, потому что ядро знало, что оно открыло файл на этом диске. После того, как я удалил диск, открытый файл должен был быть закрыт, но не открылся для доступа к процессу Gzip после того, как я снова смонтировал диск. Поэтому, когда Gzip пытался продолжить запись, он получил ошибку ввода-вывода, потому что ядро отказало в доступе к файлу (что было неожиданно).

Я также попытался остановить процесс, добавив skip = X (где X - количество записей, которые dd-отчеты записали после его выхода) и добавив остаток образа диска в файл dd.gz. Однако gunzip выходит с ошибкой, говорящей:

gzip: data.dd.gz: invalid compressed data--format violated

Я думаю, это может сработать, если изображение не будет сжато.

Можно ли остановить процесс (с помощью сочетания клавиш Ctrl+C) и продолжить, добавляя ранее созданный файл? Как сопоставить позиции файла? Будут ли правильно извлечены два сцепленных архива Gzip для восстановления диска из сжатого образа?

1 ответ1

0

Как уже отмечалось, вы можете использовать ddrescue.

Однако вы можете просто добавить файл gzip. Т.е. дд - счет 8 | gzip> foo.gz, затем dd --skip 8 | gzip >> foo.gz просто работает. Объединенный файл будет просто извлечен во входной файл.

Для первого случая, который вы описываете: обычно Linux старается не нарушать текущие процессы, сохраняя диск подключенным до тех пор, пока он используется. Однако, если вы принудительно отключите диск, правильный способ - сообщить об ошибке ввода-вывода приложению. Традиционный способ Unix связать открытый файл с аналогом на диске - не по пути, а по номеру inode. При последующем использовании этот индекс может быть повторно использован совершенно другим файлом, или индекс может вообще не быть файлом. Сама идея сохранения открытых файлов после отделения резервного блока сомнительна: файлы могли быть изменены, поэтому сохраненное состояние может быть бессмысленным. С другой стороны, есть хороший случай «быстрого сбоя» и уведомления приложения о сбое диска, чтобы он мог предпринять действия, которые в этом случае сводятся к остановке процесса сжатия.

Второй случай касается вопроса о том, когда вы остановите gzip. Приведенный выше рабочий пример позволяет gzip записывать в файл столько данных, сколько ему нужно. С другой стороны, когда вы приостанавливаете процесс или прерываете его, полученный файл никогда не будет действительным файлом gzip. Это связано с тем, что последнее, что gzip записывает в файл, это контрольная сумма несжатых данных. Хотя это помогает обнаруживать ошибки в файле, это не помогает сделать gzip прерываемым.

TL; DR: нет, это невозможно.

Смотрите: http://www.gzip.org/recover.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .