LXC контейнеры давно и прочно вошли в нашу жизнь. В нашей компании их количество исчисляется десятками. Контейнеры можно легко и быстро развернуть, настроить, но вот дальнейшее сопровождение начинает вызывать определенные затруднения. Обновления сервисов со временем начинают требовать более свежие версии библиотек. Это требует обновлений уже устаревших систем. И тут мы вспоминаем, что контейнер давно не обновлялся. Длительный период обновления контейнера может на время поломать работу запущенных в нем служб. Результат обновления может также оказаться непредсказуемым, т.к. обновляются сразу все пакеты. Есть ещё проблема занимаемого места на диске, ведь в каждом контейнере хранится копия портежей и скачиваемые пакеты.
Мы долгое время не обращали на это внимание, ведь у LXC есть собственные утилиты развертывания и настройки, пока проблема не стала отнимать значительное время. А это не то, к чему мы стремимся. Итак, представляем вашему вниманию новую утилиту cl-lxc. Программа написана на BASH и входит в состав пакета sys-apps/calculate-toolkit
начиная с версии 0.3.0
.
Особенности
- Поддержка обновления контейнеров из образа
- Уменьшения использования дисковой памяти
- Поддержка файловой системы Btrfs
Для обновления контейнеров, cl-lxc использует традиционный для Calculate Linux способ обновления из образа. Для этого раздел /var/calculate системы вынесен в отдельную точку монтирования. Перед обновлением программа подготавливается образ: развертывает и обновляет контейнер, устанавливает дополнительные пакеты, которые были установлены в обновляемой системе. После этого во время перезагрузки происходит замещение корня системы. Все данные остаются в /var/calculate, а настройки применяются шаблонами во время первой загрузки.
Во время своей работы cl-lxc использует кэш. Вы можете развернуть десятки контейнеров в максимально короткое время. Подготовленный для обновления образ кэшируется и может использоваться для последующих обновлений. Контейнеры настроены таким образом, чтобы использовать портежи хостовой машины. В результате размер развернутого Calculate Container Scratch занимает всего около 1,2 Гб. Если вы используете файловую систему Btrfs, то утилита будет использовать reflink при копировании и позаботиться о создании подтома для новых контейнеров. В отличие от lxc-create, cl-lxc создаст подтом для директории контейнера, а не для rootfs. Это удобно, так как в отдельном подтоме контейнера может какое-то время оставаться несколько корневых образов системы.
Установка
Убедитесь, что у вас установлен пакет sys-apps/calculate-toolkit
версии 0.3.0 или выше.
Установите утилиты LXC:
emerge -a app-containers/lxc
Настройка хостовой машины
Контейнеры, настраиваемые утилитой cl-lxc монтирует портежи и оверлеи с хостовой машины, но оверлея Container по-умолчанию в хостовой машине нет. Чтобы оверлей обновлялся в контейнере, его следует добавить. Для этого отредактируйте файл /var/calculate/calculate.env
добавив в него:
[update]
cl_update_rep_name = gentoo,calculate,distros,container
cl_update_rep_url = https://git.calculate-linux.org/calculate/gentoo-overlay,https://git.calculate-linux.org/calculate/calculate-overlay,https://git.calculate-linux.org/calculate/distros-overlay,https://git.calculate-linux.org/calculate/container-overlay
Выполните синхронизацию портежей, чтобы убедиться, что оверлей Container подключен, выполнив cl-update --sync-only
:
Создание контейнера
Для создания контейнера “test”, выполните cl-lxc --create test
:
После выполнения будет создан путь /var/calculate/lxc
с директорией с контейнера test
. Для запуска контейнера достаточно выполнить:
lxc-start test
Для подключения к контейнеру выполните:
lxc-attach test
Обратите внимание, что приглашение пользователя root в контейнере имеет другой цвет.
Если в хостовой системе не настроен сетевой мост, то настройки сети будут наследованы контейнером.
Обновление
Помимо традиционного способа обновления контейнера при помощи cl-update
или emerge
, вы можете использовать обновление образом. При подготовке нового образа, утилита cl-lxc переносит сет custom (/etc/portage/sets/custom) из контейнера. Поэтому устанавливая пакеты, прописывайте их в этот сет. Помимо удобного переноса, вы всегда будете знать, что и зачем вы устанавливали в систему из дополнительного программного обеспечения.
Простой пример установки текстового редактора Vim:
Теперь давайте подготовим образ для обновления вашего контейнера. Для этого в хостовой машине достаточно выполнить:
cl-lxc --prepare test
На время будет создан временный контейнер, перенесен сет custom и выполнено обновление. После этого контейнер будет сохранен в кэше /var/calculate/lxc/.cache/rootfs-test
и удален.
Теперь, чтобы обновить ваш контейнер, достаточно выполнить cl-lxc --upgrade test
:
Вся операция займет несколько секунд. В директории /var/calculate/lxc/test
будет файл config
с настройками контейнера, директория calculate
монтируемая в /var/calculate
контейнера и два образа с корнем rootfs
и rootfs1
. После проверки работоспособности директорию rootfs
можно будет удалить.
Обратите внимание, что настройки сети, языка и локали, списка пакетов были перенесены из обновляемой системы в новую во время обновления. Дальнейшие настройки можно переносить при помощи шаблонов, а сами данные разместить в разделе /var/calculate
.
Шаблоны
В примерах видно, что вы можете быстро развернуть контейнер, подготовить и обновить образ, ваши данные при этом будут продолжать находиться в отдельной монтируемой директории /var/calculate. Осталось разобраться как вам подготовить шаблоны для того, чтобы вы могли переносить настройки между системами.
В директории calculate/templates при подготовке контейнера уже создаются базовые шаблоны для настройки сервера бинарных обновлений. Давайте рассмотрим их подробней.
Для удобства, все базовые шаблоны настройки контейнера находятся в директории default. Свойства директории описаны в файле .calculate_directory
:
# Calculate env=install ac_install_live==on append=skip
Где:
-
env=install
- описывает область действия переменных -
ac_install_live==on
- проверка на событие установки пакета. Подробнее можно прочитать в /var/db/repos/calculate/profiles/templates/3.6/3_ac_install_live/README-rus.txt. -
append=skip
- пропускает перенос директории в настраиваемую систему
Шаблон portage.binhost имеет примерно следующее содержимое:
# Calculate mergepkg(sys-apps/portage)!= path=/etc/portage/make.conf name=binhost protected comment=#
PORTAGE_BINHOST="https://mirror.calculate-linux.org/grp/x86_64"
Где:
-
mergepkg(sys-apps/portage)!=
- проверка наличия пакета sys-apps/portage -
path=/etc/portage/make.conf name=binhost
- путь и имя исправляемого файла -
protected
- не связывать создаваемый файл с пакетом sys-apps/portage -
comment=#
- символ разделителя комментариев
Шаблон runlevel.eth0 создается в том случае, если на хостовой машине настроен bridge. Он имеет следующее содержимое:
# Calculate mergepkg(sys-apps/openrc)!= path=/etc/runlevels/default name=net.eth0 protected link=/etc/init.d/net.lo symbolic
Где:
link=/etc/init.d/net.lo symbolic
- означает создание символической ссылки на /etc/init.d/net.lo.
Заключение
Примеры настройки шаблонами в статью не попали. Я планирую написать их по мере вашего интереса к новой утилите. Настраивать контейнер шаблонами несколько проще, т.к. нет риска повреждения файлов основной системы, а файловую систему контейнера можно быстро восстановить из кэша.