OpenVZ7: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
(bad util-linux 2.39.1)
 
(не показано 37 промежуточных версий 3 участников)
Строка 1: Строка 1:
{{Stub}}
{{Stub}}
{{Attention|В разработке! Статья не закончена! Инструкции неполные!}}
{{Attention|В разработке! Статья не закончена! Инструкции неполные!}}
__NOTOC__


=== Установка (только ветки p9, Sisyphus) ===
__TOC__


<code># apt-get update && apt-get install update-kernel vzctl vztt && update-kernel -t ovz-el7</code>
=== Известные проблемы ===


При этом установятся ядро с поддержкой vz7 и необходимые утилиты; далее необходимо перегрузить систему и при загрузке выбрать ядро <tt>-ovz-el7</tt>.
{{Attention|Пакет <code>util-linux</code> версии 2.39.1 не работает! Корневая файловая система монтируется в read only.
Последняя работоспособная версия - 2.38.1}}
 
=== Установка (только ветки p10, Sisyphus) ===
 
<syntaxhighlight lang="text">
# apt-get update
# apt-get install update-kernel vzctl vztt vzstat
# update-kernel -t ovz-el7
# systemctl enable vz.service
# systemctl enable vzevent.service
</syntaxhighlight>
 
При этом установятся ядро с поддержкой vz7 и необходимые утилиты и службы; далее необходимо перегрузить систему и при загрузке выбрать ядро <code>-ovz-el7</code>. В ветке p10 используется стабильное ядро, основанное на RHEL 7.9 (3.10.0-1160), в Sisyphus устанавливается иногда изменяемое ядро из RHEL 7.9 (3.10.0-1160). Утилита <code>vzstat</code> — это аналог <code>top</code> для наблюдения за активностью контейнеров. В пакет <code>vztt</code> входят утилиты для работы с шаблонами контейнеров (специально преобразованные rootfs образы операционных систем, которые будут запускаться в контейнерах). Пакет <code>vzctl</code> содержит основные команды для управления контейнерами: <code>vzctl</code> и <code>vzlist</code>, а также необходимые для работы контейнеров скрипты, службы и библиотеки.
 
{{Attention|Проблемы при создании файловой системы со свойством <code>metadata_csum</code>
и её монтировании с опцией <code>lazytime</code>}}
 
Т.к. в ALT используются современные утилиты для работы с файловой системой, то последняя создаётся с включённым
свойством <code>metadata_csum</code> (см. <code>/etc/mke2fs.conf</code>, секция <code>[fs_types]</code>, раздел про <code>ext4</code>).
Однако, в RHEL 7 нет полноценной поддержки этого свойства (см. [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/7.7_release_notes/known_issues known problems in Red Hat Enterprise Linux]).
Поэтому при создании файловой системы с <code>metadata_csum</code> внутри ploop-устройства,
могут быть проблемы при интенсивном использовании этой файловой системы. Особенно при монтировании
с опцией <code>lazytime</code> (включена по умолчанию, начиная с ядра rh7-3.10.0-1160.15.2.vz7.173.4).
Поэтому в ядре ALT OpenVZ 7 эта опция отключена, а с версии <code>ploop</code> 7.0.255 файловая система внутри ploop-устройства
создаётся без <code>metadata_csum</code> (все имеющиеся шаблоны контейнеров необходимо пересоздать).
Возможно, для <code>/var/lib/vz</code> имеет смысл отключать это свойство
(<code>mkfs.ext4 -O ^metadata_csum</code> при создании или <code>tune2fs -O ^metadata_csum</code> для существующей ФС).
 
'''UPDATE:''' В ядре ALT 3.10.0-alt4.1160.21.1.vz7.174.14 ошибка исправлена (возможно).
 
 
{{Attention|При создании файловой системы после загрузки ядра OpenVZ 7 необходимо явно указывать свойство <code>extent</code> -
<code>mkfs.ext4 -O extent</code>, т.к. иначе mkfs.ext4 считает, что ядро не поддерживает это свойство, и создаёт файловую систему без него. После чего не работает ploop. }}


=== Создание шаблонов контейнеров ===
=== Создание шаблонов контейнеров ===


<syntaxhighlight>
Шаблоны контейнеров создаются на основе архива, содержащего файлы корневой файловой системы (rootfs). Разработчики
# mv base-20190912-x86_64.tar.gz alt-p9-x86_64-sysv.tar.gz
ALT Linux предоставляет такие архивы в [http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/ разделе для облачных платформ]. Архивы для других дистрибутивов Linux,
# TMPDIR=/var/lib/vz/tmp /usr/libexec/ovz-template-converter alt-p9-x86_64-sysv.tar.gz
подготовленные разработчиками OpenVZ, можно найти
[http://download.openvz.org/template/precreated/ здесь]. Также доступны архивы,
[http://download.openvz.org/template/precreated/contrib/ созданные пользователями] OpenVZ.
 
Полученный архив необходимо преобразовать в шаблон контейнера с помощью утилиты
<tt>/usr/libexec/ovz-template-converter</tt>. Пример показан ниже.
Формат имени архива для конвертирования имеет следующий вид: <tt>DISTRIBUTION-VERSION-ARCH[-NAME].tar.gz</tt>,
где DISTRIBUTION — имя дистрибутива (в случае AltLinux - alt); VERSION — версия, ветка; ARCH — архитектура (поддерживается только x86_64 и x86); NAME — дополнительное имя, позволяющее иметь несколько различных шаблонов для данного набора дистрибутив-ветка-архитектура.
 
<syntaxhighlight lang="text">
# 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
#
</syntaxhighlight>
 
Теперь в каталоге <tt>/var/lib/vz/template/cache/</tt> появился архив <tt>alt-9-x86-sysvinit.plain.ploopv2.tar.lz4</tt>, из которого будут разворачиваться новые контейнеры. Также, появился каталог <code>/var/lib/vz/template/alt</code>.
 
Список готовых к использованию шаблонов контейнеров можно посмотреть с помощью команды <tt>vzpkg</tt>.
 
<syntaxhighlight lang="text">
# vzpkg list
# vzpkg list
alt-p9-x86_64-sysv                2019-09-12 16:13:50
alt-p10-x86-sysvinit          2020-03-12 16:13:50
#
</syntaxhighlight>
</syntaxhighlight>
Обратите внимание, что в архиве rootfs для ALT Linux в качестве архитектуры указано <tt>i586</tt>, которую мы переименовали в <tt>x86</tt>, поскольку в качестве имени архитектуры в OpenVZ поддерживаются только <tt>x86</tt> и <tt>x86_64</tt>. Также, обратите внимание на то, что исходный архив был упакован с помощью утилиты xz(1), мы не стали его
пережимать в формат gzip(1), а просто сменили расширение архива с .xz на .gz. Утилита <tt>/usr/libexec/ovz-template-converter</tt> справилась со своей задачей. Однако, не забывайте, что расширение сжатого архива обязано быть именно <tt>.tar.gz</tt>.


=== Создание контейнера ===
=== Создание контейнера ===


<syntaxhighlight>
<syntaxhighlight lang="text">
# vzctl create 10110 --ostemplate alt-p9-x86_64-sysv --config vswap.1024MB \
# vzctl create 10110 --ostemplate alt-p10-x86_64-sysv --config vswap.1024MB \
   --ipadd 192.168.1.10 --name test-sysv-etcnet
   --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
</syntaxhighlight>
</syntaxhighlight>
Создаём из шаблона <tt>alt-p10-x86_64-sysv</tt> с образцом конфига из <tt>/etc/vz/conf/vswap.1024MB.conf-sample</tt> контейнер под именем <tt>test-sysv-etcnet</tt>, назначаем IP адрес <tt>192.168.1.10</tt>, устанавливаем размер диска в <tt>20ГБ</tt>, ограничиваем ресурсы (CPU — 2 ядра, память — 1ГБ) и настраиваем DNS (будут использованы публичные сервера Google). Обязательно указываем в команде <code>vzctl set</code> аргумент <code>--save</code>, чтобы сохранить все изменения в конфигурационном файле.
{{note|Внимание! В каталоге <tt>/etc/vz/conf/</tt> содержатся символические ссылки на конфигурационные файлы контейнеров, сами файлы находятся в <tt>/var/lib/vz/private/XXX/ve.conf</tt>, где XXX - идентификатор контейнера. При ручном редактировании этих файлов не удалите случайно ссылки!}}


=== Запуск контейнера ===
=== Запуск контейнера ===


<syntaxhighlight>
<syntaxhighlight lang="text">
# vzctl start 10110
# 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
</syntaxhighlight>
=== Использование NFS внутри контейнера ===
Чтобы добавить возможность монтировать NFS внутри контейнера, необходимо включить нужную FEATURES:
<syntaxhighlight lang="text">
# vzctl set 10110 --features "nfs:on" --save [--setmode restart]
</syntaxhighlight>
</syntaxhighlight>
после чего перезапустить контейнер (<code>vzctl restart</code> или <code>--setmode restart</code>).
Внутри контейнера устанавливаем необходимые пакеты и монтируем NFS:
<syntaxhighlight lang="text">
# 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
</syntaxhighlight>
При использовании nfsd внутри контейнера (<code>FEATURES="nfsd:on"</code>) необходимо иметь в виду, что, начиная с ядра rh7-3.10.0-1160.6.1.vz7.171.1, внутри контейнера не видны ядерные треды, т.е. процессы nfsd можно наблюдать только снаружи контейнера. (См. [https://bugs.openvz.org/browse/OVZ-7245 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 их теперь не показывает!), используйте
<code>ip -all netns exec netstat -n</code>





Текущая версия от 16:22, 11 июля 2023

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.
Внимание! В разработке! Статья не закончена! Инструкции неполные!


Известные проблемы

Внимание! Пакет 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 ошибка исправлена (возможно).


Внимание! При создании файловой системы после загрузки ядра OpenVZ 7 необходимо явно указывать свойство 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, чтобы сохранить все изменения в конфигурационном файле.

Примечание: Внимание! В каталоге /etc/vz/conf/ содержатся символические ссылки на конфигурационные файлы контейнеров, сами файлы находятся в /var/lib/vz/private/XXX/ve.conf, где XXX - идентификатор контейнера. При ручном редактировании этих файлов не удалите случайно ссылки!


Запуск контейнера

# 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