По ходу работы с нашим сервером на 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:
Выбираем любой язык, хоть US, это сейчас не важно.
Переходим в пункт Custom.
Там идём в 3: Partition
Создаем слайс (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 (фряха лайф-сд)
Вот и появилось приглашение, будем работать.
Сперва отмонтируем все примонтированные разделы диска в /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 диск, на котором хранятся бэкапы.
Их будем распаковывать на вновь примонтированные разделы. Итак, создаем папку для монтирования съемного диска и примонтируем его:
# 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 и несколько других, так как у меня изменились названия сетевых интерфейсов, но это мелочи.
Люблю такие инструкции на вашем сайте! Всё по шагам. Спасибо!! Напишите, как можно забытый пароль рута восстановить?
Интересная тема, будет отдельная статья, потому как много нюансов. А вообще – монтируете разделы, делаете чрут в примонтированный раздел и passwd root как-то так.