четверг, 7 февраля 2008 г.

Резервное копирование в Линукс

Оригинал: Linux Backups For Real People
Автор: Carla Schroder
Дата: 1-8 ноября 2007
Свободный перевод: Алексей Дмитриев
Дата перевода: 20 декабря 2007

При копировании материала обязательны указание автора, переводчика и ссылки на оригинал статьи и настоящую страницу как первоисточник перевода!

Часть 1

Оборудование для резервного копирования

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

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

Чтобы осуществлять резервное копирование по моей схеме вам понадобятся:
Сравнительно современный ПК с поддержкой USB 2.0
GParted - великолепная графическая программа для создания разделов
Сменное устройство накопления данных, как то: жесткий диск SATA или PATA, либо USB-накопитель, либо компактная Flash-карта.

Можно приобрести внешний контейнер для жестких дисков и подключить к нему любой SATA или PATA жесткий диск. Можно предпочесть готовый внешний жесткий диск. Такие диски зачастую поставляются с предустановленным Windows- или Mac- программным обеспечением, что не является проблемой, так как нам не нужны их дурацкие программы. Диски нужно переформатировать, ведь они могут быть в NTFS или иной ненужной нам файловой системе. Тут на сцену выходит GParted - лучшая графическая программа создания и форматирования разделов для всех платформ. Подключайте внешний накопитель, убедитесь, что он не примонтирован, и создавайте на нем любые разделы.

Проще всего отформатировать носитель в файловые системы FAT16 или FAT32. Дело в том, что указанные файловые системы не поддерживают никаких прав собственности и прав доступа к файлам, что означает легкодоступность резервных копий на любом компьютере. FAT16 не применяется для носителей размером более 512 Мб, так как она очень неэкономно расходует дисковое пространство.

Создание файловой системы при помощи программы GParted

В верхнем правом углу окна программы GParted находится выпадающее меню для выбора нужного физического диска. Если появился маленький значок замочка, то файловая система примонтирована. Ее необходимо отмонтировать. Можно попытаться сделать это при помощи меню, вызываемого правой кнопкой мыши, но иногда этот прием не срабатывает. Ваше графическое рабочее окружение наверняка имеет инструменты, позволяющие монтировать и отмонтировать файловые системы. Но с полной надежностью можно проделать это, дав в командной строке команду (как root):

# umount /dev/sdc1

GParted сообщит вам правильное имя устройства (в примере - sdc1).
Потом нажимаем GParted -> Refresh Devices, и можно приступать к созданию разделов и форматированию их.

Как дать устройствам постоянные имена

Разные дистрибутивы Линукса по-разному настраивают udev - программу, управляющую устройствами. Вполне возможно, что одному и тому же сменному накопителю при подключении каждый раз будут присваиваться различные имена. Нас такое положение дел не может устроить, так как для использования их в качестве носителей резервных копий, они должны иметь постоянные имена.
Чтобы решить задачу, нужно внести изменения в конфигурацию udev. Ubuntu, Fedora, Red Hat, Mandriva, PCLinuxOS и многие другие дистрибутивы Линукс решают проблему, присваивая уникальную метку тома (label) нужному разделу.

Разберем на примере:
Допустим, для резервного копирования вы используете карту Compact Flash. Для разных файловых систем существуют разные инструменты; если мы используем файловые системы FAT16/32, то нам понадобится пакет mtools. Для начала нужно присвоить файловой системе какую-либо букву в стиле Windows, пусть это будет буква "u". Для этого в файл /etc/mtools.conf вписываем следующие строки:

# Lexar compact flash
drive u: file="/dev/sdc1"

Теперь в консоли, в командной строке, присваиваем устройству метку тома (label):

#  mlabel u:
Volume has no label
Enter the new volume label : backup1

Проверим правильность полученного:

$ mlabel -s u:
Volume label is BACKUP1

Теперь при подключении вашей Флеш-карты, она будет всегда автоматически монтироваться в директорию /media/BACKUP1. (Не пугайтесь заглавных букв, эта метка и не думает на вас кричать).

Что делать, если ваш дистрибутив всего этого не делает? Вскоре мы подобно разберем настройки udev, а пока придется обратиться к старому доброму файлу /etc/fstab. Сперва создаем директорию /media/backup1, затем вписываем в /etc/fstab следующие строки:

Монтировать придется вручную, причем рядовой пользователь сможет монтировать и размонтировать устройство следующими командами:

$ mount /media/backup1
$ umount /media/backup1

Не переживайте, наша схема резервного копирования легко управится с этим.

Часть 2

Резервное копирование для одного пользователя

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

Я подразделяю резервное копирование на две категории: резервное копирование системных файлов и резервное копирование файлов данных. Эта статья посвящена исключительно последним. Для клонирования системы и ее экстренного восстановления существуют простые специальные программы типа MondoRescue.

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

Размер носителя должен минимум вдвое превышать суммарный размер файлов, подлежащих резервному копированию. Графические файловые менеджеры сообщат вам размеры директорий, хотя я предпочитаю добрые старые команды du (disk used - использовано на диске) и df (disk free - свободно на диске), потому что они работают быстро и одинаково на любом дистрибутиве Линукса. Запускайте эти команды в терминале, чтобы выяснить, сколько свободного и занятого места в ваших файловых системах:

$ df -hlx tmpfs
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 14G 2.4G 11G 18% /
/dev/sda1 31G 9.3G 21G 32% /home
/dev/hda2 4.5G 543M 3.8G 13% /var

Для отдельных файлов и директорий нужна команда du, как в этом примере с моей директорией finances:

$ du -hs finances
8.2M finances

А если нужна подробная распечатка директории с размерами всех подкаталогов, то опустите опцию -s.

Создание пробной резервной копии

Проведем пробное резервное копирование на USB носитель, используя имена устройств из части 1 данного руководства. Подключим носитель, затем скопируем на него две директории, используя команду rsync. Как вы помните, мы отформатировали носитель в FAT16/32, так что с командой rsync применим специальные опции для файловой системы FAT. В следующем примере я скопирую директории finances и configs, указывая полный абсолютный путь к этим директориям:

Тильда, ~, это общепринятое сокращение для домашней директории (/home). На экране промелькнут имена файлов, затем появится итог:

sent 8306732 bytes  received 1270 bytes  3323200.80 bytes/sec
total size is 8301576 speedup is 1.00

Теперь откройте директорию /media/BACKUP1 и полюбуйтесь на ваши резервные копии файлов. Они выглядят как обычные файлы, каковыми в действительности и являются, их можно просматривать и копировать как обычно.

Следите за замыкающими слэшами (/)! Их не должно быть, так что я напечатаю /media/BACKUP1/finances и /media/BACKUP1/configs. Если бы я напечатала finances/ и configs/ вместо этого, то получила бы /media/BACKUP1 без двух директорий, зато с файлами, которые находились в этих директориях.

Теперь попробуйте крутую штуку: нажмите стрелочку вверх, чтобы снова повторить команду rsync, и нажмите enter, чтобы снова выполнить ее. Вы увидите нечто вроде:

Отметьте разницу в размере показателя "sent" (отправлено). Эта разница свидетельствует о том что "заклинание" rsync сработало правильно, и во второй раз были переданы только изменения, произошедшие после первого раза.

Опция:
-r означает рекурсивно,
-v означает "комментируя свои действия",
-l копирует симлинки ("мягкие" ссылки),
-t фиксирует время модификации,
--modify-window=1 устанавливает односекундный интервал между временем модификации оригинала и копии.
Последние три опции необходимы для FAT16/32. Если вы опустите опцию -t, то команда rsync просто скопирует файлы, вместо того, чтобы передать лишь изменения. Файловая система FAT16/32 по умолчанию оперирует двухсекундными интервалами времени, и необходима преобразующая опция --modify-window, для установления односекундного интервала.

Команда rsync имеет полезную опцию --dry-run, которую стоит применять в случае неуверенности. Команда сработает "вхолостую" - будет видно, что произойдет, но никаких изменений в файловую систему при этом внесено не будет.

Rsync: усовершенствуем заклинание

Команда rsync имеет множество опций, их можно посмотреть в man rsync. Приведу несколько наиболее полезных:

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

--exclude-from=[filename]
Исключить. Можно создать файл filename, в котором перечислены типы файлов, не подлежащие резервному копированию. Их нужно указывать по одному на строке, вот так:
*.tmp
*.temp
*.bak

--include-from=[filename] Включить. Можно использовать эту опцию для перечисления директорий, подлежащих копированию, только нужно делать это предельно аккуратно и правильно. Иначе опция не будет работать, и вы примкнете к армии печальных, потерянных людей, бороздящих просторы Google, пытаясь найти ответы. Я копирую директории /home/carla/finances и /home/carla/configs. Для этого я прописываю в файле rsync-includes следующие строки:
+ /finances
+ /finances/**
+ /configs
+ /configs/**
- *
Двойные звездочки гарантируют, что все суб-директории также будут скопированы.
Затем я называю родительскую директорию в команде rsync следующим образом: /home/carla/*.

Есть и другие способы использования опций --include-from и --exclude-from, но сегодня мы остановимся на этом.

Теперь сведем все заклинание вместе:

Довольно длинная строка, чтобы печатать ее каждый раз, так что создадим для команды псевдоним (alias):

Теперь, чтобы начать резервное копирование, достаточно напечатать backup1. И нажать Enter. Можно делать это так часто, как вам хочется. При работе с важным документом, можно запускать команду backup1 так же часто, как команду "save" (сохранить).

Ресурсы:
man 1 rsync
man 1 df
man 1 du
man 1 bash чтобы узнать про alias

Часть 3

Простое резервное копирование в сетях

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

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

Сперва сохраним наше заклинание для команды rsync из второй части статьи в командный файл, так называемый скрипт оболочки (shell script) и дадим ему легко запоминающееся имя, скажем, backupscript:

Если у вас проблемы с использованием опций --include-from и --exclude-from и с файлами rsync-includes и rsync-excludes, для вас есть более простой путь - просто перечислить все директории и файлы, подлежащие резервному копированию вот так:

rsync -rlvt --modify-window=1 \
/home/carla/thisdirectory \
/home/carla/thatdirectory \
/home/carla/filename \
/media/BACKUP1

Как видно из примера, необязательно перечислять их в одной строке. Обратный слэш (\) сообщит оболочке Bash, что вы переносите команду на следующую строку. Если же вы решите печатать в одной строке, следите, чтобы эта строка была непрерывной.

Теперь нужно сделать наш текстовой файл исполняемым, т.е. превратить его в скрипт:

$ chmod +x backupscript

Создание значка в меню

И Gnome и KDE имеют редакторы меню, которыми и воспользуемся, чтобы добавить наш скрипт в меню и снабдить его соответствующим значком.

Вот как это сделать в Gnome:
Найдите редактор меню в вашем системном меню, либо вызовите его командой alacarte. Щелкните мышью на строке того меню, в которое желательно поместить наш скрипт. Затем нажмите кнопку New Item (Новый элемент или Новый пункт меню). Кнопка Icon (Значок или Иконка) предоставит вам богатый выбор значков. Введите название, типа MyBackup или нечто вроде того. Затем пропишите в окошке Команда буквально следующую строку (только подставьте свое имя домашнего каталога):

gnome-terminal -x /home/carla/backupscript

Если вам необходимы привилегии суперпользователя для запуска скрипта, то пропишите следующее:

gnome-terminal -x su - -c '/home/carla/backupscript' root

Рисунок 1

На рисунке 1 видно, как это должно выглядеть. Не ставьте галочку в окошко 'Run command in a terminal' (Запускать в терминале). Теперь откройте gnome-terminal и перейдите в 'Edit-Current Profile' (Редактировать профиль). На вкладке 'Title and Command' (Название и команда) выберите 'When command exits: Hold the terminal open' (По завершении оставить терминал открытым). Если этого не сделать, то терминал по завершении команды немедленно закроется, и вы не увидите вывод команды. Если же вы не желаете, чтобы такое поведение стало поведением по умолчанию, то используйте раздел 'File-New Profile' (Новый профиль), чтобы создать новый профиль и дать ему понятное имя типа stayopen. Тогда прописать нужно следующее:

В KDE:


Рисунок 2

Откройте редактор меню, который также можно вызвать командой kmenuedit. Можно щелкнуть правой кнопкой мыши на значке главного меню в левом углу панели. Выберите меню, в которое хотите включить скрипт запуска резервного копирования. Укажите полный путь к вашему скрипту, включите опцию 'Run in Terminal' (Запускать в терминале), и введите опцию --noclose. Если нужны права суперпользователя, включите 'Run as a different user' (Запускать от имени другого пользователя) и введите 'root'. Все должно выглядеть как на рисунке 2.
Сохраните свои изменения и дело сделано.

Теперь нажмите вашу новенькую кнопку резервного копирования и увидите нечто похожее на рисунок 3.


Рисунок 3

Автоматизированное и сетевое резервное копирование

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

Допустим, что съемный диск подключен к ПК по имени Penguina. Вы, как положено фанату Линукса, имеете локальный DNS и можете проверить удаленный логин следующим образом:

$ ssh backup@penguina
backup@penguina's password:

Можно использовать также IP адрес, если этот адрес статический.

Мы не хотим появления приглашения ввести пароль, так как это сделает невозможным автоматическое резервное копирование по расписанию, так что мы используем SSH public key authentication. Это легко наладить - следуйте инструкциям раздела "Public-Key Authentication" из руководства The (Practically) Ultimate OpenSSH/Keychain Howto,
только не вводите фразу-пароль!

Теперь давайте модифицируем наш файл backupscript, вернее его последнюю строку, для доступа к удаленному диску. Теперь ее окончание должно выглядеть так:

backup@penguina:/media/BACKUP1/carla

Обратите внимание на добавление новой директории "carla". Поскольку сетевой диск является общим, вы, вероятно, выделите каждому пользователю по отдельной директории.
Команда rsync создаст их для вас. Помните, никаких замыкающих слэшей! (См. часть 2 по этому поводу). Синтаксис простой:

login-name@hostname:/полный-путь-к-директории

Что касается резервного копирования по расписанию без участия человека, то это просто, как дважды два.
Сделаем запись в файле /etc/crontab - замечательно простой способ использовать cron. Следующий пример запускает скрипт резервного копирования каждый рабочий день в 23:05:

23 5   * * 1-5   carla /home/carla/backupscript

Для знакомства с опциями смотрите man 5 crontab.

Диагностика и ссылки

Помните, если что-то идет не так, "разговорчивость" выхода команды rsync можно повысить, давая несколько опций "-v", вот так: -vv. Не забывайте также об опции --dry-run (холостой прогон) для тестирования правильности команды. man rsync отличается тщательностью и детальностью, а поиски в Интернете дадут сотни статей про команду rsync.
Гуру дадут вам еще множество способов усложнить и усовершенствовать команду rsync, что вы тоже сможете проделать.

Мы же в этой статье ставили задачу выработать простой портативный метод создания резервных копий, использующий универсальные утилиты Линукс (OpenSSH, rsync, scripting, и udev), и применимый на любой Линукс системе. Еще важнее, что резервные копии легко доступны - вы можете подключить съемный диск к любой Линукс или Виндоуз машине и восстановить информацию. Этот метод будет работать также на выделенном для резервных копий сервере, хотя для этого существуют лучшие и более безопасные методы, о которых мы поговорим когда-нибудь в будущем.

Ресурсы:

rsync

OpenSSH

Easy Automated Snapshot-Style Backups with Linux and Rsync

Моя личная поваренная книга Linux
содержит неплохую статью про создание резервных копий и восстановление поврежденных файлов.

Комментариев нет: