10.3 Резервное копирование данных (Backing Up Data)¶
Одна из ключевых обязанностей системного администратора Linux — обеспечение защиты данных на вверенных ему системах. Один из лучших способов сделать это — резервное копирование. Наличие резервной копии создаёт избыточный экземпляр данных, который можно восстановить в случае аварии.
Важно помнить, что данные в основном хранятся на механических устройствах внутри Linux-системы. Жёсткие диски имеют двигатели и другие движущиеся части, которые постепенно изнашиваются. Более того, производители, как правило, указывают для жёстких дисков значение среднего времени наработки на отказ (mean time between failures, MTBF). Этот показатель даёт примерную оценку срока службы диска до момента отказа. По сути, речь идёт не о том, выйдет ли диск из строя, а о том, когда это произойдёт.
Я привожу это для того, чтобы вы серьёзно относились к резервному копированию. Многие системные администраторы, откровенно говоря, относятся к нему халатно. Эту задачу легко отложить, думая: «Сделаю резервную копию завтра...». И прежде чем вы это замечаете, проходят недели с момента последнего резервного копирования.
Если вы работаете в организации и отвечаете за обслуживание систем, не выполняя при этом резервное копирование, почти гарантированно лишитесь работы при возникновении аварии. Несколько лет назад я принимал участие в звонке технической поддержки с системным администратором, чей сервер полностью вышел из строя. Он обратился к нам в последней надежде найти какое-то волшебное решение для восстановления данных. Когда мы сказали ему, что не сможем помочь и что придётся переустанавливать систему и восстанавливать её из резервных копий, на другом конце провода долго царило молчание. Голос его надломился, и он прошептал: «У меня нет резервных копий. Я потеряю работу из-за этого». Послушайтесь моего совета: разработайте план резервного копирования и строго придерживайтесь его.
Резервный план включает несколько составляющих. В данной части главы мы рассмотрим следующее:
- Выбор носителя для резервного копирования
- Выбор стратегии резервного копирования
- Использование утилит резервного копирования Linux
Начнём с обсуждения выбора носителя для резервного копирования.
Выбор носителя для резервного копирования (Selecting a Backup Medium)¶
В «старые добрые времена» для резервного копирования данных фактически было только два варианта: дискеты и стриммер. Дискеты вмещали мало данных и были печально известны ненадёжностью, поэтому большинство системных администраторов отдавали предпочтение стриммерам.
Сегодня некоторые администраторы по-прежнему используют стриммеры. Стриммеры используют магнитную ленту — аналогичную той, что применяется в 8-мм видеокамерах, — для хранения данных. Они вмещают большое количество данных и сравнительно недороги. Это приемлемый вариант для резервного копирования данных в Linux-системе.
Тем не менее стриммеры имеют ряд ограничений. Во-первых, они изнашиваются: у стриммера много механических деталей, которые со временем выходят из строя. Лента в стриммере протягивается по головке чтения/записи и также изнашивается из-за трения. Во-вторых, стриммеры относительно медленны: резервное копирование больших объёмов данных может занять несколько часов.
В связи с этим многие администраторы рассматривают другие носители для резервного копирования системных данных. Некоторое время были в моде перезаписываемые CD и DVD. Однако современные жёсткие диски стали настолько ёмкими, что оптические диски устарели для общесистемного резервного копирования. Резервное копирование жёсткого диска объёмом 3 ТБ на DVD сегодня сравнимо с резервным копированием диска объёмом 100 МБ на дискеты 20 лет назад. Да, это возможно, но это болезненный и трудоёмкий процесс. Если объём данных, которые вы резервируете, относительно невелик, я не рекомендую этот вариант.
Ещё один вариант, который рассматривают многие системные администраторы (и который лично мне очень нравится), — съёмные USB-жёсткие диски. В старые времена для резервного копирования жёстких дисков использовали стриммеры, потому что жёсткие диски были чрезвычайно дорогими. В начале 1990-х годов действовало общее правило «$1 за мегабайт» при покупке жёсткого диска. Использовать жёсткие диски для резервного копирования было просто слишком дорого. Кроме того, тогда не было горячего подключения внешних интерфейсов для жёстких дисков. Поэтому лента оставалась одним из немногих жизнеспособных вариантов.
Сегодня же цены на жёсткие диски резко упали. Съёмный USB- или FireWire-жёсткий диск можно купить менее чем за $0,10 за гигабайт. Использование внешних жёстких дисков для резервного копирования имеет два явных преимущества. Во-первых, они намного быстрее стриммеров: резервное копирование, которое занимало часы на стриммере, на жёстком диске займёт минуты. Во-вторых, жёсткие диски, как правило, надёжнее стриммеров.
Разумеется, использование жёстких дисков для резервного копирования — не идеальное решение. Одним из ключевых недостатков является то, что раздел на съёмном диске должен быть смонтирован для выполнения резервного копирования. Если с основным жёстким диском что-то случится в момент, когда подключён съёмный диск, данные на съёмном диске могут также оказаться повреждены.
Как и с любым другим носителем для резервного копирования, при принятии решения об использовании внешних жёстких дисков необходимо взвешивать преимущества и недостатки.
Совет
Лично я предпочитаю решение горячего резервного копирования в сравнении со стандартным. На своих критически важных Linux-системах я использую утилиту rsync для синхронизации данных со второй Linux-системой по сети, создавая по сути зеркальную систему. В моём офисе синхронизация выполняется каждый час, но можно делать это чаще или реже по мере необходимости. Если основная система выходит из строя, я просто переключаюсь на резервную. Восстановление занимает лишь несколько секунд!
Примечание
Сегодня многие пользователи выбирают облачное резервное копирование (cloud-based backups). Подписавшись на облачный сервис резервного копирования, ваша система автоматически резервируется через интернет в центр обработки данных где-то в мире. Облачное резервное копирование надёжно и очень удобно. Однако с этим вариантом связан ряд проблем безопасности. Как убедиться, что данные передаются надёжно? Как убедиться, что сеть и серверы провайдера защищены?
В любом случае сначала нужно выбрать носитель для резервного копирования, приобрести соответствующее оборудование и подключить его к системе. После этого необходимо выбрать стратегию резервного копирования.
Выбор стратегии резервного копирования (Selecting a Backup Strategy)¶
При разработке плана резервного копирования существует несколько вариантов организации процесса. Необходимо рассмотреть следующие вопросы:
- Выбор типа резервного копирования
- Выбор расписания резервного копирования
- Определение объекта резервного копирования
Начнём с выбора типа резервного копирования.
Выбор типа резервного копирования (Selecting a Backup Type)¶
В зависимости от выбранной утилиты резервного копирования, как правило, доступно не менее трёх типов резервного копирования (иногда больше):
- Полное (Full) — при полном резервном копировании архивируются все указанные файлы независимо от того, изменялись ли они с момента последнего резервного копирования. После архивирования каждый файл помечается как скопированный.
- Инкрементное (Incremental) — при инкрементном резервном копировании архивируются только файлы, изменённые с момента последнего резервного копирования (полного или инкрементного). После архивирования каждый файл помечается как скопированный.
- Дифференциальное (Differential) — при дифференциальном резервном копировании архивируются только файлы, изменённые с момента последнего полного резервного копирования. Хотя файлы и были скопированы в ходе дифференциального резервного копирования, они не помечаются как скопированные.
Для определения стратегии резервного копирования необходимо выбрать один из перечисленных типов. Например, можно каждый раз выполнять полное резервное копирование. Эта стратегия является тщательной и исчерпывающей, а восстановление данных из резервной копии будет выполняться быстрее всего.
Однако полное резервное копирование может занимать очень много времени, поскольку архивируется каждый файл вне зависимости от того, изменился ли он с момента последнего копирования. Поэтому многие администраторы сочетают полное резервное копирование с инкрементным или дифференциальным.
При использовании стратегии «полное + инкрементное» раз в неделю, как правило в ночь с пятницы на субботу, выполняется полное резервное копирование, а в остальные шесть дней недели — инкрементное. При такой стратегии за каждую неделю получается одна полная и шесть инкрементных резервных копий. Главное преимущество этой стратегии — скорость: поскольку инкрементные копии содержат только изменённые файлы, они выполняются очень быстро. Недостаток — при восстановлении необходимо применить шесть резервных копий в строго определённом порядке: сначала полная, затем первая инкрементная, вторая инкрементная и так далее. Это может быть медленным процессом.
В качестве альтернативы можно сочетать полное резервное копирование с дифференциальным. В этом случае, как правило, в пятницу ночью выполняется полное резервное копирование, а в остальные ночи — дифференциальное. Помните, что дифференциальное резервное копирование включает только файлы, изменённые с момента последнего полного копирования, а не с момента последнего дифференциального. Поэтому каждая последующая резервная копия становится всё больше. Главное преимущество этой стратегии — быстрое восстановление: вместо семи резервных копий нужно применить всего две — сначала последнюю полную, затем последнюю дифференциальную (и только их). Недостаток — дифференциальные копии поначалу выполняются быстро, но к последнему дню цикла могут занимать почти столько же времени, что и полное копирование.
Внимание
Ни в коем случае не смешивайте инкрементное и дифференциальное резервное копирование! Резервные копии пропустят данные, поскольку файлы будут помечаться непоследовательно.
Какую бы стратегию вы ни выбрали, следует обеспечить ротацию резервных копий. Многие администраторы ротируют носители таким образом, чтобы на руках было три-четыре недели предыдущих резервных копий. Никогда не знаешь, когда внезапно понадобится файл, удалённый две недели назад!
Кроме того, необходимо обязательно верифицировать резервные копии. Большинство утилит резервного копирования предоставляют возможность проверки созданной резервной копии по исходным файлам после завершения. Если этого не делать, в резервных копиях могут накапливаться ошибки.
Итак, выбрав тип резервного копирования, переходим к составлению расписания.
Выбор расписания резервного копирования (Selecting a Backup Schedule)¶
Расписание резервного копирования может быть любым, подходящим для ваших нужд. Однако большинство администраторов работают на недельной ротации, как описано выше. Выберите один день для полного резервного копирования, а остальные дни недели отведите под инкрементное или дифференциальное.
Резервное копирование следует планировать на время наименьшей нагрузки на систему. Обычно это поздний вечер или раннее утро в зависимости от режима работы организации.
Наконец, нужно определить, что именно будет резервироваться.
Определение объекта резервного копирования (Determining What to Back Up)¶
Большинство Linux-систем, с которыми вам придётся работать, занимают довольно много дискового пространства в зависимости от установленных пакетов. Необходимо решить, какая часть занятого дискового пространства будет резервироваться.
Один из вариантов — резервное копирование всей системы целиком. Это безопасный и исчерпывающий вариант, однако он достаточно медленный из-за большого объёма данных. Многие администраторы отказываются от него. Вместо этого они резервируют только критически важные данные: пользовательские данные и конфигурационную информацию. Логика такой стратегии заключается в том, что в случае аварии можно просто установить новую систему и восстановить на ней критически важные данные. Если вы выбираете эту стратегию, рекомендуется рассмотреть резервное копирование следующих каталогов файловой системы Linux:
/etc/home/opt/root/var/srv
Обратите внимание, что при такой стратегии не резервируется сама система Linux и её утилиты. Резервируются только конфигурационные файлы, пользовательские данные, файлы журналов и файлы веб-сервера/FTP.
После определения объекта резервного копирования следующая часть плана — выбор инструментов.
Использование утилит резервного копирования Linux (Using Linux Backup Utilities)¶
В Linux в вашем распоряжении имеется целый ряд утилит для резервного копирования. Многие входят в состав операционной системы, другие можно получить от сторонних поставщиков. Для экзамена LPIC-1/Linux+ необходимо знать инструменты, общие для большинства дистрибутивов и запускаемые из командной строки. В данной части главы мы рассмотрим следующее:
- Использование
tar - Использование
cpio - Использование
ddдля копирования данных
Начнём с изучения проверенной временем утилиты tar.
Использование tar (Using tar)¶
Утилита tar существует очень давно и является широко используемым инструментом резервного копирования в Linux. Аббревиатура «tar» расшифровывается как tape archive — «архив на магнитной ленте». Утилита tar принимает список указанных файлов и копирует их в единый архивный файл (.tar). Файл .tar затем можно сжать утилитой gzip, получив файл с расширением .tar.gz. Такой файл называется tarball-архивом (tarball).
Утилита tar может передавать задания резервного копирования на различные носители, включая стриммеры и съёмные жёсткие диски. Синтаксис создания резервных копий с помощью tar: tar –cvf имя_файла каталог. Параметр –c указывает tar создать новый архив. Параметр –v включает подробный режим, отображая на экране каждый архивируемый файл. Параметр –f задаёт имя создаваемого tar-архива.
Например, чтобы создать резервную копию каталога /home с именем backup.tar на внешнем USB-жёстком диске, смонтированном в /media/usb, нужно ввести tar –cvf /media/usb/backup.tar /home, как показано в следующем примере:
openSUSE:/ # tar -cvf /media/usb/backup.tar /home
tar: Removing leading '/' from member names
/home/
/home/tux/
/home/tux/.gftp/
/home/tux/.gftp/gftp.log
/home/tux/.gftp/bookmarks
/home/tux/.gftp/gftprc
/home/tux/.nautilus/
/home/tux/.local/
/home/tux/.local/share/
...
Обратите внимание, что в данном примере отображается сообщение tar: Removing leading '/' from member names. При создании tar-архива абсолютные пути по умолчанию преобразуются в относительные, поэтому ведущий символ / удаляется.
С утилитой tar можно использовать параметры, перечисленные в таблице 10-2.
| Параметр | Функция |
|---|---|
–A, --concatenate |
Добавляет tar-файлы к существующему архиву. |
–c, --create |
Создаёт новый архивный файл. |
–d, --compare |
Определяет различия между архивным файлом и файлами в файловой системе. |
-J, --xz |
Выполняет одно из двух действий. При создании архива сжимает новый tar-архив с помощью утилиты xz. При извлечении — сначала распаковывает tar-архив с помощью xz. |
–P, --absolute-names |
Запрещает tar удалять ведущий символ / из имён файлов. |
–r, --append |
Добавляет файлы в конец tar-архива. |
–t, --list |
Выводит содержимое архивного файла. |
–u, --update |
Добавляет файлы только если они новее существующих файлов в архиве. |
–x, --extract |
Извлекает файлы из архива. |
–z, --gzip, --gunzip |
Выполняет одно из двух действий. При создании архива сжимает новый tar-архив с помощью утилиты gzip. При извлечении — сначала распаковывает tar-архив с помощью gunzip. |
–j, --bzip2, --bunzip |
Выполняет одно из двух действий. При создании архива сжимает новый tar-архив с помощью утилиты bzip2. При извлечении — сначала распаковывает tar-архив с помощью bunzip2. |
–X имя_файла, --exclude-from |
Исключает из архива файлы, перечисленные в указанном текстовом файле. |
Таблица 10-2. Параметры команды tar
Примечание
Сжимать и распаковывать tar-архивы (и любые другие файлы) можно непосредственно из командной строки с помощью утилит gzip и gunzip, утилит bzip2 и bunzip2, а также утилиты xz. Архивные файлы, сжатые bzip2 вместо gzip, как правило, имеют расширение .bz2 вместо .gz. Архивные файлы, сжатые xz, обычно имеют расширение .xz или .lzma.
Чтобы создать резервную копию на стриммере вместо USB-диска, достаточно заменить параметр имени файла в команде tar именем устройства стриммера. В большинстве дистрибутивов первый SCSI-стриммер в системе адресуется через /dev/st0. Таким образом, для выполнения той же резервной копии, что и в предыдущем примере, но с отправкой на SCSI-стриммер, нужно ввести tar –cvf /dev/st0 /home.
Для восстановления из tar-архива достаточно ввести tar –xvf имя_файла. Например, чтобы извлечь созданный нами архив, нужно ввести tar –xvf /media/usb/backup.tar. Это извлечёт архив в текущий рабочий каталог. Если архив был сжат, можно также использовать параметр –z для его распаковки перед извлечением.
Помимо tar, для создания резервных копий можно использовать cpio.
Использование cpio (Using cpio)¶
Утилита cpio также может создавать архивные файлы аналогично tar. Ключевое отличие между tar и cpio состоит в том, что утилите cpio необходимо предоставить список файлов и каталогов для резервного копирования через стандартный ввод. Это можно сделать с помощью cat для отображения содержимого файла или путём формирования списка с помощью find или ls.
Предположим, вы хотите создать резервную копию содержимого каталога /home/tux/myproject в вашей Linux-системе. Для этого с помощью cpio нужно каким-то образом сформировать список файлов и каталогов в данном каталоге и передать его на вход cpio, а затем перенаправить вывод cpio в файл. Это можно сделать с помощью утилиты find. Нужно перейти в /home/tux/myproject и ввести find . –print –depth | cpio –ov > /media/usb/backup.cpio. Утилита find сформирует список всех файлов в текущем каталоге. Поскольку использован параметр –print, find выведет полное имя каждого файла на экран (стандартный вывод). Поскольку также указан параметр –depth, find проверяет содержимое каждого каталога перед его обработкой.
Совет
Если в каталоге MyProjects нет подкаталогов, более простой способ — ввести ls | cpio –ov > /media/usb/backup.cpio.
Здесь ключевым является то, что мы передали стандартный вывод find на стандартный ввод cpio по конвейеру. Утилита cpio использует его как список файлов и каталогов для архивирования. Параметр –o указывает cpio создать новый архив. Параметр –v включает подробный режим, отображая имя каждого файла и каталога по мере его обработки. Наконец, стандартный вывод cpio (архив) необходимо перенаправить в файл в файловой системе — это делается с помощью > и имени архивного файла.
Сжать архив cpio можно, добавив утилиту gzip в конвейер, например: ls | cpio –ov | gzip > /media/usb/backup.cpio.gz.
Для восстановления файлов из архива cpio запустите cpio из командной строки с параметром –i и укажите имя обрабатываемого архива. При этом файлы будут извлечены в текущий рабочий каталог. Например, созданный нами архив можно извлечь командой cpio –iv < /media/usb/backup.cpio, как показано ниже:
Если архив cpio был сжат с помощью gzip, перед извлечением файлов необходимо распаковать архив командой gunzip. Это показано ниже:
openSUSE:/media/usb # ls
backup.cpio.gz backup.tar
openSUSE:/media/usb # gunzip backup.cpio.gz
openSUSE:/media/usb # ls
backup.cpio backup.tar
Как видно, файл backup.cpio.gz распаковывается командой gunzip в файл backup.cpio, с которым теперь можно работать командой cpio. Другой способ — добавить параметр –c к команде gunzip и передать результат по конвейеру в cpio –i. Параметр –c предписывает gunzip записывать результат команды на стандартный вывод, не затрагивая исходный файл. По сути, это просто записывает имя распакованного файла на стандартный вывод, который затем передаётся в cpio для обработки. Пример:
openSUSE:/media/usb # ls
backup.cpio.gz backup.tar
openSUSE:/media/usb # gunzip -c backup.cpio.gz | cpio –i
341 blocks
openSUSE:/media/usb # ls
accessdb acpidump acpisrc backup.cpio.gz backup.tar
Как видно, команда gunzip извлекла имя файла, сжатого в gzip-архиве, и передала его команде cpio –i, которая извлекла три файла из архива в локальный каталог.
Прежде чем закончить главу, рассмотрим утилиту dd.
Использование dd для копирования данных (Using dd to Copy Data)¶
Команду dd можно использовать для преобразования и копирования файлов. С её помощью можно копировать самые разные данные Linux, включая целые разделы. Возможно, вы думаете: «Ну и что, я и так умею использовать cp и mv». На самом деле утилита dd весьма полезна. Ключевое отличие dd от других утилит копирования файлов заключается в том, что она копирует данные записями. Размер записи по умолчанию составляет 512 байт.
Рассмотрим сначала копирование файла с помощью dd. Синтаксис: dd if=входной_файл of=выходной_файл. Используйте параметр if= (input file, входной файл) для указания копируемого файла. Используйте параметр of= (output file, выходной файл) для указания имени нового файла. Пример:
openSUSE:/ # dd if=/home/tux/MyProject/acpidump of=/home/tux/acpidump.copy
29+1 records in
29+1 records out
15112 bytes (15 kB) copied, 0.000263331 s, 57.4 MB/s
Примечание
Размер записи по умолчанию можно изменить с помощью параметра bs=размер_блока.
Одна из замечательных особенностей dd состоит в том, что благодаря работе с записями она может скопировать целый раздел в единый файл. Это очень мощная возможность: по сути, dd — простой инструмент командной строки, позволяющий реализовать форму создания образов дисков. Есть знакомый мне большой знаток Linux — он использует dd в сценариях для создания собственных приложений создания образов. Весьма изящно!
Чтобы скопировать целый раздел, введите dd if=файл_устройства of=выходной_файл в командной строке. В качестве входного файла используется файл устройства раздела, а всё содержимое раздела записывается в указанный выходной файл. В следующем примере команда dd используется для копирования раздела /dev/sdb1 в файл с именем partitionbackup в домашнем каталоге пользователя root:
openSUSE:/ # dd if=/dev/sdb1 of=/root/partitionbackup
dd: writing to '/root/partitionbackup':
7500249+0 records in
7500248+0 records out
3840126976 bytes (3.8 GB) copied, 108.441 s, 35.4 MB/s
Команда dd может даже создать образ целого жёсткого диска. Синтаксис снова dd if=файл_устройства of=выходной_файл. Разница в том, что указывается файл устройства самого жёсткого диска, а не раздела. В следующем примере весь жёсткий диск /dev/sdb архивируется в файл drivebackup:
openSUSE:~ # dd if=/dev/sdb of=/mnt/bigdrive/drivebackup
16777216+0 records in
16777216+0 records out
8589934592 bytes (8.6 GB) copied, 157.931 s, 54.4 MB/s
Ещё одна полезная особенность dd — возможность создания резервной копии главной загрузочной записи (master boot record, MBR) и таблицы разделов жёсткого диска. Это возможно потому, что данные обрабатываются как записи. Синтаксис: dd if=файл_устройства of=выходной_файл bs=512 count=1. Это предписывает dd захватить только первый блок размером 512 байт жёсткого диска, в котором находятся MBR и таблица разделов. Пример:
openSUSE:/tmp # dd if=/dev/sda of=/root/mbrbackup bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0123686 s, 41.4 kB/s
Закрепим навыки резервного копирования в следующем упражнении.
Упражнение 10-2. Резервное копирование данных
В этом упражнении вы отработаете создание резервных копий данных. Упражнение можно выполнить с помощью виртуальной машины, поставляемой вместе с книгой. Запустите снимок 10-2 для правильно настроенной среды.
VIDEO Для ознакомления с порядком выполнения задания просмотрите видео к упражнению 10-2.
Выполните следующие шаги:
- Запустив систему, откройте сеанс терминала.
- Переключитесь на учётную запись root.
- В командной строке введите
tar –cvf /mnt/newdisk/backup.tar /home. - Введите
ls /mnt/newdisk. Убедитесь, что файл резервной копии существует. - Перейдите в каталог
/tmp, введяcd /tmpв командной строке. - Извлеките tar-файл в текущий каталог, введя
tar –xvf /mnt/newdisk/backup.tar. - С помощью команды
lsубедитесь, что файлы из tar-архива были извлечены в текущий каталог. - Вернитесь к своей обычной учётной записи, введя
exit.
Вы становитесь настоящим экспертом по Linux!