Вопрос или проблема
Я использовал gzip
, чтобы сжать изображение, которое все еще довольно велико.
dd if=/dev/sda<n> bs=1M | gzip -c -9 > sda<n>.dd.img.gz
А при попытке распаковать и записать его на прежний раздел
gunzip sda<n>.dd.img.gz >/dev/sdh
(используя >
вместо dd
, как описано здесь, его содержимое сначала записывается в другой файл (вместо того, чтобы напрямую записываться на раздел, как я ожидал).
Проблема: раздел, на котором находится заархивированный файл, слишком мал.
Я мог бы использовать внешнее устройство, но это займет больше времени. Я бы предпочел записать распакованные данные непосредственно в раздел.
Поэтому я решил сначала получить больше информации о самом архивировании, но это оставило меня еще более озадаченным (см. мой первый ответ здесь).
Кто-нибудь может дать подсказку, пожалуйста?
заранее спасибо,
(используя > вместо dd, как описано здесь, его содержимое сначала записывается в другой файл (вместо того, чтобы напрямую записываться на раздел, как я ожидал).
Нет, это неверно. > /dev/sdh
заставляет ядро напрямую записывать распакованные данные в /dev/sdh. Промежуточного файла нет.
Таким образом, если он не помещается потом, это просто значит, что исходный раздел /dev/sda<n>
был больше, чем /dev/sdh
. Это совершенно не связано с используемым сжатием!
Замечания:
- вы читаете с раздела, но записываете на целое устройство. Обычно это не правильно. Так что убедитесь, что вы пытаетесь достичь правильного результата!
- ваш
dd
на входе также не очень полезен; вы, вероятно, получите лучшую производительность, если просто сделаете< /dev/sda<n>
вместоdd if=/dev/sda<n> bs=1M |
, т.е.n=… gzip -c -9 < /dev/sda${n} > sda${n}.dd.img.gz
gzip -9
относительно медленный (pigz
быстрее и делает то же самое!), но все еще довольно плохо сжимает. Возможно, попробуйте# ДЛЯ СЖАТИЯ: n=… zstd -f -T0 -10 /dev/sda${n} > sda${n}.img.zstd # -f: разрешить чтение непосредственно с блочного устройства # -T0: использовать все доступные ядра процессора для сжатия # -10: "усилие" сжатия 10. Должно быть все еще быстрее, чем `gzip -9`. # Доходит до 18, если хотите поэкспериментировать. # ДЛЯ РАСПАКОВКИ: zstd -f -d sda${n}.img.zstd > /dev/sdh # -f: разрешить запись напрямую на блочное устройство # -d: распаковать
вместо этого.
Ответ или решение
Теория
В области информационных технологий сжатие данных является одной из ключевых задач, необходимых для оптимизации хранения и передачи информации. Сжатие изображений и других типов данных чаще всего выполняется с помощью специализированных алгоритмов, таких как GZIP и ZSTD. Сжатие используется для уменьшения объема занимаемой памяти, однако это может создать проблемы при обратной распаковке, особенно если доступного дискового пространства недостаточно.
Gzip — это утилита для работы с файлами в Unix-системах, использующая алгоритм DEFLATE, который сочетает в себе алгоритмы LZ77 и кодирование Хаффмана. Несмотря на эффективность GZIP в простых случаях, его сжатие далеко не всегда оптимально, особенно в сравнении с современными инструментами, такими как ZSTD, который предлагает более быструю скорость сжатия и распаковки при сохранении высокого уровня сжатия.
Пример
Теперь давайте применим это знание к вашему случаю. Вы попытались сжать данные большим образом, используя команду:
dd if=/dev/sda<n> bs=1M | gzip -c -9 > sda<n>.dd.img.gz
Команда gzip -9
обеспечивает максимальное сжатие, которое может быть выработано с помощью GZIP, но это может быть не самым эффективным методом по времени, и результативность сжатия ограничена.
При распаковке вы использовали:
gunzip sda<n>.dd.img.gz >/dev/sdh
Здесь, несмотря на ваше предположение о создании промежуточного файла, на самом деле указываемая команда направляет распакованные данные прямо на устройство /dev/sdh
, что может создавать проблемы, если конечное устройство (в данном случае sdh
) меньше исходного размера данных до их сжатия.
Эта проблема не связана с процессом сжатия, а исключительно с физическими параметрами устройств хранения.
Применение
Применение лучшей практики для сжатия и распаковки изображений в вашем случае может значительно улучшить процесс. Использование zstd
могло бы быть более подходящим. Примерная команда для сжатия и распаковки выглядит следующим образом:
# Сжатие
n=…
zstd -f -T0 -10 /dev/sda${n} > sda${n}.img.zstd
# Распаковка
zstd -f -d sda${n}.img.zstd > /dev/sdh
Преимуществаин использования zstd
очевидны. Он позволяет быстрее проводить операции сжатия и распаковки благодаря мультипоточности (-T0
), что может быть особенно полезно в рамках современных многоядерных процессоров.
Показатель -10
предусматривает использование усилий компрессии на уровне, который все еще быстрее, чем gzip -9
, позволяя продолжать эксперименты с уровнем до -18
.
Кроме того, вы должны убедиться, что устройство, содержащее распакованные данные, имеет достаточное пространство для размещения этих данных. Всегда проверяйте реальные размеры исходных и целевых дисков перед операциями записи.
Также стоит обратить внимание на комментарий о чтении от главного устройства, а не раздела, так как такое несоответствие может вызвать разрушение данных или неправильную запись.
Заключение
Эффективное управление операциями сжатия и распаковки связано не только с выбором алгоритма и утилиты, но и с учетом физических параметров самого устройства хранения. В вашем случае, оптимизация использования zstd
для сжатия и расширение пространства целевого диска являются приоритетными задачами. Благодаря этим шагам, вы сможете избежать проблем с распаковкой и повысить общую эффективность управления данными.