Systemd-nspawn kasutamine operatsioonisüsteemiga Debian

Allikas: Imre kasutab arvutit

Sissejuhatus

Systemd sisaldab vahendeid operatsioonisüsteemi virtualiseerimiseks, täpsemalt sedasi

  • host ja konteinerid töötavad kasutades ühte ja sama host'i tuuma
  • failisüsteemi, protsessid ja võrgu osas on konteiner isoleeritud host'ist ja muudest konteineritest

Tööpõhimõte

  • C groups
  • Btrfs

Ettevalmistused

  • Virtuaalsete arvutite haldamiseks on vajalik paigaldada pakett
# apt-get install systemd-container
  • Kõige paremini sobib virtuaalsete arvutite arvutite pidamiseks btrfs failisüsteem, tekitada ja ühendada /var/lib/machines alla. Btrfs kasutamist on kirjeldatud tekstis Btrfs failisüsteemi kasutamine Debianiga.

Konteineri moodustamine

Lähtepunktiks on nö tavaline minimaalne Debian operatsioonisüsteemi failidega kataloog failisüsteemis

# btrfs subvolume create /var/lib/machines/kont-1

Tulemusena tekkis

# btrfs subvolume list /var/lib/machines 
ID 263 gen 194 top level 5 path kont-3

Operatsioonisüsteemiga täitmiseks sobib öelda

# debootstrap stretch /var/lib/machines/kont-1 http://ftp.ee.debian.org/debian/

Tulemusena tekib

# machinectl list-images
NAME        TYPE      RO  USAGE  CREATED                      MODIFIED
kont-1      subvolume no  266.3M Tue 2015-10-20 23:23:35 EEST n/a 

root kasutaja parooli seadistamiseks tuleb öelda

# systemd-nspawn -D /var/lib/machines/kont-1
Spawning container kont-1 on /var/lib/machines/kont-1.
Press ^] three times within 1s to kill container.
Failed to create directory /var/lib/machines/kont-1/sys/fs/selinux: Read-only file system
Failed to create directory /var/lib/machines/kont-1/sys/fs/selinux: Read-only file system
/etc/localtime is not a symlink, not updating container timezone.
root@kont-1:~# 

ning käsuga passwd seadistada parool

root@kont-1:~# passwd

ning tekitada grupp ja kasutaja, nt, osutub, et login: juurest ei saa root kasutajaga sisse logida (küllap see on konfitav kuskilt)

root@kont-1:~# groupadd imre
root@kont-1:~# useradd -s /bin/bash -g imre -m -d /home/imre imre

Kisaks paigaldada dbus ja libpolkit-agent-1-0 paketid (antud juhul on arvuti võrgus nö hosti kaudu vms)

root@kont-1:~# apt-get install dbus libpolkit-agent-1-0

ning väljuda ctrl+d abil. Konteineri hostname seadistamiseks

# hostnamectl -M kont-1 set-hostname "kont-1"

kus

  • -M - konteineri nimi, kus hostname väärtust muudetakse
  • set-hostname - hostname uus väärtus

Seejärel käivitada konteiner tavalises režiimis

# systemd-nspawn -D /var/lib/machines/kont-1 -b
...
[  OK  ] Reached target Multi-User System.
[  OK  ] Reached target Graphical Interface.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Started Update UTMP about System Runlevel Changes.

Debian GNU/Linux stretch/sid systemd console

arvutinimi login:

Või

# machinectl start kont-1
# machinectl login kont-1

Tulemusena saab sisse logida. Kui vajutada kolm korda Ctrl + ] jääb konteiner käima ja saab host arvuti prompti tagasi.

Konteiner töötab üldiselt ka vaikimisi seadistustega, aga vajadusel saab seadisused näitada nt failis

# cat /etc/systemd/nspawn/kont-1.nspawn 
[Network]
IPVLAN=eth0

Konteineri haldamine

Konteineri käivitamiseks sobib öelda

# machinectl start kont-1

Konteiner ei ole võrgu mõttes isoleeritud, aga failisüsteemi mõttes on. Selleks, et konteineri haldamine oleks mõnusam, tuleb konteinerisse paigaldada dbus pakett

# apt-get install dbus

Konteinerite nimekirja esitamine

host # machinectl
MACHINE            CLASS     SERVICE
kont-1 container nspawn 

1 machines listed.

Konteineri oleku küsimine

# machinectl status kont-1
nspawn-konteiner-1
           Since: Tue 2015-07-28 22:01:16 EEST; 9min ago
          Leader: 18922 (systemd)
         Service: nspawn; class container
            Root: /srv/kont-1
              OS: Debian GNU/Linux stretch/sid
            Unit: machine-kont\x2d1.scope
                  ├─18922 /lib/systemd/systemd
                  └─system.slice
                    ├─cron.service
                    │ └─18989 /usr/sbin/cron -f
                    ├─systemd-journald.service
                    │ └─18937 /lib/systemd/systemd-journald
                    ├─console-getty.service
                    │ └─18993 /sbin/agetty --noclear --keep-baud console 115200 38400 9600 vt220
                    └─rsyslog.service
                      └─18988 /usr/sbin/rsyslogd -n

Jul 28 22:01:16 systemd systemd[1]: Starting Container kont-1.

Nö tavalised utiliidid töötavad ka konteineriga, nt konteineris töötavate teenuste nimekirja esitamiseks

# systemctl -M kont-1

Konteineri rebootimiseks

# machinectl reboot kont-1

Samuti journalctl

# journalctl -M kont-1 -n 8

Järgmised käsud demonstreerivad nspawn konteineri sarnasust Solaris tsoonidele

# systemctl -r
# ps -eo pid,machine,args

Konteineri väljalülitamiseks

# machinectl poweroff kont-1

Virtuaalse arvuti subvolume kustutamine

# btrfs subvolume delete /var/lib/machines/kont-1

Olemasolevast konteinerist koopia tekitamine

# machinectl clone kont-1 kont-1-test

Konteineri ja vastava subvolume eemaldamine

# machinectl remove kont-1-test

Konteineri käivitamisega seotud logi

# TODO

Kasulikud lisamaterjalid

Tõmmiste kasutamine

Tõmmise kasutamiseks sobib öelda

# machinectl pull-tar https://cloud-images.ubuntu.com/trusty/20151019/trusty-server-cloudimg-amd64-root.tar.xz

Tulemusena tekitatakse vastav subvolume jne.

Kohalikust töötavast imagest pull-tar tüüpi arhiivi moodustamiseks sobib öelda

# TODO

Shelli minekuks

# systemd-nspawn --private-network -i Fedora-Cloud-Base-20141203-21.x86_64.raw

Käivitamiseks

# systemd-nspawn --private-network -i Fedora-Cloud-Base-20141203-21.x86_64.raw -b

Võrgu kasutamine virtuaalse arvutiga

macvlan

Mac vlan puhul seostatakse host arvuti füüsilise võrguseadmega lisaks mac aadress, käivitada konteiner selliselt

# systemd-nspawn -D /srv/kont-1 --network-macvlan=eth0 -b

Ilmselt on loomulik seadistada konteineris olevale võrguliidesele ip aadress samast subnetist host arvutiga. Kui jälgida võrguliiklust, siis tulemusena paistavad paketid hostist ja konteinerist erinevate mac aadressidega.

ipvlan

IP vlan puhul ei seostata host arvuti füüsilise võrguseadmega lisaks mac aadressi, käivitada konteiner selliselt

# systemd-nspawn -D /srv/kont-1 --network-ipvlan=eth0 -b

Ilmselt on loomulik seadistada konteineris olevale võrguliidesele ip aadress samast subnetist host arvutiga. Kui jälgida võrguliiklust, siis tulemusena paistavad paketid hostist ja konteinerist sama mac aadressidega. Ju siis systemd ise oskab korraldada, et arvestatakse, mis paketid kust pärit on.

network-bridge

Host arvutis peab olema bridge ja konteineri interface'i nö teine ots ühendatakse selle külge

# systemd-nspawn -D /srv/kont-1 --network-bridge=br0 -b 

network-veth

  • seadistada konteinerit hostiva arvuti võrguühendus nt bridge-utils bridge abil
# brctl addbr br0
# brctl addif br0 eth0
# ifconfig br0 192.168.10.17
# route add default gw 192.168.10.254
  • hostis lisada bridgele virtuaalne liides (ve-konteinerinimeline võrguseadme nime tekib automaatselt konteineri käivitamisel)
# ifconfig ve-kont-1 up
# brctl addif br0 ve-kont-1

private-network

  • isoleeritud võrgu tekitamiseks sobib öelda
# systemd-nspawn -D /srv/kont-1 --private-network

iptables kasutamine

  • konteinerist välja pääsemiseks
# iptables -t nat -A POSTROUTING -s 10.100.7.0/24 -j SNAT --to 10.0.7.172
  • eemalt võrgust konteinerile ligipääsu tekitamiseks sobib hostis kasutada nt
# iptables -t nat -A PREROUTING -p tcp -d 192.168.10.17 --dport 23 -j DNAT --to 192.168.105.15:22

Privaatsete ip aadressidega virtuaalsed arvuti NAT taga

Eesmärk

  • moodustada host'i kaks konteinerit
  • konteineritel on kummalgi üks privaatne ip aadress
  • konteinerid saavad omavahel suhelda piirnaguteta
  • konteinerid saavad pöörduda snat abil välisesse võrku piiranguteta, aga hosti subnetti vms lokaalsetesse võrkudesse piirangutega
  • eemalt saab läbi hosti enda ip aadressi ja teatud portide dnat abil pöörduda konteineritesse ssh'ga

Lülitada sisse ruuting

# grep net.ipv4.ip_forward /etc/sysctl.conf 
net.ipv4.ip_forward=1

Tekitada bridge

# cat /etc/network/interfaces

auto eth0
iface eth0 inet static
  address 10.0.7.172
  netmask 255.255.255.0
  gateway 10.0.7.1

auto br0
iface br0 inet static
  address 10.100.7.172
  netmask 255.255.255.0

Ühendada virtuaalsete arvutite võrguseadmed hosti br0 bridgega. Millegipärast töötab bridge käsurealt käivitades ja mitte konteineri seadistusfailist /etc/systemd/nspawn/ta-1.nspawn juhtides. Alternatiiv on siis käivitada screen ja sealt käsurealt konteinerid

# systemd-nspawn -D /var/lib/machines/ta-1 --network-bridge=br0 -b
# systemd-nspawn -D /var/lib/machines/ta-2 --network-bridge=br0 -b

Tulemusena

# ifconfig | egrep -A 1 "^vb-|br0"
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.100.7.172  netmask 255.255.255.0  broadcast 10.100.7.255
--
vb-ta-1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::58fe:c2ff:fe17:254b  prefixlen 64  scopeid 0x20<link>
--
vb-ta-2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::90af:5fff:fead:c8db  prefixlen 64  scopeid 0x20<link>

ning

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.5afec217254b       no              vb-ta-1
                                                        vb-ta-2

Konteineris tuleb võrk seadistada nt

# cat /var/lib/machines/ta-2/etc/systemd/network/50-static.network 
[Match]
Name=host0

[Network]
Address=10.100.7.11/24
Gateway=10.100.7.172

ja seadistuste kehtestamiseks öelda

# systemctl enable systemd-networkd
# systemctl start systemd-networkd

Selleks, et konteinerid saaksid host arvutist välja, peab olema kasutama sobivat paketifilteri seadistust, nt

# cat /etc/iptables/rules.v4 

# Generated by iptables-save v1.4.21 on Thu Oct 22 21:12:04 2015
*filter
:INPUT ACCEPT [99163:384201765]
:FORWARD ACCEPT [18:1531]
:OUTPUT ACCEPT [82085:8860746]
-A FORWARD -p tcp -m state --state NEW -d 10.0.9.4 --dport 53 -j ACCEPT
-A FORWARD -p udp -m state --state NEW -d 10.0.9.4 --dport 53 -j ACCEPT
-A FORWARD -p tcp -m state --state NEW -d 10.0.9.5 --dport 53 -j ACCEPT
-A FORWARD -p udp -m state --state NEW -d 10.0.9.5 --dport 53 -j ACCEPT
-A FORWARD -m state --state NEW -d 10.100.7.11 -j ACCEPT
-A FORWARD -m state --state NEW -d 10.100.7.12 -j ACCEPT
-A FORWARD -m state --state NEW -d 10.0.0.0/8 -j REJECT

COMMIT
# Completed on Thu Oct 22 21:12:04 2015
# Generated by iptables-save v1.4.21 on Thu Oct 22 21:12:04 2015
*nat
:PREROUTING ACCEPT [8:590]
:INPUT ACCEPT [2:168]
:OUTPUT ACCEPT [5:322]
:POSTROUTING ACCEPT [5:322]
-A POSTROUTING -s 10.100.7.0/24 -j SNAT --to-source 10.0.7.172
-A PREROUTING -p tcp -d 10.0.7.172 --dport 22211 -j DNAT --to 10.100.7.11:22
-A PREROUTING -p tcp -d 10.0.7.172 --dport 22212 -j DNAT --to 10.100.7.12:22

COMMIT
# Completed on Thu Oct 22 21:12:04 2015

Kasulikud lisamaterjalid