OpenVZ7
Известные проблемы
util-linux
версии 2.39.1 не работает! Корневая файловая система монтируется в read only.
Последняя работоспособная версия - 2.38.1
Установка (только ветки p10, Sisyphus)
# apt-get update
# apt-get install update-kernel vzctl vztt vzstat
# update-kernel -t ovz-el7
# systemctl enable vz.service
# systemctl enable vzevent.service
При этом установятся ядро с поддержкой vz7 и необходимые утилиты и службы; далее необходимо перегрузить систему и при загрузке выбрать ядро -ovz-el7
. В ветке p10 используется стабильное ядро, основанное на RHEL 7.9 (3.10.0-1160), в Sisyphus устанавливается иногда изменяемое ядро из RHEL 7.9 (3.10.0-1160). Утилита vzstat
— это аналог top
для наблюдения за активностью контейнеров. В пакет vztt
входят утилиты для работы с шаблонами контейнеров (специально преобразованные rootfs образы операционных систем, которые будут запускаться в контейнерах). Пакет vzctl
содержит основные команды для управления контейнерами: vzctl
и vzlist
, а также необходимые для работы контейнеров скрипты, службы и библиотеки.
metadata_csum
и её монтировании с опцией lazytime
Т.к. в ALT используются современные утилиты для работы с файловой системой, то последняя создаётся с включённым
свойством metadata_csum
(см. /etc/mke2fs.conf
, секция [fs_types]
, раздел про ext4
).
Однако, в RHEL 7 нет полноценной поддержки этого свойства (см. known problems in Red Hat Enterprise Linux).
Поэтому при создании файловой системы с metadata_csum
внутри ploop-устройства,
могут быть проблемы при интенсивном использовании этой файловой системы. Особенно при монтировании
с опцией lazytime
(включена по умолчанию, начиная с ядра rh7-3.10.0-1160.15.2.vz7.173.4).
Поэтому в ядре ALT OpenVZ 7 эта опция отключена, а с версии ploop
7.0.255 файловая система внутри ploop-устройства
создаётся без metadata_csum
(все имеющиеся шаблоны контейнеров необходимо пересоздать).
Возможно, для /var/lib/vz
имеет смысл отключать это свойство
(mkfs.ext4 -O ^metadata_csum
при создании или tune2fs -O ^metadata_csum
для существующей ФС).
UPDATE: В ядре ALT 3.10.0-alt4.1160.21.1.vz7.174.14 ошибка исправлена (возможно).
extent
-
mkfs.ext4 -O extent
, т.к. иначе mkfs.ext4 считает, что ядро не поддерживает это свойство, и создаёт файловую систему без него. После чего не работает ploop.
Создание шаблонов контейнеров
Шаблоны контейнеров создаются на основе архива, содержащего файлы корневой файловой системы (rootfs). Разработчики ALT Linux предоставляет такие архивы в разделе для облачных платформ. Архивы для других дистрибутивов Linux, подготовленные разработчиками OpenVZ, можно найти здесь. Также доступны архивы, созданные пользователями OpenVZ.
Полученный архив необходимо преобразовать в шаблон контейнера с помощью утилиты /usr/libexec/ovz-template-converter. Пример показан ниже. Формат имени архива для конвертирования имеет следующий вид: DISTRIBUTION-VERSION-ARCH[-NAME].tar.gz, где DISTRIBUTION — имя дистрибутива (в случае AltLinux - alt); VERSION — версия, ветка; ARCH — архитектура (поддерживается только x86_64 и x86); NAME — дополнительное имя, позволяющее иметь несколько различных шаблонов для данного набора дистрибутив-ветка-архитектура.
# mv alt-p10-rootfs-sysvinit-i586.tar.xz alt-p10-x86-sysvinit.tar.gz
# mkdir -p /var/lib/vz/tmp
# TMPDIR=/var/lib/vz/tmp /usr/libexec/ovz-template-converter alt-p10-x86-sysvinit.tar.gz
#
Теперь в каталоге /var/lib/vz/template/cache/ появился архив alt-9-x86-sysvinit.plain.ploopv2.tar.lz4, из которого будут разворачиваться новые контейнеры. Также, появился каталог /var/lib/vz/template/alt
.
Список готовых к использованию шаблонов контейнеров можно посмотреть с помощью команды vzpkg.
# vzpkg list
alt-p10-x86-sysvinit 2020-03-12 16:13:50
#
Обратите внимание, что в архиве rootfs для ALT Linux в качестве архитектуры указано i586, которую мы переименовали в x86, поскольку в качестве имени архитектуры в OpenVZ поддерживаются только x86 и x86_64. Также, обратите внимание на то, что исходный архив был упакован с помощью утилиты xz(1), мы не стали его пережимать в формат gzip(1), а просто сменили расширение архива с .xz на .gz. Утилита /usr/libexec/ovz-template-converter справилась со своей задачей. Однако, не забывайте, что расширение сжатого архива обязано быть именно .tar.gz.
Создание контейнера
# vzctl create 10110 --ostemplate alt-p10-x86_64-sysv --config vswap.1024MB \
--ipadd 192.168.1.10 --name test-sysv-etcnet
# vzctl set 10110 --diskspace 20G --nameserver 8.8.8.8 --nameserver 8.8.4.4 --cpus 2 --ram 1G --save
Создаём из шаблона alt-p10-x86_64-sysv с образцом конфига из /etc/vz/conf/vswap.1024MB.conf-sample контейнер под именем test-sysv-etcnet, назначаем IP адрес 192.168.1.10, устанавливаем размер диска в 20ГБ, ограничиваем ресурсы (CPU — 2 ядра, память — 1ГБ) и настраиваем DNS (будут использованы публичные сервера Google). Обязательно указываем в команде vzctl set
аргумент --save
, чтобы сохранить все изменения в конфигурационном файле.
Запуск контейнера
# vzctl start 10110
# vzlist -o ctid,numproc,status,ip,name,hostname,onboot
CTID NPROC STATUS IP_ADDR NAME HOSTNAME ONBOOT
10110 10 running 192.168.1.10 test-sysv-etcnet - yes
Использование NFS внутри контейнера
Чтобы добавить возможность монтировать NFS внутри контейнера, необходимо включить нужную FEATURES:
# vzctl set 10110 --features "nfs:on" --save [--setmode restart]
после чего перезапустить контейнер (vzctl restart
или --setmode restart
).
Внутри контейнера устанавливаем необходимые пакеты и монтируем NFS:
# vzctl enter 10110
CT-10110 /# apt-get install nfs-clients
CT-10110 /# mkdir /NFS
CT-10110 /# echo '192.168.1.1:/nfs/export /NFS nfs \
noauto,ro,noexec,nosuid,nodev,nolock,x-systemd.automount,_netdev,soft,intr,nfsvers=3' >>/etc/fstab
CT-10110 /# mount /NFS
При использовании nfsd внутри контейнера (FEATURES="nfsd:on"
) необходимо иметь в виду, что, начиная с ядра rh7-3.10.0-1160.6.1.vz7.171.1, внутри контейнера не видны ядерные треды, т.е. процессы nfsd можно наблюдать только снаружи контейнера. (См. OVZ-7245).
UPDATE: исправлено в rh7-3.10.0-1160.11.1.vz7.172.10 (ядро ALT 3.10.0-alt4.1160.11.1.vz7.172.10).
Полезные команды
Чтобы посмотреть сетевые соединения из хостовой системы (т.к. там netstat -n их теперь не показывает!), используйте
ip -all netns exec netstat -n