Шрифт:
Еще одна проблема, связанная с восстановлением систем из резервных копий, заключается в установлении права владения файлами. Когда данные извлекаются из файла копии пользователем с правами root, утилита GNU tar предпринимает попытки восстановить существовавшие права владения (пользователя и группы) каждым файлом, но только если при ее вызове был установлен переключатель (—preserve-permission). В противном случае утилита tar будет использовать текущие установки UMASK. Однако, если перечисленных в файле tar пользователей и групп не существует, то право владения не сможет быть корректно установлено!
Следовательно, прежде чем выполнять восстановление любых некорневых файлов системы, следует восстановить файлы /etc/passwd и /etc/group.
Даже в том случае, когда компьютер под Linux используется в качестве рабочей станции и имеет единственного пользователя, корректное функционирование многих программ и подсистем будет зависеть от установленных прав владения и разрешений на доступ к системным файлам.
Риск при тестировании архивов
Тестирование процедур восстановления может быть достаточно рискованно, особенно когда вы только отрабатываете процедуру резервного копирования. Возможно случайное разрушение файлов, относящихся к другому приложению, которые использовались в момент проведения попытки восстановления файлов.
Самый безопасный способ выполнить контрольное восстановление системы – провести его на резервной рабочей станции, а не на находящемся в промышленной эксплуатации сервере.
Утилиты резервного копирования
В этом разделе приводятся примеры подготовки и создания полных, выборочных и инкрементных резервных копий с использованием утилит tar, cpio и dump/restore.
Для определенности будем считать, что в нашей системе установлен стример. Аналогичным образом можно использовать и другое оборудование.
Создание резервной копии утилитой tar
Самый простой вариант использования утилиты tar – просто создать архив всех каталогов, начиная с корневого. В этом случае простейшая команда для вызова утилиты tar с целью создания копии будет иметь следующий вид:
tar с /
Однако при выполнении указанной команды возникнет несколько проблем. Во-первых, по умолчанию утилита может использовать не тот тип ленточного устройства, который установлен на данном компьютере, и даже вообще осуществлять вывод не на магнитную ленту. Во-вторых, в этом примере будет считано все дерево файловой системы. Это значит, что будет обработана файловая система /proc, любые установленные CD-ROM, файловые системы NFS и Samba, а также другие разделяемые сетевые файловые системы.
Приведенный пример может вызвать и несколько других проблем. Например, при обработке подобной команды GNU tar никогда не будет обеспечивать специальной поддержки sparse-фэйлов (файлов, имеющих реальный размер меньше, чем зарезервировано под них места в файловой системе) и выполнять сжатие выходной информации.
Ниже приведен пример более корректного вызова утилиты.tar cSlzf – $(backdirs) | buffer -о /dev/st0
В этом примере создается (с) архив с поддержкой sparse-фэйлов (s), ограниченный локальными файловыми системами (l). Выполняется сжатие данных (z) и их запись в файл (f) stdout, в архив включаются только указанные каталоги (backdirs).
Созданный архив по каналу передается программе buffer, которая записывает его (_ о) на первое ленточное устройство с интерфейсом SCSI. Подобный подход следует использовать и при получении резервной копии от программы сжатия или через сеть.
Параметр bakdirs – это сценарий, в котором перечисляются каталоги и файлы, включаемые в создаваемую резервную копию. Сценарий backdirs может состоять просто из команд echo, которые перечисляют все точки входа локальных файловых систем (за исключением каталога /proc, любых каталогов /temp, установленных CD-ROM, каталогов NFS и других сетевых ресурсов). Назначение bakdirs состоит в просмотре и фильтрации выходных данных команд mount, что позволяет динамически включать в копию только требуемые файловые системы. Неудобство использования обычного статического списка состоит в том, что он не может автоматически обновляться при добавлении новых файловых систем.
Избегайте дублирования ссылок в командной строке, содержащей вызов утилиты tar. Если одновременно будут копироваться каталоги /some/moutpoint и /some/mountpoint/somedir, расположенные в одной и той же файловой системе, утилита tar дважды поместит в архив все содержимое каталога /some/mountpoint/ somedir.
Использование утилиты cpio
Утилита cpio представляет собой еще один традиционный инструмент создания резервных копий и архивирования файловых систем. В сравнении с утилитой tar ее работа организована иначе.
Во многих случаях принимаемый в утилите cpio подход к указанию подлежащих копированию или восстановлению файлов и каталогов является прямо противоположным подходу, применяемому в утилите tar. При создании архива утилите tar передается список файлов и каталогов, указываемых как параметры командной строки. Любой указанный каталог просматривается рекурсивно. При создании архива с помощью утилиты cpio ей предоставляется список объектов (имена файлов и каталогов, символические имена любых устройств, гнезда доменов UNIX, поименованные каналы и т. п.). Этот список помещается в стандартный поток stdin утилиты cpio с помощью канала и обычно генерируется командой find.
Простая команда, выполняющая копирование всей файловой системы, выглядит следующим образом:find / -print0 I cpio -o0B > /dev/st0
Результаты выполнения команды find будут включать каталог /proc и тому подобные нежелательные для резервного копирования каталоги. Уточнив используемые параметры команды find, можно исправить ситуацию:
find /* -fstype ext2 -print0 I cpio -o0B > /dev/st0
В этом примере копируемые объекты ограничены только файловыми системами типа Ext2. Также будут пропущены все скрытые файлы и каталоги. Устройства вывода информации на магнитную ленту стоят дорого. Получить доступ к удаленным устройствам не намного сложнее, чем к локальным:
find /* -fstype ext2 -print0 | ssh $TAPEHOST «cpio -o0B I buffer -o /dev/st0»
Обратите внимание, что для обращения к удаленным ленточным устройствам используется команда buffer.
Восстановление с локального ленточного устройства
Еще одно принципиальное различие между утилитами tar и cpio состоит в способе сохранения и восстановления абсолютных путей. В случае с утилитой tar ведущая косая черта в абсолютных именах файлов при создании копии удаляется. Утилита cpio в процессе восстановления принудительно превращает все пути в относительные.
Как правило, файлы должны восстанавливаться в тех каталогах, которые будут задаваться относительно текущего каталога (или – в некоторых случаях – каталога root). По умолчанию утилита cpio не восстанавливает каталогов, поэтому при ее вызове следует указывать параметр -d.
Восстановление с удаленного ленточного устройства
Восстановление с удаленных ленточных устройств осуществляется так же просто, как и копирование, например:ssh $OTHERHOST \'buffer -i /devst0\', I \'find /* -fstype ext2 -print0 | cpio -id\'
Если необходимо восстановить только некоторые файлы, добавьте в конец команды cpio список глобальных шаблонов.
Здесь обнаруживается еще одно различие между утилитами cpio и tar, связанное с выполнением частичного восстановления. При использовании утилиты tar список требуемых файлов и каталогов можно поместить прямо в команду ее вызова. Однако утилита tar не допускает использования глобальных шаблонов.
При работе с утилитой tar типичный способ обойти это ограничение состоит в том, чтобы извлечь индекс архива в файл путем простого перенаправления вывода. Данные полученного файла фильтруются с помощью команды grep, после чего полученный список передается команде вызова утилиты tar для извлечения данных. Например, подготовив файл restorelist, содержащий имена требуемых файлов и каталогов, помещенные в отдельные строки, можно ввести следующую команду: