Backup LXC контейнеров

2016-12-24

Я уже постил пару туториалов про 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/sh

if [ ! -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 lxc

echo "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.

Вроде всё. Будем надеяться, бэкапы не пригодятся :).


В массы

В трубу