Linux konteinerid24. May '15

Sissejuhatus

Linux konteinerid (Linux Containers) või lühidalt LXC on tehnoloogia, mis kasutab Linux tuuma control groups funktsionaalsust võimaldades ühe Linux tuuma all käitada mitut isoleeritud Linux-põhist operatsioonisüsteemi ehk teiste sõnadega partitsioneerida Linux-põhise masina ressursse. Tegu on operatsioonisüsteemi tasemel virtualiseerimisega nagu BSD Jails 1 või OpenVZ 2, kus samamoodi mitu operatsioonisüsteemi instantsi jagavad ühte tuuma. Käesolev juhend eeldab Debian 8 jessie, Ubuntu 15.04 või hilisemate väljalasete paigaldust.

1

https://www.freebsd.org/doc/en/books/handbook/jails.html

2

https://openvz.org/

Taustast

Konteinerite puhul on juurfailisüsteemid, st kataloogid mis sisaldavad operatsioonisüsteemi faile eraldatud, aga Linuxi tuum mida konteinerid kasutavad on sama ning jagatud.

Linux tuumDebianjuurfailisüsteemUbuntujuurfailisüsteemFedorajuurfailisüsteemHostjuurfailisüsteemVirtuaalmäluFüüsiline mäluKonteiner #1Konteiner #2Konteiner #3ProtsessorVirtuaalfailisüsteemBtrfs/ZFS/ext4 tüürelKettakontrolleri tüürelKetas ja SSD

Tuum on jagatud, juurfailisüsteemid eraldi.

Kontrollgruppidega (control groups), saab isoleerida ka võrguliidesed ja protsessid ning piirata protsessori ja mälu kastutust.

Protsessipuu säärase süsteemi käivitamisel näeks välja umbkaudu järgnev:

systemd
  ├─acpid
  ├─agetty --noclear tty1 linux
  ├─atd -f
  ├─cron -f
  ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  ├─dhclient -v -pf /run/dhclient.lxcbr0.pid -lf /var/lib/dhcp/dhclient.lxcbr0.leases lxcbr0
  ├─lxc-start -d -n ubuntu-trusty-test
  │   └─init
  │       ├─dbus-daemon --system --fork
  │       ├─dhclient -1 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0
  │       ├─getty -8 38400 console
  │       ├─cron
  │       ├─sshd -D
  │       ├─systemd-logind
  │       ├─systemd-udevd --daemon
  │       ├─upstart-file-br --daemon
  │       ├─upstart-socket- --daemon
  │       └─upstart-udev-br --daemon
  ├─lxc-start -g debian-wheezy-test
  │   └─systemd
  │       ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  │       ├─dhclient -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0
  │       ├─agetty --noclear -s console 115200 38400 9600
  │       ├─cron
  │       ├─sshd -D
  │       ├─systemd-journal
  │       ├─systemd-logind
  │       └─systemd-udevd
  ├─lxc-start -d -n debian-jessie-test
  │   └─systemd
  │       ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  │       ├─dhclient -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0
  │       ├─sshd -D
  │       ├─systemd-journal
  │       └─systemd-logind
  ├─sshd -D
  ├─systemd-journal
  ├─systemd-logind
  └─systemd-udevd

Siit on näha, et iga konteineri jaoks on oma virtuaalne võrguliides eth0 ning DHCP klientrakendus on käivitatud iga konteineri jaoks. Kuna iga konteiner paistab eraldi IP-ga võrgus on igas konteineris jooksmas ka OpenSSH server.

Paigaldus

Paigalda LXC ja mallide skriptid:

apt-get install lxc lxc-templates bridge-utils

Konteineri loomine

Loo Debian 8 konteiner:

lxc-create -n test1 -t debian -- -r jessie

LXC konteinereid saab paigutada ka failisüsteemi jaotistesse a'la Btrfs või ZFS subvolume:

lxc-create -n test2 -t debian -B btrfs -- -r jessie

Niiviisi paigutatakse konteineri juurfailisüsteem /var/lib/lxc/test2/rootfs Btrfs subvolume sisse, mida saab hõlpsalt varundada.

Ubuntu 14.04 i386 konteineri saab luua järnevalt:

lxc-create -n katse -B btrfs -t ubuntu -- -r trusty -a i386

Paigaldada saab ka eel-valmistatud juurfailisüsteemi, see on pisut kiirem kui ülemine:

lxc-create -n katse -B btrfs -t download -- -d ubuntu -r trusty -a i386

Important

Ubuntu 15.04 ning Debian 8 võtsid kasutusele systemd, mis tähendab et vanemal peremeesoperatsioonisüsteemil nende või hilisemate külalisopeartsioonisüsteemide käitamine on veel problemaatiline.

Võõra arhitektuuriga konteinerid

64-bitise x86 protsessori peal saab otse käitada ka 32-bitist konteinerit, kui konteineri loomisel kasutada -a i386 võtit:

lxc-create -n test2 -t debian -B btrfs -- -r jessie -a i386

Võõra arhitektuuriga (ARM, MIPS, PowerPC jms) konteinerite käitamiseks tuleb paigaldada QEMU emulatsioonikiht:

apt-get install qemu-user-static

Nii saab luua näiteks ARMv7 arhitektuuriga konteineri:

lxc-create -n test3 -t download -B btrfs -- -d debian -r wheezy -a armhf

Enne käivitamist peaks paigaldama QEMU binaarid ka konteineri sisse:

cp /usr/bin/qemu-*-static /var/lib/lxc/test3/rootfs/usr/bin/

Emuleeritud arhitetuurid on muidugi aeglased, aga see võimaldab näiteks x86-64 riistvara peal teha tarkvaraarendust armhf platvormile.

Linux tuumKonteiner #1Konteiner #2Konteiner #3Debian x86juurfailisüsteemUbuntu x86-64juurfailisüsteemFedora armhfjuurfailisüsteemHostrootqemu-arm-staticMälux86-64 protsessorStorage

binfmt-support abil teab tuum kuidas ühele või teisele arhitektuurile mõeldud binaari käitada.

Konteinerite haldus

Käivita konteiner:

lxc-start -n katse -d

Haagi konteineri käsureale:

lxc-attach -n katse

Konteineri seest saab konteineri kinni panna ja taaskäivitada tavapäraste halt ja reboot käskudega.

Peremeesmasinast saab konteineri viisakalt kinni panna järgnevalt:

lxc-stop -n katse

Konteinerite nimekiri:

lxc-ls -f

Konteineri automaatseks käivitamiseks alglaadimisel lisa järgnev rida faili /var/lib/lxc/katse/config:

lxc.start.auto = 1

Võrgu seadistamine

Vaikimisi kointeinerid kas ei saa võrku üldse (Debian 8, Ubuntu 14.04) või nad liidetakse lxcbr0 silla koosseisu (Ubuntu 15.04+), kus neile küll pakutakse IP aadress aga selle kaudu internetti veel ei pääse. Kõige pealt tee kindlaks et on paigaldatud sildade seadistamiseks ette nähtud tööriistad:

apt-get install bridge-utils

Peata võrguliides eth0, vastasel korral jääb talle IP aadress külge ja tekivad anomaaliad kui sillal ja võrguliidesel mõlemal sama IP aadress on.

ifdown eth0

Selleks, et mõlemas keskkonnas füüsilisse võrku ligipääs anda ning mitte konflikti minna eelseadistatud võrguliidestega nagu lxcbr0 võime ümber seadistada peremeesmasina võrgu failis /etc/network/interfaces:

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
    # Lisa füüsiline eth0 silla koosseisu
    bridge_ports eth0

# Eemalda võrguliidese definitsioon füüsilise võrguliidese jaoks:

#auto eth0
#iface eth0 inet ...

Käivita sild:

ifup br0

Veendu, et br0 saab legitiimse IP-aadressi ning et eth0 ning teistel silla koosseisu kuuluvatel võrguliidestel poleks IP-aadressi määratud. Kui jäi eelnevalt eth0 kinni panemata saab võrguliidese lülitada nn promiscuous režiimi järgnevalt:

ifconfig eth0 0.0.0.0 promisc up

Seadista külalismasina võrk ümber failis /var/lib/lxc/katse/config:

# Kasuta virtuaalset ethernet võrguliidest
lxc.network.type = veth

# Võrguliides käivitatakse konteineri käivitamisel
lxc.network.flags = up

 # Võrguliides lisatakse selle silla koosseisu
lxc.network.link = br0

Silla olekut saad kontrollida brctl ja ifconfig abil:

ifconfig br0        # Liidesel peaks olema füüsilise võrgu aadress
ifconfig eth0       # Liidesel ei tohiks olla IP aadressi
brctl show br0      # Interfaces all peaks olema eth0 ja vethXXXX (per-konteiner) liidesed
Ubuntu Debian