Этот ответ исследует поведение ddrescue
для решения основного вопроса. Если вы не заинтересованы в процедуре тестирования, то можете перейти к моим выводам и интерпретации ближе к концу.
Testbed
$ uname -a Linux foo 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/issue Ubuntu 14.04.5 LTS \n \l $ ddrescue -V GNU ddrescue 1.17 …
Файловая система btrfs; это не должно иметь значения, если оно поддерживает разреженные файлы.
тестирование
Сначала я получил 8 МБ случайных данных:
dd if=/dev/urandom of=random.chunk bs=1M count=8
Затем я сделал это петлевое устройство и вспомнил его название:
loopdev=`sudo losetup -f --show random.chunk`
Затем я создал еще одно устройство, которое состояло из
- кусок 0: не читается, 1 МиБ
- кусок 1: нули, 2 МиБ
- кусок 2: не читается, 4 МиБ
- кусок 3: данные от
random.chunk
, 8 МиБ - кусок 4: не читается, 16 МиБ
Код ( здесь используется синтаксис документа ):
sudo dmsetup create mydevice << EOF 0 2048 error 2048 4096 zero 6144 8192 error 14336 16384 linear $loopdev 0 30720 32768 error EOF
Я подтвердил, gdisk -l /dev/mapper/mydevice
что общий размер составляет 31 МиБ, как и должно быть.
Фактическое чтение выполняется с помощью:
ddrescue /dev/mapper/mydevice normal.raw normal.log ddrescue -R /dev/mapper/mydevice normalR.raw normalR.log ddrescue -S /dev/mapper/mydevice sparse.raw sparse.log ddrescue -RS /dev/mapper/mydevice sparseR.raw sparseR.log
И результаты ls -hls *.raw
являются
10M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 normal.raw 10M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 normalR.raw 8.0M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 sparse.raw 8.0M -rw-rw-r-- 1 kamil kamil 15M Sep 10 00:37 sparseR.raw
Чтобы быть уверенным, я подтвердил, cmp
что все четыре файла идентичны, когда вы читаете их. Четыре файла журнала содержали одну и ту же карту ошибочных и исправных секторов.
Заметить, что
- 15 МиБ означает, что последний кусок отсутствует;
- 10 MiB обозначает кусок 1 и кусок 3;
- 8 MiB указывает только блок 3.
очищающий
sudo dmsetup remove mydevice sudo losetup -d $loopdev unset loopdev rm random.chunk normal.raw normal.log normalR.raw normalR.log sparse.raw sparse.log sparseR.raw sparseR.log
Выводы
- Когда дело доходит до размера файла, не имеет значения, читаете ли вы в reverse (
-R
) или нет. - Непонятный кусок в самом конце входного файла не влияет на общий размер выходного файла.
- Непонятные фрагменты, которые вносят вклад в общий размер файла, всегда редки (если целевая файловая система поддерживает это, конечно).
-S
Опция влияет только на блоки нулей, которые были фактически считанных из входного файла.
интерпретация
Выше были факты. Этот раздел больше похож на мое мнение.
Похоже, ddrescue
пытается сохранить ваше дисковое пространство всякий раз, когда он может сделать это без дополнительной работы. При использовании -S
инструмента необходимо выполнить некоторые вычисления, чтобы проверить, является ли данный блок данных всеми нулями. Если есть ошибка чтения, ему не нужно ничего вычислять, это может сделать фрагмент разреженным в выходном файле без затрат.
Решение
Вы написали:
используя
-R
переключатель («реверс») вначале, полагая, что он сразу выделит весь размер входного жесткого диска
Мы только что увидели, что это ложное предположение. На самом деле вы описали, что -p
делает. ddrescue -p
предварительно выделит место на диске для выходного файла. Когда я делал это во время моих тестов, выходной файл имел 31 МБ и не был разреженным (даже с -S
).