Контейнеры systemd-nspawn: различия между версиями
Дым (обсуждение | вклад) |
м (→Проблемы с ID mapped mounts: Оговорка по Фрейду) |
||
(не показаны 73 промежуточные версии 5 участников) | |||
Строка 1: | Строка 1: | ||
=Установка= | =Установка= | ||
Первым делом не обойтись без | Первым делом не обойтись без поддержки означенной в заголовке системы контейнеризации: | ||
<source lang="bash"># apt-get update && apt-get install systemd-container -y</source> | |||
Вторым — понадобится минимальный образ системы, годный для виртуальных сред контейнерного типа ([[LXC]], [[Docker]] и т.п.), взять который можно в репозитории. На момент | Вторым — понадобится минимальный образ системы, годный для виртуальных сред контейнерного типа ([[LXC]], [[Docker]] и т.п.), взять который можно в репозитории. На момент последней редакции статьи привлекательнее прочих выглядел [http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz этот]. | ||
Контейнер (допустим, первый из них будет называться <strong>spawn-1</strong>) можно развернуть: | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!прямо из интернета | |||
|- | |||
|<source lang="bash"> | |||
# machinectl pull-tar http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz spawn-1 --verify=no | |||
Enqueued transfer job 1. Press C-c to continue download in background. | Enqueued transfer job 1. Press C-c to continue download in background. | ||
Pulling 'http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz', saving as 'spawn-1'. | |||
Downloading 169B for http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.nspawn. | |||
HTTP request to http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.nspawn failed with code 404. | |||
Settings file could not be retrieved, proceeding without. | |||
Downloading 60.9M for http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p9-rootfs-systemd-x86_64.tar.xz. | |||
Got 1% of http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz. | |||
... | |||
Got 88% of http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz. 604ms left at 8.4M/s. | |||
Download of http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz complete. | |||
Created new local image 'spawn-1'. | |||
Operation completed successfully. | |||
Exiting. | |||
</source> | |||
|} | |||
либо | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!из скачанного тарбола. | |||
|- | |||
|<source lang="bash"> | |||
# machinectl import-tar alt-p10-rootfs-systemd-x86_64.tar.xz spawn-1 | |||
Enqueued transfer job 1. Press C-c to continue download in background. | |||
Importing '/var/lib/machines/alt-p9-rootfs-systemd-x86_64.tar.xz', saving as 'spawn-1'. | |||
Imported 0%. | |||
... | |||
Imported 99%. | |||
Operation completed successfully. | |||
Exiting. | |||
</source> | |||
|} | |||
=Запуск= | =Запуск= | ||
{{Совет|Если требуется задать контейнеру какие-то дополнительные параметры, имеет смысл создать файлик <code>/etc/systemd/nspawn/<name>.nspawn</code> и добавлять их туда ''(подробнее см. в {{cmd|man systemd.nspawn}})''.}} | |||
Например, для контейнера под сборочницу [[Hasher]]: | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/etc/systemd/nspawn/spawn-1.nspawn | |||
|- | |||
|<source lang=ini> | |||
[Exec] | |||
Capability = CAP_SYS_ADMIN | |||
[Network] | |||
VirtualEthernet = on | |||
</source> | |||
|} | |||
Стартанём новый контейнер, одновременно включив его запуск при каждой загрузке компьютера: | Стартанём новый контейнер, одновременно включив его запуск при каждой загрузке компьютера: | ||
<source lang=bash> | |||
# systemctl enable --now systemd-nspawn@spawn-1 | |||
Created symlink /etc/systemd/system/machines.target.wants/systemd-nspawn@spawn-1.service → /lib/systemd/system/systemd-nspawn@.service. | |||
</source> | |||
Проверим, всё ли удалось: | Проверим, всё ли удалось: | ||
<source lang=bash> | |||
# systemctl status systemd-nspawn@spawn-1 | |||
● systemd-nspawn@spawn-1.service - Container spawn-1 | |||
Loaded: loaded (/lib/systemd/system/systemd-nspawn@.service; enabled; vendor preset: disabled) | Loaded: loaded (/lib/systemd/system/systemd-nspawn@.service; enabled; vendor preset: disabled) | ||
Active: active (running) since Thu 2020-10-01 21:38:31 +08; 8s ago | Active: active (running) since Thu 2020-10-01 21:38:31 +08; 8s ago | ||
Docs: man:systemd-nspawn(1) | Docs: man:systemd-nspawn(1) | ||
... | |||
</source> | |||
Работает. Заходим локально: | Работает. Заходим локально: | ||
<source lang=bash> | |||
# machinectl shell spawn-1 | |||
Connected to machine spawn-1. Press ^] three times within 1s to exit session. | |||
= | [root@spawn-1 ~]# | ||
</source> | |||
{{Памятка|Чтоб заходить в контейнер локально не только по {{cmd|machinectl shell <name>}}, но и по {{cmd|machinectl login <name>}}, нужно скомандовать внутри контейнера: {{cmd|# sed -i 's:tty:pts/:' /etc/securetty}}}} | |||
=Сеть= | |||
{{Примечание|Не пробовал делать дальнейшее посредством <code>etcnet</code>, поскольку давно использую <code>systemd-networkd</code>, одинаково настраиваемый во всех современных дистрибутивах и интегрирующий массу инструментария, каковой в других случаях требуется установить.}} | {{Примечание|Не пробовал делать дальнейшее посредством <code>etcnet</code>, поскольку давно использую <code>systemd-networkd</code>, одинаково настраиваемый во всех современных дистрибутивах и интегрирующий массу инструментария, каковой в других случаях требуется установить.}} | ||
Построим с хоста мостик <strong>ve-<имя контейнера></strong> в | Построим с хоста мостик <strong>ve-<имя контейнера></strong> (адрес и сеть выбирать на своё усмотрение, лишь бы не пересекалось с уже имеющимися в системе): | ||
<source lang= | {|class="mw-collapsible mw-collapsed wikitable" | ||
!/etc/systemd/network/ve-spawn-1.network | |||
|- | |||
|<source lang=ini> | |||
[Match] | [Match] | ||
Name = ve-spawn-1 | Name = ve-spawn-1 | ||
Строка 42: | Строка 94: | ||
IPMasquerade = yes | IPMasquerade = yes | ||
</source> | </source> | ||
А со стороны контейнера примем его на интерфейс <strong>host0</strong> | |} | ||
<source lang= | А со стороны контейнера примем его на интерфейс <strong>host0</strong>: | ||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/etc/systemd/network/host0.network | |||
|- | |||
|<source lang=ini> | |||
[Match] | [Match] | ||
Name = host0 | Name = host0 | ||
Строка 50: | Строка 106: | ||
DHCP = ipv4 | DHCP = ipv4 | ||
</source> | </source> | ||
Перезапустив systemd-networkd прежде на хосте, а после в контейнере, увидим | |} | ||
{{Примечание|Вышеописанное необязательно, поскольку '''systemd-networkd''' умолчально настраивает ve-интерфейсы посредством DHCP ''(см. файлы {{path|/lib/systemd/network/80-container-host0.network}} и {{path|/lib/systemd/network/80-container-ve.network}})''.}} | |||
Перезапустив systemd-networkd прежде на хосте, а после в контейнере, увидим: | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!На хосте | |||
|- | |||
|<source lang=bash> | |||
# networkctl | |||
IDX LINK TYPE OPERATIONAL SETUP | |||
1 lo loopback carrier unmanaged | |||
2 lan ether routable configured | |||
3 ve-spawn-1 ether routable configured | |||
3 links listed. | |||
# ip -o a s ve-spawn-1 | awk '!/inet6/{print $2,$4}' | |||
ve-spawn-1 192.168.222.254/24 | |||
</source> | |||
|} | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!В контейнере | |||
|- | |||
|<source lang=bash> | |||
[root@spawn-1 ~]# networkctl | |||
IDX LINK TYPE OPERATIONAL SETUP | |||
1 lo loopback carrier unmanaged | |||
2 host0 ether routable configured | |||
2 links listed. | |||
[root@spawn-1 ~]# ip -o a s host0 | awk '!/inet6/{print $2,$4}' | |||
host0 192.168.222.146/24 | host0 192.168.222.146/24 | ||
</source> | |||
|} | |||
{{Совет|Если всё заработало, дальше имеет смысл конфигурировать контейнер по ssh, устанавливая нужные пакеты и настраивая требуемые сервисы.}} | {{Совет|Если всё заработало, дальше имеет смысл конфигурировать контейнер по ssh, устанавливая нужные пакеты и настраивая требуемые сервисы.}} | ||
=Стрельба по неприятностям (траблшутинг)= | |||
* Из решений: настроить политики Polkit — [https://wiki.archlinux.org/index.php/Systemd-nspawn#Using_machinectl_without_root_permissions|Using machinectl without root permissions] | |||
== Проблемы с ID mapped mounts == | |||
На альтовских ядрах можно наткнуться на ошибку при старте контейнеров. При этом в логах контейнера будет что-то типа: | |||
systemd-nspawn[3651]: Failed to set up ID mapped mounts: Operation not permitted | |||
А в dmesg: | |||
VFS: idmapped mount is not enabled. | |||
Это симптомы заботы мейнтейнеров ядра о вашей безопасности, за подробностями [[idmap_mounts|вам сюда]]. | |||
=Обратная связь= | |||
*[https://t.me/gbIMoBou @gbIMoBou] | |||
*[[Участник:Дым#Заметки|Другие статьи]] | |||
{{Category navigation|title=Виртуализация|category=Виртуализация|sortkey={{SUBPAGENAME}}}} | {{Category navigation|title=Виртуализация|category=Виртуализация|sortkey={{SUBPAGENAME}}}} | ||
[[ | [[Категория:systemd]] | ||
[[Категория:Admin]] |
Текущая версия от 23:10, 6 февраля 2024
Установка
Первым делом не обойтись без поддержки означенной в заголовке системы контейнеризации:
# apt-get update && apt-get install systemd-container -y
Вторым — понадобится минимальный образ системы, годный для виртуальных сред контейнерного типа (LXC, Docker и т.п.), взять который можно в репозитории. На момент последней редакции статьи привлекательнее прочих выглядел этот.
Контейнер (допустим, первый из них будет называться spawn-1) можно развернуть:
прямо из интернета |
---|
# machinectl pull-tar http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz spawn-1 --verify=no
Enqueued transfer job 1. Press C-c to continue download in background.
Pulling 'http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz', saving as 'spawn-1'.
Downloading 169B for http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.nspawn.
HTTP request to http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.nspawn failed with code 404.
Settings file could not be retrieved, proceeding without.
Downloading 60.9M for http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p9-rootfs-systemd-x86_64.tar.xz.
Got 1% of http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz.
...
Got 88% of http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz. 604ms left at 8.4M/s.
Download of http://ftp.altlinux.ru/pub/distributions/ALTLinux/p10/images/cloud/alt-p10-rootfs-systemd-x86_64.tar.xz complete.
Created new local image 'spawn-1'.
Operation completed successfully.
Exiting.
|
либо
из скачанного тарбола. |
---|
# machinectl import-tar alt-p10-rootfs-systemd-x86_64.tar.xz spawn-1
Enqueued transfer job 1. Press C-c to continue download in background.
Importing '/var/lib/machines/alt-p9-rootfs-systemd-x86_64.tar.xz', saving as 'spawn-1'.
Imported 0%.
...
Imported 99%.
Operation completed successfully.
Exiting.
|
Запуск
Например, для контейнера под сборочницу Hasher:
/etc/systemd/nspawn/spawn-1.nspawn |
---|
[Exec]
Capability = CAP_SYS_ADMIN
[Network]
VirtualEthernet = on
|
Стартанём новый контейнер, одновременно включив его запуск при каждой загрузке компьютера:
# systemctl enable --now systemd-nspawn@spawn-1
Created symlink /etc/systemd/system/machines.target.wants/systemd-nspawn@spawn-1.service → /lib/systemd/system/systemd-nspawn@.service.
Проверим, всё ли удалось:
# systemctl status systemd-nspawn@spawn-1
● systemd-nspawn@spawn-1.service - Container spawn-1
Loaded: loaded (/lib/systemd/system/systemd-nspawn@.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-10-01 21:38:31 +08; 8s ago
Docs: man:systemd-nspawn(1)
...
Работает. Заходим локально:
# machinectl shell spawn-1
Connected to machine spawn-1. Press ^] three times within 1s to exit session.
[root@spawn-1 ~]#
Сеть
Построим с хоста мостик ve-<имя контейнера> (адрес и сеть выбирать на своё усмотрение, лишь бы не пересекалось с уже имеющимися в системе):
/etc/systemd/network/ve-spawn-1.network |
---|
[Match]
Name = ve-spawn-1
[Network]
DHCPServer = yes
Address = 192.168.222.254/24
IPMasquerade = yes
|
А со стороны контейнера примем его на интерфейс host0:
/etc/systemd/network/host0.network |
---|
[Match]
Name = host0
[Network]
DHCP = ipv4
|
Перезапустив systemd-networkd прежде на хосте, а после в контейнере, увидим:
На хосте |
---|
# networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 lan ether routable configured
3 ve-spawn-1 ether routable configured
3 links listed.
# ip -o a s ve-spawn-1 | awk '!/inet6/{print $2,$4}'
ve-spawn-1 192.168.222.254/24
|
В контейнере |
---|
[root@spawn-1 ~]# networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 host0 ether routable configured
2 links listed.
[root@spawn-1 ~]# ip -o a s host0 | awk '!/inet6/{print $2,$4}'
host0 192.168.222.146/24
|
Стрельба по неприятностям (траблшутинг)
- Из решений: настроить политики Polkit — machinectl without root permissions
Проблемы с ID mapped mounts
На альтовских ядрах можно наткнуться на ошибку при старте контейнеров. При этом в логах контейнера будет что-то типа:
systemd-nspawn[3651]: Failed to set up ID mapped mounts: Operation not permitted
А в dmesg:
VFS: idmapped mount is not enabled.
Это симптомы заботы мейнтейнеров ядра о вашей безопасности, за подробностями вам сюда.