tar


Утилита tar, сокращение от «tape archiver» (ленточный архиватор), может создавать резервные копии любой информации — от одного файла до всей системы. В отличие от dump tar работает только с файлами и каталогами и понятия не имеет о базовой файловой системе (это его преимущество и недостаток). Tar — это общий стандарт, признанный почти всеми производителями операционных систем. Программу tar можно запускать в средах Windows, Linux, UNIX, BSD, Mac OS X, AS/400, VMS, Atari, Commodore64, QNX и почти во всех других операционных системах.

Утилита tar(1) может сохранять файлы на ленте или в специальном файле. Такой файл называется тарбол (tarball). Поскольку tar работает с файлами, извлечь и восстановить файл из тарбола очень легко.

В системе FreeBSD используется своя версия tar, которая называется bsdtar, написанная с самого начала для замены GNU tar. Утилита bsdtar может вести себя как GNU tar, а также в строгом соответствии с POSIX tar. Если вас интересуют различия между GNU tar, POSIX tar и bsdtar, прочитайте страницу руководства tar(1), где приводится масса кровавых подробностей. Фактически утилита bsdtar основана на библиотеке libarchive(3), которая используется разработчиками для добавления поддержки архивирования в другие программы. Один из недостатков tar — молчаливость. Если файловая система повреждена, то одному богу известно, что сохранит tar. После этого он «успешно» восстановит файлы, которые были повреждены при первоначальном копировании. Такого рода проблемы редко случаются на практике, но когда это происходит, память о них остается надолго.

Режимы tar

Утилита tar(1) может выполнять несколько операций, управляемых посредством параметров командной строки. Эти операции называются режимами. Полное описание всех режимов tar приводится в странице руководства, а здесь будут рассмотрены наиболее типичные из них.

Создание архива

Режим создания архива (-c) применяется для создания нового архива. Если иное не указано, этот ключ инициирует сохранение всей информации на ленточном устройстве ($ТАРЕ или /dev/sa0, если переменная $ТАРЕ не установлена). Для сохранения всей системы надо сообщить утилите tar о необходимости рекурсивно архивировать все файлы, начиная с корневого каталога:

# tar -с /

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

# tar -с /home /var

Вывод содержимого архива

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

# tar -t
.
.snap
dev
tmp
...

Эта операция выводит имена всех файлов в архиве и может занять продолжительное время. Примечательно, что в именах файлов отсутствует первый символ слэша («/»). Например, имя файла /tmp выводится как tmp. Эта особенность играет важную роль при восстановлении файлов.

Извлечение файлов из архива

В режиме извлечения файлов () tar извлекает файлы из архива и копирует их на диск. Извлечение файлов производится в текущий каталог; чтобы перезаписать существующий системный каталог /etc, надо прежде всего перейти в корневой каталог. С другой стороны, чтобы восстановить копию каталога /etc в моем домашнем каталоге, я должен был бы сначала перейти в свой домашний каталог.

# cd /home/mwlucas
# tar -x etc

Помните замечание о том, что отсутствие первого символа слэша («/») играет важную роль? Теперь ясно, почему. Если бы в именах архивируемых файлов первым символом был «/», tar всегда извлекал бы файлы относительно корневого каталога. Восстановление файла /etc/rc.conf из резервной копии всегда приводило бы к затиранию существующего файла /etc/rc.conf. При отсутствии начального символа слэша («/») в резервной копии извлечение файлов может производиться в любой каталог, например, файл /etc/rc.conf можно восстановить в виде файла /home/mwlucas/etc/rc.conf. Если файлы извлекаются не на том компьютере, где они были заархивированы, было бы крайне нежелательно, чтобы они затерли существующие файлы на текущем компьютере. Желательно извлекаемые файлы сохранять в отдельном каталоге, чтобы они не оказывали влияния на текущую систему.

Проверка архива

Создав резервную копию, ее можно проверить, чтобы убедиться, что она соответствует вашей системе. Режим поиска различий (-d) сравнивает файлы на ленте с файлами на диске. Если все файлы на ленте соответствуют файлам в системе, то команда tar -d будет выполнена «молча». Однако абсолютное соответствие будет удивительно. Обычно при проведении резервного копирования растут файлы протоколов, поэтому они не будут совпадать с сохраненными файлами. Или, если в системе есть активная база данных, ее файлы могут не соответствовать сохраненным. Если вам необходимо полное соответствие резервной копии (которая еще называется холодная копия), вам следует загрузиться в однопользовательском режиме и создавать резервную копию из него. Вам следует решить, какие ошибки сравнения можно игнорировать, а с какими следует разбираться.

Другие возможности tar

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

Использование файла вместо ленты

Ключ -f позволяет задать устройство или файл в качестве места для создания архива. Во всех предыдущих примерах использовалось устройство по умолчанию /dev/sa0 или устройство, определяемое переменной $ТАРЕ. В случае необходимости накопитель на ленте можно указать с помощью ключа -f:

# tar -с -f /dev/east0 /

Вместо записи резервной копии на ленту можно создать tar-файл. Исходный код, распространяемый Интернете, часто распространяется в виде файлов с расширением .tar (tarballs). Для сохранения резервной копии в файле можно использовать ключ -f. Так, для сохранения глав этой книги я время от времени создавал тарбол bookbackup.tar:

# tar -cf bookbackup.tar /home/mwlucas/absolutefreebsd/

Этот файл легко можно сохранить на любой другой машине, поэтому, даже если мой дом сгорит, книга будет сохранена. Далее можно задействовать телефонный канал и линию электропередачи соседа, позаимствовать ноутбук, отыскать открытую точку беспроводного доступа к сети, запустить tar -xf bookbackup.tar и работать в окружении головешек, ожидая представителя страховой компании. (Вряд ли я смог бы сделать намного больше в подобной ситуации.)

Подробный режим

Ключ -v делает утилиту tar словоохотливой. Обычно tar работает «молча», за исключением случаев, когда появляются ошибки. Чаще всего это очень хорошо (кому захочется читать длинные списки файлов на сервере всякий раз, когда запускается процедура архивирования?), но иногда возникает желание ощутить то теплое чувство, которое дает вид работающей программы. С ключом -v утилита покажет имена всех файлов, которые упаковываются в архив или распаковываются из архива. При рутинном архивировании или разархивировании подробный режим мешает следить за появлением ошибок.

gzip

Ключ -z вызывает обработку файлов программой сжатия gzip(1) — как при архивировании, так и при разархивировании. Сжатые тарболы обычно имеют расширение .tar.gz или .tgz, редко .taz. Сжатие файлов значительно уменьшает размер архива; на самом деле многие резервные копии можно сжать на 50% и более. Все современные версии tar, в отличие от старых, поддерживают gzip. Поэтому, если необходимо, чтобы сжатые файлы мог прочесть абсолютно каждый, применять ключ -z не надо.

Сжатие

В противоположность предыдущему ключу все версии tar на всех версиях UNIX могут сжимать файлы с помощью ключа -Z, который вызывает compress(1). Программа compress не так эффективна, как gzip, но она все-таки уменьшает размер файла. Тарболы, сжатые с помощью -Z, имеют расширение .tar.Z.

Сжатие утилитой bzip

С помощью ключа -y tar в составе FreeBSD поддерживает сжатие с помощью программы bzip, более эффективной, чем gzip. bzip требует больше времени процессора, чем gzip, но в наше время процессорное время не так ограничено, как во времена, кода появилась утилита gzip. Однако не все версии поддерживают bzip. Если сохраняемые файлы будут читаться только на системе FreeBSD или вы в состоянии будете установить bzip на другой платформе, используйте ключ -y.

Сжатие и утилита tar в системе FreeBSD

Библиотека libarchive в системе FreeBSD автоматически определяет тип сжатия, используемый для создания резервных копий. При создании архива вы должны явно указать желаемый тип сжатия, однако при извлечении файлов из архива можно позволить утилите tar(1) самой определять тип сжатия и Принять Правильное Решение самостоятельно.

Восстановление прав доступа к файлам

Ключ позволяет восстанавливать первоначальные права доступа к извлекаемым файлам. По умолчанию tar назначает владельцем извлекаемых файлов пользователя, который производит операцию разархивирования. Такой подход оправдывает себя при работе с исходными текстами программ, но при восстановлении системы необходимо восстанавливать первоначальные права доступа к файлам. (Попробуйте на протяжении некоторого времени восстанавливать эти права вручную; вы сразу поймете, почему сразу нужно все делать правильно.)

И еще, и еще, и еще…

Утилита tar имеет еще массу других функций, учитывающих изменения в резервном копировании, файлах, файловых системах и дисках, происходившие в течение десятилетий. Полный список этих функций вы найдете в странице руководства tar(1).

Комментарии запрещены.