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/portagepath=/etc/portage/make.conf name=binhost- путь и имя исправляемого файлаprotected- не связывать создаваемый файл с пакетом sys-apps/portagecomment=#- символ разделителя комментариев
Шаблон 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.
Заключение
Примеры настройки шаблонами в статью не попали. Я планирую написать их по мере вашего интереса к новой утилите. Настраивать контейнер шаблонами несколько проще, т.к. нет риска повреждения файлов основной системы, а файловую систему контейнера можно быстро восстановить из кэша.






