Материал просмотрен 7,087 раз(а)

По ходу работы с нашим сервером на FreeBSD частенько возникала мысль о резервном копировании и восстановлении системы. Мало ли что, экспериментов много разных ставим, снэпшоты в виртуальной среде – вещь хорошая, но в реальности этого не хватает, и тут уже придется самостоятельно позаботиться о резервном копировании данных и об оперативном восстановлении.

Кроме этого, такая задача может возникнуть в случае, если нужно перенести рабочую систему на другую аппаратную платформу (например, замена жесткого диска, переезд на другой сервер), да мало ли какие случаи бывают. Знать нужно. Уметь нужно. И сейчас мы вместе с Вами займемся этим.

Исходная система – FreeBSD 8.2, собрано своё ядро GATEWAY (на сайте я расписывал, как это делается), подняты базовые службы (SSH, APACHE, SQUID), в общем не скрою, сервер продакшн, т.е. боевой. Буду переносить из реальной среды в виртуальную машину с сохранением всего функционала.

Шаг 1. Сохраняем (распечатываем) разметку диска, это может очень пригодиться.

Конфигурация разделов

Вывод команд:

# bsdlabel ad0s1

И

# cat /etc/fstab

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

Бэкапить мы будем корневой раздел /, раздел /var и раздел /usr. Итого – три архива. Запишите себе, что корневому разделу соответсвтует символ [a], usr – [f], var – [d]. Если не очевидно, то это значение стоит после указания диска: /dev/ad0s1[буква]. Вот соответствие этих букв разделам очень для нас важно. Когда мы сохранили вывод команд, начинаем снимать архивы.

Для архивирования воспользуемся утилитой dump. С помощью нее сделаем «снимок» состояния файловой системы на работающей системе, а потом этот снимок сожмем в один файл.

Шаг 2. Архивирование.

Выполняем последовательно команды:

# dump -0Laf - / | gzip -9 > /home/ftp/root.img.gz
# dump -0Laf - /var | gzip -9 > /home/ftp/var.img.gz

Изымаем файлы root.img.gz и var.img.gz из каталога ftp на съемный жесткий диск,
# mkdir /mnt/usb
# mount_ntfs /dev/da0s1 /mnt/usb/
# mv /home/ftp/*.img.gz /mnt/usb/
После этого архивируем раздел /usr аналогично,

# dump -0Laf - /usr | gzip -9 > /home/ftp/usr.img.gz 
И изымаем его.

# mv /home/ftp/usr.img.gz /mnt/usb/
# umount /mnt/usb
Конечно можно изъять архивы и иным способом, например по ftp (у меня каталог ftp именно для этого), но это уже на ваше усмотрение.
Вопрос: для чего мы изъяли два архива, а потом бэкапили третий. Почему нельзя было сперва забэкапить все три, а потом все три вытащить?
Отвечаю. Дело в том, что каталог /home во FreeBSD является символической ссылкой на /usr/home. Фактически, мы бы вложили в архив usr.img.gz всё, что есть на разделе /home/ включая два первых архива, произошло бы дублирование и наш архив вырос бы в размере.
Конечно, сперва можно было бы снять раздел /usr, а потом уже /var и /, тогда всё было бы нормально, но я сделал именно так, чтобы объяснить разницу. Будьте внимательны, если архив получается неоправданно большим, возможно вы в него рекурсивно запаковываете его же самого или другие архивы.
Надеюсь, это разобрали. Итак, разберем подробней команды бэкапа. На примере последнего:
# dump -0Laf - /usr | gzip -9 > /home/ftp/usr.img.gz
Как мы видим, здесь происходит следующее: запускается команда dump с ключами 0Laf – /usr
  • 0 – означает самый полный режим бэкапа, он гарантирует, что файловая система будет скопирована максимально полно.
  • L – означает создание бэкапа из снапшота. Т.е. сперва создается снимок системы, а потом уже этот снимок пакуется в dump. Т.е. можно не перезагружаться в Single Mode а проводить бэкапирование прямо на работающем сервере.
  • a – автоматический размер архива, пока не закнчится место.
  • f – файл вывода. В качестве файла здесь указан -, т.е. передается стандартное устройство вывода (экран).
  • /usr – тот «раздел», который мы «бэкапим».

Далее наш вывод на экран по конвейру передается утилите gzip, сжимающей данные, с параметром -9 (самая лучшая степень сжатия) и перенаправлением в файл /home/ftp/usr.img.gz. Вот так всё просто.

Создали дамп
Шаг 3. Восстановление из бэкапа.
Вообще, все мануалы по резервному копированию не стоят ничего, если нет примера возвращения сервера в рабочее состояние используя созданные ранее бэкапы. По сути что – всего лишь команда dump. А что теперь с этими архивами делать, если сервер приказал долго жить? Вот именно сейчас и начинается самое интересное. Мы будем восстанавливать сервак.
Для этого я создал новую виртуальную машину с чистым диском объемом 6 Гб. Никакую операционку туда я не ставил, её мы получим на выходе из архивов.
Итак. Диск пуст, подключаем туда установочный диск FreeBSD:
Установочный диск FreeBSD
Выбираем любой язык, хоть US, это сейчас не важно.
Переходим в пункт Custom.
Заходим в Custom
Там идём в 3: Partition 
FreeBSD Fdisk
Создаем слайс (A – Use Entire Disk) – используем весь диск.
Добавляем слайс
Предварительно, для чистоты эксперимента слайс можно удалить (D). После того, как создали слайс, нажимаем (Q).
Стандартный загрузчик нас устроит вполне.
Стандартный загрузчик
Затем переходим в пункт 4: Label, где можно раскидать точки монтирования.
Точки монтирования
Создаем точки с размерами произвольными, но именно в таком порядке*.
Первым делом создаем корневой раздел, он получает букву [a]. Вот тут на помощь придет тот файл, который мы создали перед бэкапом – карта разделов, где понятно, какой точке монтирования какая буква присвоена.
Своп у нас [b], значит вторым создаем своп. Размеры могут быть иные, это сейчас не так важно, главное, чтобы распакованные файлы уместились.
Под [c] у нас логичесий раздел (равный сумме всех следующих), поэтому просто пропускаем.
Дальше [d]. Это /var. Создаем раздел /var.
Потом /tmp, а потом уже /usr с буквами соответственно [e] и [f].
Точки монтирования
*вообще говоря, создавать можно произвольно, а буквы потом переправить в файле /etc/fstab, но это уже дополнительные фишки. То есть нет ничего страшного, если вы создадите разделы по другому, всегда можно переправить текстовый файлик и всё будет работать как прежде. 
Когда разделы созданы, нажимаем W (записать изменения) и Q (выйти). Больше нам тут ничего не нужно, покидаем установщик Sysinstall и вытаскиваем диск FreeBSD Install.
Выход из установки
Ставим Livecd Frenzy (фряха лайф-сд)
Грузим Frenzy
Вот и появилось приглашение, будем работать.
Приглашение Frenzy
Сперва отмонтируем все примонтированные разделы диска в /mnt/ Они имюет буквы от a до f (как мы и создавали на предыдущем этапе), поэтому можно использовать такой хитрый приёмчик:
# umount /mnt/ad0s1[a-f].ufs
Отмонтируем разделы
Теперь создаем новые файловые системы на разделах [a], [f], [d]. Обратите внимание, что команда вводится так:
# newfs /dev/ad0s1a
# newfs /dev/ad0s1f
# newfs /dev/ad0s1d
После этого при примонтировании легко убедиться, что разделы пусты.
Создаем файловые системы
Примонтируем раздел [a], который будет корневым:
# mount /dev/ad0s1a /mnt/ad0s1a.ufs
Теперь подключаю USB диск, на котором хранятся бэкапы.
Примонтировали USB
Их будем распаковывать на вновь примонтированные разделы. Итак, создаем папку для монтирования съемного диска и примонтируем его:

# mkdir /mnt/usbdisk
# mount_ntfs /dev/da0s1 /mnt/usbdisk
Так как на диске NTFS, используем программу mount_ntfs.
Непосредственно распаковываем архив с диска на вновь примонтированный раздел:
# gzip –d –c /mnt/usbdisk/root.img.gz | (cd /mnt/ad0s1a.ufs/ ; restore –rf - ) 
Этой командой мы распаковываем (-d) архив /mnt/usbdisk/root.img.gz и передаем содержимое в канал следующей команде.
Но сперва нужно перейти в каталог, куда требуется распаковать, так как restore распаковывает в текущий каталог (поэтому делаем предварительно cd /mnt/ad0s1a.ufs), а потом ресторим –r из входящего потока –f – то, что получено из команды gzip.
Всё готово
Такой вот конвейер данных. Распаковка корневого раздела завершилась. Теперь, то же самое проделаем для /var и /usr
# gzip –d –c /mnt/usbdisk/var.img.gz | (cd /mnt/ad0s1d.ufs/ ; restore –rf - )
# gzip –d –c /mnt/usbdisk/usr.img.gz | (cd /mnt/ad0s1f.ufs/ ; restore –rf - )
Здесь очень важно не перепутать буквы и архивы, поэтому и нужно составить точное соответствие. Когда всё готово – отмонтируем все диски и перезагружаемся. Система заработает как родная, правда придется немного подправить конфиги /etc/rc.conf и несколько других, так как у меня изменились названия сетевых интерфейсов, но это мелочи.