Как сделать резервное копирование / перемещение контейнеров LXC?

Я хочу взять резервную копию контейнера для lxc. У нас есть сервер с 12.04 LTS ubuntu server и я установили LXC - 1.0.0.alpha2 в нем. Я хотел обновить наш сервер ubuntu до 14.04 LTS. Итак, что я хочу сделать, это создать резервные копии контейнеров LXC - > обновить ОС до 14.04 - > восстановить контейнеры LXC. С более ранней версией (0.7.5 я думаю) был lxc-backup и LXC-restore, но с 1.0.0.alpha2 у нас нет операций резервного копирования и восстановления. Как я могу сделать резервную копию контейнеров lxc. Я провел более 3 часов с контейнером для копирования папка (/var/lib/lxc/ my_container/) в pendrive и вставьте его в другой 12.04 LTS сервер, но он не работает ошибка я получаю,

#sudo lxc-start -n my_container
lxc-start: invalid sequence number 1, expected 4.
lxc-start: failed to spwan "my_container"

тогда как я могу ожидать, что он будет работать в обновленной 14.04 server OS.

любая идея иметь резервную копию lxc-контейнера?

4 ответов


EDIT: 29 марта 2016

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

если вы хотите резервное копирование ваши контейнеры LXC, см. ответ @Stuart для некоторых больших вариантов.

перемещение контейнеров LXC между хост-системами

вот как я переношу контейнеры LXC между системами. Я успешно переместил контейнеры ubuntu 12.04 на хост 14.04, и они отлично работают.

  • выключение контейнер

    # lxc-stop -n $NAME
    
  • архивный контейнер rootfs & config

    # cd /var/lib/lxc/$NAME/
    # tar --numeric-owner -czvf container_fs.tar.gz ./*
    

    на --numeric-owner флаг-это очень важно! Без него контейнер может не загружаться, потому что uid/gids искажаются в извлеченной файловой системе. когда tar Создает архив, он сохраняет пользователя / группу информация о собственности. По умолчанию при извлечении tar пытается разрешить имена владельца пользователя/группы архива с идентификаторами в системе, в которой выполняется tar. Это предназначено для обеспечения разрешения права собственности пользователя в новой системе, если числовые значения UID отличаются между системами.

    это плохо для файловой системы LXC, потому что числовое владение uid/gid предназначено для сохранения для всей файловой системы. Если он будет разрешен для другого значения, плохо всякое случается.

  • скопируйте файл на новый сервер

    # rsync -avh container_fs.tar.gz user@newserver:/var/lib/lxc/
    
  • извлечь rootfs

    # mkdir /var/lib/lxc/$NAME/
    # cd /var/lib/lxc/$NAME/
    # tar --numeric-owner -xzvf container_fs.tar.gz .
    

если вы используете контейнер с поддержкой наложения, вам также необходимо перенести контейнер, который основан на этом новом. Наконец, вы можете увидеть несколько предупреждений о пропущенных файлах сокетов:

tar: /var/lib/lxc/$NAME/rootfs/dev/log: socket ignored

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


EDIT: ноябрь 2017

для резервного копирования lxc контейнер быстро к remote хоста без btrfs файловая система я монтирую файловую систему из remote хоста sshfs & cd на гору. Остановите контейнер и создайте tar.xz архив.


EDIT: март 2016

теперь я запускаю свой lxc контейнеров на btrfs файловой системы, чтобы сделать его проще взять snapshot работает стеклотара. btrfs sub snap обнаруживает proc run sys являются виртуальными файловыми системами и не включают их в снимок.


я использую Duply для резервного копирования контейнеров LXC. В отличие от резервного копирования нормальной машины вы DO хотите включить /dev из контейнера LXC в резервной копии.

apt-get install duply
duply mybackup create

на ~/.duply/mybackup/exclude я:

- /cdrom
- /dev
- /lost+found
- /media
- /mnt
- /proc
- /run
- /sys
- /tmp
- /var/backup/restore/*
- /var/backup/tmp/*
- /var/lib/lxc/*/rootfs/lost+found
- /var/lib/lxc/*/rootfs/media/*
- /var/lib/lxc/*/rootfs/mnt/*
- /var/lib/lxc/*/rootfs/proc/*
- /var/lib/lxc/*/rootfs/run/*
- /var/lib/lxc/*/rootfs/sys/*
- /var/lib/lxc/*/rootfs/tmp/*
- /var/lib/lxcfs/*

вышеуказанное подперет всю машину & все контейнеры LXC.

просто резервное копирование контейнеры редактировать ~/.duply/mybackup/conf и SOURCE='/' to SOURCE='/var/lib/lxc' & удалить не lxc линии из ~/.duply/mybackup/exclude

протестировано с помощью running контейнеры Alpine Linux LXC - также будет работать на Debian.

простые резервные копии с Duply - вы также можете просто сделать очень простые незашифрованные резервные копии в локальный файл (set TARGET='file://[relative|/absolute]/local/path' на ~/.duply/mybackup/conf)

подписать Duply резервные копии см. GnuPG в автоматизированных средах ( пароля ключа подписи, а не хранить пароль в открытом виде ).

Set GPG_TEST='disabled' в Duply conf файл для заданий cron.

если у вас не хранить любые пароли открытого текста в вашем conf do не отключить GPG_TEST on восстановление - так gpg-agent кэширует пароли.


Я согласен с Брэдом Jasperson. Я делаю это так:

lxc-clone -KMP /path/to/backup name name

Если что-то пойдет не так с вашим контейнером, и время простоя стоит много, вы можете запустить копию:

lxc-start -n name -P /path/to/backup

и

lxc-stop -n name -P /path/to/backup

вы можете скопировать его на место позже в подходящее время. Удачи!


Я нахожу самый простой способ резервного копирования контейнера - просто запустить lxc-clone.

lxc-clone -o NAMEOFCONTAINER -n NAMEOFCONTAINER -P BACKUPDIR

восстановление так же просто, как копирование или перемещение резервной копии обратно в /var / lib/lxc Вы также можете смолить его, чтобы сэкономить место.