LXC Linux Containers часть №5. Хранилище контейнеров, снимки, клоны

Оглавление

LXC-контейнеры совместимы с файловыми системами ZFS, Btrfs и томами LVM. При размещении контейнеров на хранилищах такого типа, будут использоваться их встроенные средства для создания моментальных снимков и даже задействована дедупликация (ZFS).

В случае, если хранилище контейнеров находится на томе с файловой системой Btrfs, средства администрирования LXC-контейнеров, будут создавать, логический подтом (subvolume) для каждого нового контейнера. Подобная ситуация и с LVM. В качестве хранилища может быть указанна группа томов (volume group) в которой автоматически будет создан логический раздел для создаваемого экземпляра ОС. Явно задать тип хранилища можно с помощью ключа -B. Вот как выглядит создание нового контейнера на этих хранилищах:

$ sudo lxc-create -t ubuntu -n u001 -B Btrfs

после выполнения команды, можно увидеть новый, одноименный под-том (subvolum) Btrfs:

$ sudo Btrfs subvolume list /var/lib/lxc

ID 256 gen 17 top level 5 path u001/rootfs

создать контейнер на LVM можно следующим образом:

$ sudo lxc-create -t ubuntu -n u001 -B lvm --vgname <имяГруппыТомов> --fssize 5G --fstype <типФайловойСистемы>

В качестве имени LV будет использовано имя контейнера, что удобно.

Что касается ZFS, то она не особо поддерживается в современных дистрибутивах Linux. Например, ее установка в Ununtu, не простая задача. По этой причине, я не стал ее использовать. На мой взгляд, использование Btrfs для хранения контейнеров, является самым оптимальным выбором. Это даст возможность использовать снапшоты максимально удобно без каких либо сложностей как в случае с LVM.

Создание снимков

Для управления моментальными снимками, предназначена утилита lxc-snapshot. Здесь, самым главным недостатком, является то, что при создании снимка, контейнер должен быть остановлен. То есть на лету, сделать снапшот не получиться. LXC не умеет сохранять состояние процессов и содержимое памяти в файл, по этому, снимок — это всего лишь копия файловой системы контейнера. Возможно, в будущем, ситуация изменится к лучшему.

Чтобы сделать снимок остановленного контейнера необходимо выполнить:

$ sudo lxc-snapshot -n u001

Созданные снимки помещаются в /var/lib/lxcsnap/<имяКонтейнера> под именами вида snap0, snap1 и так далее.

Посмотреть список доступных снимков можно добавив ключ -L

$ sudo lxc-snapshot -n u001 –L

В ответ система выдаст на экран что то подобное:

snap0 (/var/lib/lxcsnaps/u-001) 2014:02:04 17:12:12
snap1 (/var/lib/lxcsnaps/u-001) 2014:02:04 18:02:34

Откатиться к одному из них:

$ sudo lxc-snapshot -n u001 -r snap0

Так же, можно создать новый контейнер из снимка:

$ sudo lxc-snapshot -n u001 -r snap0 u002

Удалить снимок, поможет опция -d.

Клонирование

Как и в случае со снимками, клонировать можно лишь остановленный контейнер:

$ sudo lxc-clone -o <существующийКонт.> -n <новыйКонт.> -B Btrfs

Ключ —Bнеобходим, чтобы новому контейнеру был создан под-том, если используется Btrfs. Ключ -s (—snapshot) задействует механизм снапшотов файловой системы, вместо полного копирования, в результате чего, клонирование происходит мгновенно.

Существует возможность создавать связанные клоны (overlayfs).

$ sudo lxc-clone -o <существующийКонт.> -n <новыйКонт.> -B Btrfs

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

$ sudo Btrfs subvolume list /var/lib/lxc
ID 256 gen 17 top level 5 path u001/rootfs
ID 259 gen 16 top level 5 path s001/rootfs

при клонировании, в новом контейнере будет изменено имя системы и MAC-адреса сетевых интерфейсов. Данный механизм очень удобен и позволяет быстро развернуть множество однотипных экземпляров ОС.

Автозапуск контейнеров

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

lxc.start.auto = 0 или 1 (авто-включение активно и не активно соответственно)

lxc.start.delay = 0 (задержка в секундах)

lxc.start.order = 0 (произвольное числовое значение приоритета. чем выше значение, тем раньше запускается контейнер)

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