Правильный способ обработки контейнеров LXC на btrfs

11

Допустим, у нас есть один сервер с установленным lxc и контейнер lxc, используемый как базовый img /var/lib/lxc/ubuntu_base. Для простоты давайте забудем об изменениях конфигурации после копирования базы img.

некоторые люди предлагают использовать подобъемы и снимки для создания новых контейнеров, но можно легко сделать cp --reflink с одинаковыми результатами.

Итак, как лучше (или что лучше) управлять несколькими контейнерами?

  • моментальные снимки

Этот способ кажется лучшим, но такие команды, как lxc-destroy, не будут работать, так как он не сможет удалить каталог.

btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • cp с reflink

Я не уверен, есть ли разница в производительности между этим или снимками

cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • или есть какой-то другой лучший способ сделать это, о котором я не знаю.

редактировать:

Одна вещь, которую я видел с опцией reflink, состоит в том, что вы не можете удалить базовый контейнер, если работают другие, потому что /procи /devсмонтированы и никогда не меняются, так как ссылка всегда одинакова. Но закрытие всех скопированных контейнеров, кажется, помогает.

zidarsk8
источник
Я использовал функцию моментального снимка btrfs для создания новых контейнеров - и она работает хорошо (довольно быстрая подготовка и т. Д.). Тем не менее, btrfs имеет кэш страниц для каждого подобъекта - поэтому, хотя использование моментальных снимков является быстрым / эффективным с использованием дискового пространства, вы, вероятно, в конечном итоге получите несколько копий того, что фактически является одним и тем же двоичным файлом в памяти.
Дэвид Гудвин

Ответы:

2

Я на Ubuntu LTS 14 и только что запустил следующее (даже впервые), и это сработало как шарм:

lxc-stop -n ubuntu_base
lxc-clone -o ubuntu_base -n ubuntu_base_c1 -s
lxc-start -n ubuntu_base_c1 -d # make changes if needed
lxc-stop -n ubuntu_base_c1
lxc-snapshot -n ubuntu_base_c1

Использование -s с lxc-clone сделает снимок, если резервным хранилищем является btrfs (в вашем случае).

Проверьте новый клон / снимки с

lxc-ls -f
btrfs subvolume list /var/lib/lxc

Надеюсь, это поможет!

dapithor
источник
1
Обратите внимание, что в наши дни вам нужно указать btrfs в качестве резервного хранилища, когда вы запустите lxc-create или lxc-clone вместо этого даст вам overlayfs .
Лестер Чунг
Чтобы просто создать новый «легкий» контейнер, кажется, что двух первых строк достаточно (lxc-stop и lxc-clone), благодаря этой -sопции, и что три последних (lxc_start, lxc_stop, lxc_snapshot) являются просто вспомогательный процесс для управления будущим развитием контейнеров. Это правильно?
lalebarde
3

если вы будете использовать btrfs subvolumes для lxc, вам нужно добавить опцию user_subvol_rm_allowedв ваш /etc/fstab. Пример, извлеченный из одного файла fstab:

UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0

Опция позволит вам удалить subvol без прав root, только обычный пользователь. Эта возможность используется lxc, когда снимки идут в подобъемах btrfs

Йонси Солис
источник
3

Думаю, это зависит от того, насколько велик ваш базовый образ. Вероятно, я бы lxc-создал новый контейнер и использовал бы Salt / Puppet и т. Д., Чтобы подготовить свои контейнеры, и только lxc-clone для относительно больших контейнеров (например, контейнеров dev с множеством установленных и настроенных инструментов).

Обратите внимание, что lxc-clone будет использовать то же резервное хранилище, что и источник. Таким образом, чтобы использовать подобъем, вам нужно будет создать ваши контейнеры с "-B btrfs". Например:

lxc-create -B btrfs -n mycontainer -t ubuntu

Затем клонируйте его с помощью:

lxc-clone -s mycontainer mynewcontainer

Если вы используете zfs для хранения своих контейнеров, --zfsrootдля lxc-create есть дополнительная опция, так что вы можете выбрать zpool, отличный от «tank» по умолчанию. Например:

lxc-create -B zfs --zfsroot=data/lxc

Поделитесь и наслаждайтесь!

Лестер Чунг
источник
Я нахожусь на Debian Wheezy с BTRFS. Похоже, что опция -B btrfsиспользуется по умолчанию - я полагаю, потому что мой debian настроен с использованием BTRFS. На самом деле я создал свой первый контейнер (32-битный debian wheezy) без этой опции, и для него был создан подобъем.
lalebarde
@lalebarde, вероятно, -B bestв действии, но приятно знать!
Лестер Чунг