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.
Taustast
Konteinerite puhul on juurfailisüsteemid, st kataloogid mis sisaldavad operatsioonisüsteemi faile eraldatud, aga Linuxi tuum mida konteinerid kasutavad on sama ning jagatud.
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.
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