Восстановление сжатого изображения невозможно из-за недостатка пространства – общее понимание методов сжатия.

Вопрос или проблема

Я использовал 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 для сжатия и расширение пространства целевого диска являются приоритетными задачами. Благодаря этим шагам, вы сможете избежать проблем с распаковкой и повысить общую эффективность управления данными.

Оцените материал
Добавить комментарий

Капча загружается...