Инструменты сжатия файлов в Linux

Сжимать файлы и каталоги необходимо по нескольким причинам. Некоторые из наиболее очевидных преимуществ – это сохранение дискового пространства экономия полосы пропускания при использовании сети.

В этом руководстве мы обсудим различные методы сжатия данных и связанные с ними операции, которые увеличивают гибкость сжатия (например, архивирование).

Примечание: Все примеры выполнены на сервере Ubuntu 12.04, но инструменты будут работать аналогичным образом и в других дистрибутивах Linux.

Основы сжатия и архивирования

Сжатие – это технология уменьшения размера файла на диске с помощью разных алгоритмов и математических вычислений. Файлы форматируются определенным образом, что делает их общую структуру несколько предсказуемой, даже если их содержимое отличается. Кроме того, содержимое довольно часто повторяется. Обе эти характеристики позволяют сжимать файлы.

Сжатие с потерями и без потерь

При обсуждении сжатия в отношении компьютеров и типов файлов одни и те же термины могут означать несколько разных вещей в зависимости от контекста. Возьмем, к примеру, музыкальный файл MP3. MP3 – это сжатый звуковой файл, созданный из более крупного исходного музыкального файла.

Этот тип сжатия принципиально отличается от того, о чем мы будем говорить в этом руководстве. Это связано с тем, что MP3 создается путем анализа формы сигнала аудиофайла, в ходе которого выясняется, какие данные можно потерять, сохранив при этом общий звук оригинала.

Это метод называется сжатием с потерями, поскольку он действительно теряет информацию из исходного файла, которая не попадает в MP3. Конвертировать MP3 обратно в исходный файл невозможно.

Пользователи могут не заметить, что файл сжат, но такой файл содержит не всю информацию оригинала. Чем выше степень сжатия, тем больше данных будет утрачена.

Другим примером сжатия с потерями является изображение в формате JPEG. Чем больше оно сжато, тем больше данных теряется, и тем заметнее будет сжатие. Утилита сжатия JPEG попытается найти поля цвета, которые достаточно близки друг к другу, и заменяет все такие поля одним цветом. Чем больше степень сжатия, тем больше цветов будет объединено таким образом.

Альтернативным методом является сжатие без потерь; эта технология создает файл меньший, чем исходный, но такой файл можно использовать для восстановления исходного файла. В этом руководстве рассматривается только сжатие без потерь. Этот тип не использует методы аппроксимации для сжатия данных, вместо этого здесь применяются определенные алгоритмы для распознавания повторяющихся частей файла. Такие части удаляются и заменяется заполнителями. Дальнейшие повторения шаблона заменяются одним и тем же заполнителем.

Это позволяет компьютеру использовать меньше дискового пространства для хранения данных. Чтобы понять, как это работает, представьте список переменных: он определяет данные, которые в дальнейшем используются для написания программы. По сути, из этих двух этапов и состоит сжатие без потерь: повторяющиеся значения сопоставляются с шаблоном, на который можно легко сослаться, после чего каждое из этих значений в файле заменяется ссылкой.

Кроме того, современные методы сжатия без потерь считаются адаптивными. Это означает, что они не анализируют весь входной файл сразу и не создают из него «словарь» ссылочных подстановок. Вместо этого они анализируют файл по мере его поступления и переписывают словарь в зависимости от того, какие данные повторяются в файле. В процессе сжатия словарь постепенно становится более эффективным.

Основы архивирования

Под понятием архивирования данных обычно подразумевается их резервное копирование и сохранение в безопасном месте, часто в сжатом формате. «Архив» на сервере Linux в целом имеет несколько другое значение. Обычно архивы – это файлы tar.

Раньше данные с серверов часто архивировались в ленточные архивы – это магнитные ленточные устройства, которые могут хранить последовательные данные. В некоторых отраслях этому методу резервного копирования по-прежнему отдают предпочтение. Чтобы сделать архивирование более продуктивным, была создана программа tar. Она позволяет ссылаться на файлы и управлять ими в виде одного файла, не влияя на права и метаданные файлов. В дальнейшем файл или всю файловую систему можно извлечь из архива.

В целом, tar – это формат, который обеспечивает удобное распространение, хранение, резервное копирование и управление группами связанных файлов.

В данном руководстве речь также пойдёт об архивах, поскольку они часто используют сжатие для более производительного хранения данных.

Инструменты сжатия

Linux предоставляет несколько инструментов сжатия. Каждый из них имеет свои преимущества и недостатки. Основное внимание следует уделить инструментам сжатия, которые работают с tar, потому что они гораздо более гибкие, чем остальные инструменты.

Утилита gzip

gzip – это уже классический инструмент сжатия данных в Linux. Он появился в 1992 году и до сих пор находится в разработке.

Инструмент gzip использует алгоритм сжатия DEFLATE (который также используется другими популярными технологиями, такими как PNG, HTTP, SSH).

Одно из главных преимуществ инструмента gzip – его скорость. Он может сжимать и распаковывать данные с гораздо более высокой скоростью, чем некоторые другие популярные технологии (особенно если сравнить наиболее компактные форматы сжатия каждой утилиты). Он также очень эффективен в плане использования памяти при сжатии и распаковке и не требует больше памяти при оптимизации сжатия.

Ещё одним преимуществом gzip является совместимость. Поскольку gzip – очень старый инструмент, почти все системы Linux независимо от возраста  поддерживают gzip.

Его самый большой недостаток заключается в том, что он сжимает данные менее тщательно, чем некоторые другие средства сжатия. Если вы часто сжимаете и распаковываете большое количество данных, gzip вполне подходит; но если вы планируете сжать файл один раз и сохранить его, тогда лучше рассмотреть другие варианты.

Обычно файлы gzip имеют расширение .gz. Чтобы сжать файл с помощью gzip, нужно ввести:

gzip sourcefile

Команда сожмет файл и переименует его в sourcefile.gz.

Чтобы выполнить рекурсивное сжатие каталога, добавьте флаг –r:

gzip -r directory1

Эта команда сожмет все файлы в каталоге. Обычно этот метод использовать не рекомендуется; лучший результат можно получить путем архивации каталога и сжатия итогового файла.

Чтобы получить больше информации о сжатом файле, используйте флаг -l, который выдаст статистику:

gzip -l test.gz
compressed        uncompressed  ratio uncompressed_name
5133               14073  63.7% test

Чтобы передать результат другой утилите, вы можете отправить сжатый файл в стандартный вывод с помощью флага –с. В этом примере вывод будет перенаправлен обратно в файл:

gzip -c test > test.gz

Вы можете настроить оптимизацию сжатия, передав числовой флаг от 1 до 9. Флаг -1 (и его псевдоним –fast) выполняет самое быстрое, но наименее тщательное сжатие. Флаг -9 (и его псевдоним –best) – это, соответственно, самое медленное и самое тщательное сжатие. По умолчанию используется среднее значение -6.

gzip -9 compressme

Чтобы распаковать файл, добавьте флаг –d (также можно использовать псевдоним gunzip).

gzip -d test.gz

Инструмент bzip2

bzip2 – еще один популярный формат и инструмент сжатия. Он немного младше gzip, вышел в 1996 году. Сегодня bzip2 считается традиционной альтернативой gzip.

Если gzip работает на алгоритме DEFLATE, то инструмент bzip2 – это реализация алгоритма Берроуза-Уилера. Это различие в методологии приводит к тому, что инструмент bzip2 довольно сильно отличается от gzip.

Наиболее важным преимуществом bzip2 для большинства пользователей является более высокая степень сжатия, которая достигается за счет увеличения времени сжатия. Инструмент bzip2 может создавать значительно более компактные файлы, чем gzip, но для этого требуется гораздо больше времени (из-за более сложного алгоритма).

К счастью, на распаковку уходит гораздо меньше времени, чем на сжатие. Поэтому формат bzip2 часто используется для распространения файлов: потратив больше времени на сжатие, вы получаете файлы меньшего объема, которые легко распространять и можно быстро распаковать. На распаковку у bzip2 все же уходит намного больше времени, чем у gzip.

Также следует иметь в виду, что у bzip2 требования к памяти больше, чем у gzip. Это не повлияет на работу большинства машин, но вполне может отразиться на работе небольших встроенных устройств. Опционально можно передать флаг -s, который сократит требования к памяти примерно наполовину, но также приведет к снижению степени сжатия.

Обычно файлы, сжатые с помощью этого инструмента, имеют расширение .bz2.

Чтобы сжать файл, введите:

bzip2 afile

Эта команда сожмет файл и присвоит ему имя afile.bz2.

Вы можете передать флаг -s, чтобы утилита работала в режиме экономии памяти. Это понизит качество сжатия, но, с другой стороны, не потратит столько ресурсов.

bzip2 -s afile

bzip2 поддерживает числовые флаги, но их действие  несколько отличается от флагов gzip. В bzip2 они представляют размер блока, который утилита использует при сжатии. Этот параметр определяет отношение использования памяти к сжатию, а не скорость. По умолчанию используется флаг -9 (относительно высокое использование памяти, но высокое качество сжатия).

bzip2 -1 file

Чтобы распаковать файл, используйте флаг –d:

bzip2 -d file.bz2

Эта команда вернёт распакованный файл по имени file.

Утилита xz

xz является относительно новым механизмом сжатия. Инструмент вышел в 2009 году и с тех пор стабильно обновляется.

Утилита xz использует алгоритм сжатия LZMA2. Этот алгоритм имеет более высокий коэффициент сжатия, чем предыдущие два, благодаря чему он отлично подходит для хранения данных на небольшом диске. Он создает файлы меньшего размера.

Хотя сжатые с помощью xz файлы весят меньше, чем файлы, сжатые с помощью других утилит, для сжатия требуется значительно больше времени. Например, на сжатие довольно большого файла с аргументами и флагами у gzip уйдет около половины минуты, bzip2 может потратить где-то около минуты, а у xz эта операция может занять около четырех или пяти минут.

Инструмент сжатия xz также использует много памяти (иногда столько же, сколько и предыдущие инструменты). Конечно, если на сервере достаточно памяти, это не будет проблемой, но эту характеристику нужно учитывать при выборе.

Хотя сжатие может занять намного больше времени, чем хотелось бы, на распаковку времени уходит довольно мало. Конечно, скорость распаковки xz никогда не достигает показателей gzip, но обычно она значительно превышает скорость bzip2. Использование памяти приемлемое (но относительно других инструментов довольно высокое).

Все эти преимущества и недостатки говорят о том, что этот формат отлично подходит для распространения программного обеспечения. С помощью этой утилиты вы можете предоставить пользователям компактный файл, который быстро распаковывается.

Ещё один недостаток xz – утилита не поддерживается некоторыми старыми системами.

Файлы, созданные с помощью xz, обычно используют расширение .xz.

Чтобы сжать файл, введите:

xz file

Эта команда создаст сжатый файл file.xz.

Запросить статистику сжатия можно с помощью флага –l:

xz -l test.xz
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
1       1      5,016 B     13.7 KiB  0.356  CRC64   test.xz

Если вам нужно отправить сжатые данные в стандартный вывод, используйте -с.

xz -c test > test.xz

Утилита xz также поддерживает числовые флаги. Чем меньше число, тем быстрее сжатие (-0 обеспечивает самую высокую скорость сжатия). По умолчанию используется значение -6.

Если вы хотите увеличить качество сжатия и не беспокоитесь о памяти и времени, которое уйдет на выполнение процедуры, используйте флаг –е, который включает режим сжатия «extreme». Его производительность можно настраивать с помощью числовых флагов.

xz -e -9 large_file

Чтобы распаковать файлы, используйте флаг –d.

xz -d large_file.xz

В результате получится распакованный файл large_file.

Архивирование и сжатие

Отдельные методы сжатия производительны сами по себе, но чаще всего они дают лучший результат в комбинации с  tar. Это позволяет сохранять структуры каталогов, права на файлы и т. п.

Команду tar очень легко совмещается с сжатием. Она поддерживает флаги командной строки, которые можно использовать для автоматического вызова того или иного инструмента сжатия после завершения процесса архивирования.

Комбинация tar и gzip

Чтобы создать архив tar, который можно будет сжать утилитой gzip, передайте флаг –z. Он включает сжатие создаваемого архива. Перед флагами команды tar не ставится тире. Чтобы создать сжатый архив, обычно используется команда:

tar czvf compressed.tar.gz directory1

  • c архивирует каталог directory1.
  • v включает расширенный вывод.
  • z включает сжатие gzip.
  • f передаст вывод в сжатый файл compressed.tar.gz.

Как только файл будет создан, можно заглянуть внутрь. Для этого используйте флаг t вместо с.

tar tzvf compressed.tar.gz
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory1/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory1/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory1/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory1/httpd.conf

Чтобы распаковать архив, используйте флаг x:

tar xzvf compressed.tar.gz

Структура каталогов архива будет перемещена в текущий каталог.

Комбинация tar и bzip2

Чтобы сжать архив с помощью bzip2, замените флаг z (который вызывает gzip) флагом j.

tar cjvf bzipcompressed.tar.bz2 directory2

Создав файл, вы можете просмотреть его:

tar tjvf bzipcompressed.tar.bz2
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory2/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory2/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory2/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory2/httpd.conf

Чтобы распаковать архив в текущий каталог, введите:

tar xjvf bzipcompressed.tar.bz2

Комбинация tar и xz

Чтобы сжать архив с помощью xz, используйте флаг J:

tar cJvf xzcompressed.tar.xz directory3

Чтобы просмотреть содержимое файла, используйте:

tar tJvf xzcompressed.tar.xz
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory3/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory3/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory3/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory3/httpd.conf

Чтобы распаковать архив в текущий каталог, введите:

tar xJvf xzcompressed.tar.xz

Заключение

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

Выбирая инструмент сжатия, важно знать о недостатках производительности и проблемах совместимости различных утилит.

Tags:

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