Опубликован: 19.10.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Европейский Университет в Санкт-Петербурге
Лекция 13:

Резервное копирование и восстановление

Средства резервного копирования

tar

Для сжатия больших файлов в UNIX изначально использовалась программа compress. Она сжимала файл, после сжатия добавляла к имени файла .Z. Программа compress до сих пор поставляется практически со всеми диалектами UNIX. В IRIX и некоторых других системах она является стандартной утилитой сжатия. Чтобы вернуть файл, сжатый compress, к прежнему, несжатому состоянию используется uncompress.

В Linux и FreeBSD, а также во многих других диалектах для сжатия применяют gzip. Он использует тот же алгоритм сжатия LZW, что и WinZip или pkzip, известные вам по системам Microsoft, однако не совместим с ними по формату файлов. Программа WinZip for Windows понимает форматы gzip, а gzip ее форматы не понимает. Для распаковки файлов, сжатых gzip, используют gunzip. Большинство версий gzip не умеют сжимать каталоги с их содержимым - только файлы.

Есть еще утилиты zip и unzip, которые работают с теми же форматами файлов, что и pkzip, WinZip и другие архиваторы в Microsoft-системах. Они редко используются в UNIX, только если нужно обеспечить совместимость с Windows-системами.

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

Затем удобно сжать получившийся файл с помощью gzip, чтобы он занимал меньше места. Многие дистрибутивы программных пакетов в UNIX упакованы tar и gzip. У команды tar даже есть ключ z. Он говорит tar, что после упаковки файлов в архив нужно вызвать gzip для сжатия. Такой же ключ используется и для распаковки - когда tar перед тем, как начать свою работу, вызывает gunzip.

Например, мне нужно упаковать дистрибутив apache, который лежит в /home/apache:

cd /home
tar cvzf apache.tar.gz apache/*

Всего три команды в UNIX принимают (и в некоторых версиях - требуют) ключи без знака "минус" перед ними. Это ps, dump и tar. Мы использовали для создания архива следующие ключи:

  • с - create - создать архив;
  • v - verbose mode - выводить имена всех пакуемых файлов на экран;
  • z - zip - после упаковки вызвать gzip для сжатия;
  • f - file - записать результат в файл, который указан после ключа f, а не на первый ленточный накопитель, как по умолчанию;
  • apache.tar.gz - это имя архива, а apache/* - то, что надо упаковать. Лучше всего запаковывать целый каталог, а не входить в него и паковать содержимое, вот так:
# так делать не надо
cd /home/apache
tar cvzf apache.tar.gz *

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

tar xzvf apache.tar.gz

в том каталоге, где лежит архив, создастся подкаталог apache (помните, там было сказано "apache/*"?). И уже в него будут распакованы все файлы и подкаталоги архива. В этой команде tar мы использовали один незнакомый ключ - x. Он требует распаковать архив.

compress, gzip, zip

Для сжатия архивов можно применять как gzip, так и compress - более старую утилиту из первых систем UNIX. Результатом выполнения команды сжатия файла data.txt

compress data.txt

будет файл data.txt.Z. При применении gzip результат будет в среднем лучше, так как этот архиватор обычно сжимает файлы сильнее. При этом он дописывает к имени сжатого файла суффикс .gz. В обоих случаях исходный (несжатый) файл исчезает, остается только сжатый файл. Надо помнить, что при нехватке места на диске архив не может быть создан, если свободного места осталось впритык, так как несжатый исходный файл удаляется только после его успешного сжатия и переименования временного сжатого файла в окончательный результат.

Для декомпрессии файлов, сжатых утилитами compress и gzip, используйте uncompress и gunzip соответственно. В некоторых версиях UNIX используется еще более новый архиватор bzip2 (и декомпрессор bunzip2 ), но в Solaris он пока еще не портирован.

dd

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

dd if=/dev/fd0 of=/usr/home/admin/diskettes/image1

Фактически, dd расценивает то, что она копирует, как блоки произвольных данных указанной длины (используется разумное умолчание в 512 байт). Использовать dd можно тогда, когда следует иметь две или более резервных копий: первую копию на ленту записывают с помощью программы ufsdump, а остальные копии создают копированием с ленты на ленту программой dd:

dd if=/dev/rmt/0h of=/dev/rmt/2h

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

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

cpio

Команда cpio служит для копирования файлов в архив и из архива и умеет работать в трех режимах: входящего копирования, исходящего копирования и пассивного копирования. Режим исходящего копирования (копирования в архив, Copy Out Mode) используется для создания архива из файлов, подходящих по маске. Так, для архивации файлов, чьи имена начинаются с q, можно использовать такую последовательность команд:

ls q* | cpio -oc >Q/sccs.backup
16 blocks
cd Q
ls
sccs.backup

Файл результата состоит из заголовка и записанного вслед за ним имен и содержимого архивируемых файлов. Сжатия информации не производится. Так выглядит начало получившегося файла sccs.backup:

head sccs.backup
070701000020fc0000812400000000000000010000000140dd6ab70000
0012000000660000000700000000000000000000000200000005q

test1

Применим входящее копирование (т.е. копирование из архива, Copy In Mode) для извлечения из архива определенных файлов, в нашем примере - файла q:

ls
sccs.backup
cat sccs.backup | cpio -i q
4 blocks
ls
q sccs.backup

Пассивное копирование (Pass Mode)2Здесь был бы уместнее термин "сквозное копирование", но "пассивное" - это термин, введенный в переводе книги Пола Уотерса "Solaris 8. Руководство администратора". Поскольку эту книгу смело можно порекомендовать для изучения, а многие ее уже знают, я сохраняю терминологию, пусть немного в ущерб понятности термина. Смотрите детали в man cpio (прим. авт.). служит для копирования файлов между файловыми системами, когда не применима команда mv. В этом режиме cpio читает список файлов со стандартного ввода и копирует эти файлы в указанный каталог (дерево каталогов).

Фактически, cpio всегда принимает список файлов со стандартного ввода (кроме случая входящего копирования). Ключи, которые описаны в man cpio, предписывают программе особенности поведения, такие как создание подкаталогов по необходимости и т.п.

Алексей Антипин
Алексей Антипин
Россия, Томск, ТУСУР, 2010
Игорь Тарасенко
Игорь Тарасенко
Россия