Я уже постил пару туториалов про LXC-контейнеры в домашнем хозяйстве. Желающие могут ознакомиться, ну а кому TL;DR - LXC - это легковесная виртуализация, позволяющая создавать контейнеры с Linux под конкретные задачи, будь то веб-сервер, “почтовик”, ну или просто когда чешется попробовать какой-нибудь новый дистрибутив.
Допустим, кто-то повторил опыт с установкой LXC и желает сохранить результаты трудов на случай, если “всё пойдет в разнос”. Для этого я набросал простейший скриптик для бэкапа контейнеров в произвольный фолдер. Это может быть локальный Dropbox, ну или внешний диск.
Для начала немного теории - в общем случае структура контейнеров имеет такой вид:
- /var/lib/lxc/container-name
- /var/lib/lxc/container-name/rootfs
- /var/lib/lxc/container-name/config
Отрадно, что все “запчасти” лежат в папке “container-name”. Более того, если кто-то использует lvm в качестве бэкенда - то и том тоже будет иметь название “container-name”, ну то есть путь к нему будет такой: /dev/your-volume-group/container-name.
Этим мы и воспользуемся. Вот собственно, скрипт:
#!/bin/shif [ ! -f /var/raid/.mounted ]; then
echo "RAID not mounted, exiting…"
exit 1
fi
echo “Stopping lxc containers…“
systemctl stop lxc
timestamp=$(date +”%Y-%m-%d”)
VMs="torrent tor apps owncloud"
for vm in $VMs; do
echo "Mounting root to /var/lib/lxc/${vm}/rootfs"
mount -o ro /dev/ssd/${vm} /var/lib/lxc/${vm}/rootfs
tar -cpzf /var/raid/vm_backup/${vm}-${timestamp}.tar.gz /var/lib/lxc/${vm}/
echo "Unmounting …"
umount /dev/ssd/${vm}
done
echo "Starting lxc containers…"
systemctl start lxcecho "Backing up scripts…"
tar -cpzf /var/raid/vm_backup/scripts-${timestamp}.tar.gz /usr/local/bin/lxc.sh
echo "Cleaning files, older than 2 weeks…"
find /var/raid/vm_backup/ -mtime +15 -exec rm {} ;echo "Syncing disks…"
sync
Для начала убеждаемся, что диск, куда будем складировать данные подключен. Перед бэкапом один раз создадим файлик “.mounted”
#touch /var/raid/.mounted
Теперь мы точно знаем, что диск подключен, перед бэкапом.
Дальше - можно тормозить контейнеры. Чтобы не гасить их по одному - остановим сервис “lxc”. Он погасит нам контейнеры, запущенные в автостарте.
Следующий шаг - вычислим timestamp, чтобы файлики были с временной отметкой.
Затем делаем список виртуалок - у меня их 4: торрент, приложения, owncloud и tor. Идём по списку.
- Монтируем логический том в папку rootfs, если кто-то использует просто папки - этот шаг можно закомментировать.
- Пакуем всю виртуалку и конфиг с опцией “p” - это сохранит маски прав корректно.
- Отмонтируем том, опять-таки это можно пропустить, если используется обычная папка, а не LVM.
Дальше контейнеры можно запускать обратно. В принципе на этом можно прерваться, но у меня есть ещё кучка скриптов, настраивающих сеть на виртуалках. Они лежат в /usr/local/bin и в имени есть метка “lxc”. Их тоже пакуем. Ну и финальный штрих - синхронизируем диски.
Восстановить данные очень просто - достаточно распаковать архив и не забыть использовать опцию tar “numeric-owner”, чтобы не порушить права и владельца.
У меня данный скрипт работает еженедельно. Данные с owncloud лежат отдельно от виртуалки, так что их нужно копировать отдельно, например обычным rsync.
Вроде всё. Будем надеяться, бэкапы не пригодятся :).