После полутора лет разработки сформирован релиз инструментария для организации работы изолированных контейнеров LXC 2.1. В состав инструментария LXC входит библиотека liblxc, набор утилит (lxc-create, lxc-start, lxc-stop, lxc-ls и т.п.), шаблоны для построения контейнеров и набор биндингов для различных языков программирования. Изоляция осуществляется при помощи штатных механизмов ядра Linux. Для изоляции процессов, сетевого стека ipc, uts и точек монтирования используется механизм пространств имён (namespaces). Для ограничения ресурсов применяются cgroups. Для понижения привилегий и ограничения доступа задействованы такие возможности ядра, как профили Apparmor и SELinux, политики Seccomp, Chroots (pivot_root) и capabilities.
Ключевые изменения:
- Поддержка ограничения ресурсов через механизм rlimit. Настройка выполняется аналогично лимитам через cgroup через директивы lxc.prlimit.имя_лимита в файле конфигурации контейнера. Например, для того чтобы снять ограничение на число процессов и установить значение nice в файл конфигурации можно добавить:
lxc.prlimit.nproc = unlimited lxc.prlimit.nice = 4
- Возможность определения виртуальных сетей openvswitch непривилегированным пользователем:
lxc.net.0.type = veth lxc.net.0.link = ovsbr0 lxc.net.0.flags = up lxc.net.0.name = eth0
- Новый параметр «lxc.cgroup.dir», позволяющий указать имя родительского cgroup, к которому будет привязан cgroup создаваемого контейнера. Например, установка «lxc.cgroup.dir = mycontainers» для контейнера «lxc.uts.name = c1» приведёт к созданию cgroups «mycontainers/c1» для всех контроллеров в иерархии cgroup;
- Поддержка гибридного режима настройки cgroup, при котором можно сочетать новую (cgroup v2) единую унифицированная иерархию cgroup и старую (cgroup v1) гибкую систему из произвольного числа иерархий cgroup. В гибридном режиме предложено ограниченное число контроллеров для распределения ресурсов CPU, регулирования потребления памяти, контроля ввода/вывода и т.п.
- Добавлена настройка lxc.pty.max для ограничения числа псевдотерминалов (ptys), которое можно запросить из контейнера.
- Исполняемый файл lxc-monitord переведён в разряд устаревших и больше не требуется для запуска фоновых контейнеров. Вместо lxc-monitord теперь применяется абстрактная реализация на основе пары unix-сокетов;
- В lxc-copy обеспечено создание снапшотов в tmpfs при запуске одноразовых контейнеров (флаг «-e»);
- Переименована достаточно большая порция параметров конфигурации с целью унификации синтаксиса настроек. Параметры разнесены по категориям, например, все сетевые настройки теперь поставляются с префиксом «lxc.net». Префикс lxc.network объявлен устаревшим, для избежания разночтений все ключи из него перенесены в lxc.net. Например, вместо серии «lxc.network.name = wlp2s0; lxc.network.name = eno1» теперь нужно указывать «lxc.net.0.name = wlp2s0; lxc.net.1.name = eno1» с явным номера блока;
Таблица соответствия старых и новых параметров настройки:
lxc.aa_profile | lxc.apparmor.profile lxc.aa_allow_incomplete | lxc.apparmor.allow_incomplete lxc.console | lxc.console.path lxc.devttydir | lxc.tty.dir lxc.haltsignal | lxc.signal.halt lxc.id_map | lxc.idmap lxc.init_cmd | lxc.init.cmd lxc.init_gid | lxc.init.gid lxc.init_uid | lxc.init.uid lxc.kmsg | - | удалён lxc.limit | lxc.prlimit lxc.logfile | lxc.log.file lxc.loglevel | lxc.log.level lxc.mount | lxc.mount.fstab lxc.network | lxc.net lxc.network. | lxc.net.[i]. lxc.network.flags | lxc.net.[i].flags lxc.network.hwaddr | lxc.net.[i].hwaddr lxc.network.ipv4 | lxc.net.[i].ipv4.address lxc.network.ipv4.gateway | lxc.net.[i].ipv4.gateway lxc.network.ipv6 | lxc.net.[i].ipv6.address lxc.network.ipv6.gateway | lxc.net.[i].ipv6.gateway lxc.network.link | lxc.net.[i].link lxc.network.macvlan.mode | lxc.net.[i].macvlan.mode lxc.network.mtu | lxc.net.[i].mtu lxc.network.name | lxc.net.[i].name lxc.network.script.down | lxc.net.[i].script.down lxc.network.script.up | lxc.net.[i].script.up lxc.network.type | lxc.net.[i].type lxc.network.veth.pair | lxc.net.[i].veth.pair lxc.network.vlan.id | lxc.net.[i].vlan.id lxc.pivotdir | - | удалён lxc.pts | lxc.pty.max lxc.rebootsignal | lxc.signal.reboot lxc.rootfs | lxc.rootfs.path lxc.se_context | lxc.selinux.context lxc.seccomp | lxc.seccomp.profile lxc.stopsignal | lxc.signal.stop lxc.syslog | lxc.log.syslog lxc.tty | lxc.tty.max lxc.utsname | lxc.uts.name
- Добавлен скрипт lxc-update-config, предназначенный для автоматического приведения старых настроек в соответствие с новыми именами параметров. При этом устаревшие имена параметров пока остаются работоспособными, т.е. обеспечена обратная совместимость со старыми файлами конфигурации.