Linux kontejneri
linux kontejneri (LXC) su virtualizacijska metoda na bazi OS-a za pokretanje više izoliranih serverskih instalacija (kontejnera). LXC ne pruža virtualno računalo već virtualno okruženje čij sustav ima vlastite procese. Slično je chroot okolinu no puno elegantnije i sa većom izoliranošću sustava.
Ovaj članak je zamišljen kao kratak pregled kako postaviti i koristiti LXC. Kreće se od pretpostavke da korisnik već ima neko osnovno znanje o korištenju Linux sustava (pokretanje naredba kao root, konfiguracija kernela, mountanje diskova i sustava, shell scripting, chroot environment, networking setup, ...). Velika zahvala oko ovog članka/tutoriala ide Dobrici Pavlinušiću i Dwight Schaueru koji su pomogli ustupivši svoja predavanja vezana uz LXC.
Sadržaj
Konfiguracija kernela
Od kernela 2.6.35 većina potrebih stvari za LXC dolazi ugrađena uz kernel. Jedina iznimka je CONFIG_DEVPTS_MULTIPLE_INSTANCES. Novi kernel 3.0 > kod Arch Linuxa dolazi u potpunosti spreman za LXC.
Kroz GUI
General Setup
- [*] Group CPU scheduler
- [*] Group scheduling for SCHED_OTHER
- [*] Group scheduling for SCHED_RR/FIFO
- Basis for grouping tasks (Control groups)
- [*] Control groups
- [*] Control Group support
- [*] Namespace cgroup subsystem
- [*] Freezer cgroup subsystem
- [*] Device controller for cgroups
- [*] Cpuset support
- [*] Include legacy /proc/ /cpuset file
- [*] Simple CPU accounting cgroup subsystem
- [*] Resource counters
- [*] Memory Resource Controller for Control Groups
- [*] Memory Resource Controller Swap Extension(EXPERIMENTAL)
- [*] Memory Resource Controller for Control Groups
- [*] Namespace support
- [*] UTS namespace
- [*] IPC namespace
- [*] User namespace (EXPERIMENTAL)
- [*] PID Namespaces (EXPERIMENTAL)
- [*] Network namespace
Networking support
- Networking options
- [*] QoS and/or fair queueing
- [*] Control Group Classifier
- [*] QoS and/or fair queueing
Device drivers
- Character devices
- [*] Unix98 pty support
- [*] Support multiple instances of devpts
- [*] Unix98 pty support
Security options
- [*] File POSIX Capabilities
Kroz .config
CONFIG_GROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_CGROUP_SCHED=y CONFIG_CGROUPS=y CONFIG_CGROUP_NS=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_MEM_RES_CTLR=y CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y CONFIG_MM_OWNER=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_NET_CLS_CGROUP=y CONFIG_SECURITY_FILE_CAPABILITIES=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
Ispitivanje mogučnosti
Jednom kad je lxc paket instaliran potrebno je pokrenuti lxc-checkconfig te ispisati sve mogučnosti vašeg sustava
Konfiguracija
Ručno montiranje
mkdir /cgroup mount -t cgroup none /cgroup
Preko /etc/fstab
none /cgroup cgroup defaults 0 0
Premošćivanje
Za ovu radnju poretbno je instalirati paket bridge-utils
/etc/conf.d/bridges
bridge_br0="eth0" config_br0="brctl setfd br0 0" BRIDGE_INTERFACES=(br0)
/etc/rc.conf
MODULES=(... bridge ...) # YMMV, but this was not required eth0="eth0 0.0.0.0 up" # I had to do the 0.0.0.0, "eth0 up" was not sufficient. br0="dhcp" # or however you set your address INTERFACES=(eth0 br0)
Bridge forward delay
Kako bi br0 brže baratao sa dhcpom potrebono je forward delay bridge uređaja staviti na 0
brctl setfd br0 0
Patch za /etc/rc.d/network
Kako bi gornja metoda uspjela i radila potrebno je patchati /etc/rc.d/network
--- network.0 2010-07-11 05:48:47.000000000 -0400 +++ network 2010-09-03 15:01:25.000000000 -0400 @@ -181,6 +181,15 @@ /usr/sbin/brctl addif $br $brif || error=1 fi done + eval brconfig="\$config_${br}" + if [ -n "${brconfig}" ]; then + if ${brconfig}; then + true + else + echo config_${br}=\"${brconfig}\" \<-- invalid configuration statement + error=1 + fi + fi fi done }
Instalacija kontejnera
Postoji više načina na koje se tomože učiniti
Bootstrap
Bootstrapajte instalaciju ( mkarchroot, debootstrap, rinse,instalacija iz postojeće Linux instalacije ).No možete i prekopirati/koristiti cjelo /rootb okruženje sa nekog susta.
Download gotove instalacije
Postoje tar ballovi sa postojećim instalacijama nekih većih distribucija pa možete i njih skinuti i koristiti.Rade sasvim zadovoljavajuće.
Korištenjem lxc alata
/usr/bin/lxc-debian {create|destroy|purge|help} /usr/bin/lxc-fedora {create|destroy|purge|help}
Čvorovi uređaja
Kako UDEV neradi sa kontejnerima potrebno je to srediti ručno.Za o se koristi sljedeća skripta
#!/bin/bash ROOT=$(pwd) DEV=${ROOT}/dev mv ${DEV} ${DEV}.old mkdir -p ${DEV} mknod -m 666 ${DEV}/null c 1 3 mknod -m 666 ${DEV}/zero c 1 5 mknod -m 666 ${DEV}/random c 1 8 mknod -m 666 ${DEV}/urandom c 1 9 mkdir -m 755 ${DEV}/pts mkdir -m 1777 ${DEV}/shm mknod -m 666 ${DEV}/tty c 5 0 mknod -m 600 ${DEV}/console c 5 1 mknod -m 666 ${DEV}/tty0 c 4 0 mknod -m 666 ${DEV}/full c 1 7 mknod -m 600 ${DEV}/initctl p mknod -m 666 ${DEV}/ptmx c 5 2
Konfiguracija kontejnera
Glavna konfiguracijska datoteka se nalazi pod /etc/lxc
Osnovno podešavanje
lxc.utsname = $CONTAINER_NAME
lxc.mount = $CONTAINER_FSTAB lxc.rootfs = $CONTAINER_ROOTFS
lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = $CONTAINER_MACADDR lxc.network.ipv4 = $CONTAINER_IPADDR lxc.network.name = $CONTAINER_DEVICENAME
Podešavanje terminala
Ova konfiguracija je opcionalna, dakle nije užna za rad sa kontejnerima.Možete je dodati u osnovnu lxc konfiguracijsku datoteku ukoliko se želite logirati preko lxc-konzole ili terminala.
Virtualna konzola
Kontejner može pristupiti virtualnoj konzoli ukoliko je host trenutno koristi i ako nije u konfiguraciji kontejnera zabranjeno. Tipična kontejnerova konfiguracija neće dopustiti pristup virtualnoj konzoli.Kako bi se to omogučilo potrebnon je kontejneru pribaviti pristup
lxc.cgroup.devices.deny = a # Deny all access to devices lxc.cgroup.devices.allow = c 4:0 rwm # /dev/tty0 lxc.cgroup.devices.allow = c 4:1 rwm # /dev/tty1 lxc.cgroup.devices.allow = c 4:2 rwm # /dev/tty2
Kako bi kontejner mogao koristiti virtualnu konzolu potrebno je da istu ne koristi sustav domaćin (host). To najčešće traži uređivanje hostove /etc/inittab datoteke kako bi se pobrinuli da se nijedan proces hosta ne izvršava u konzoli koju koristi kontejner te je nakon editiraanja potrebno pokrenuti killall -HUP init.
Lokalna virtualna konzola
Broj virtualnih konzla kojima raspolaže kontejner je u pravilu definiran u njegovoj glavnoj konfiguracijskoj datoteci te je definiran kroz
lxc.tty = n
gdje je n broj konzola
/dev/tty
Kontejner mora imati /dev/tty1 datoteku za svaku virtualnu konzolu. Kreirati se mogu na sljedeći način
# mknod -m 666 /dev/tty1 c 4 1 # mknod -m 666 /dev/tty2 c 4 2
idt.
Konfiguracija log-in mogučnosti kontejnera
Kontejnerova virtualna konzola može se iskoristit za login sesije ukoliko kontejner vrti "getty" procese. To se radi preko kontejnerovog inita te se konfigurira u kontejnerovoj /etc/inittab datoteci na sljedeći način
c1:2345:respawn:/sbin/agetty -8 38400 tty1 linux
Pristup hosta
lxc.cgroup.devices.deny = a # Deny all access to devices
lxc.cgroup.devices.allow = c 1:3 rwm # dev/null lxc.cgroup.devices.allow = c 1:5 rwm # dev/zero
lxc.cgroup.devices.allow = c 5:1 rwm # dev/console lxc.cgroup.devices.allow = c 5:0 rwm # dev/tty lxc.cgroup.devices.allow = c 4:0 rwm # dev/tty0
lxc.cgroup.devices.allow = c 1:9 rwm # dev/urandom lxc.cgroup.devices.allow = c 1:8 rwm # dev/random lxc.cgroup.devices.allow = c 136:* rwm # dev/pts/* lxc.cgroup.devices.allow = c 5:2 rwm # dev/pts/ptmx
# No idea what this is .. dev/bsg/0:0:0:0 ??? lxc.cgroup.devices.allow = c 254:0 rwm
Editiranje fstaba
none $CONTAINER_ROOTFS/dev/pts devpts defaults 0 0 none $CONTAINER_ROOTFS/proc proc defaults 0 0 none $CONTAINER_ROOTFS/sys sysfs defaults 0 0 none $CONTAINER_ROOTFS/dev/shm tmpfs defaults 0 0
Ovaj fstab se koristi od lxc-start prilikom mountanja kontejnera. Možete kreirati bilo koju točku mountanja koja je moguća kod host sustava no imajte na umu i sigurnost.
Gradnja i destrukciaj kontejnera
Gradnja
lxc-create -f $CONTAINER_CONFIGPATH -n $CONTAINER_NAME
lxc-create će napraviti /var/lib/lxc/$CONTAINER_NAME sa novom kopijom konfiguracije smještene pod $CONTAINER_CONFIGPATH
Destrukcija
lxc-destroy -n $CONTAINER_NAME
Pripremanje hosta za virtualizaciju
/etc/inittab
Zakomentirajte sve getty-e koji su nepotrebni
/etc/rc.sysinit
#!/bin/bash # Whatever is needed to clean out old daemon/service pids from your container rm -f $(find /var/run -name '*pid') rm -f /var/lock/subsys/*
# Configure network settings ## You can either use dhcp here, manually configure your ## interfaces or try to get the rc.d/network script working. ## There have been reports that network failed in this ## environment. route add default gw 192.168.10.1 echo > /etc/resolv.conf search your-domain echo >> /etc/resolv.conf nameserver 192.168.10.1
# Initally we don't have any container originated mounts rm -f /etc/mtab touch /etc/mtab
/etc/rc.conf
Poželjno je da maknete sve ili barem neke daemone hardvera te također ovisno o situaciji maknite i network daemon