Linux kontejneri

Izvor: HrOpenWiki
Inačica od 12:22, 17. rujna 2011. koju je unio/unijela Lutherus (razgovor | doprinosi)

(razl) ←Starija inačica | vidi trenutačnu inačicu (razl) | Novija inačica→ (razl)
Skoči na: orijentacija, traži

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.

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)
  • [*] 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

Device drivers

  • Character devices
    • [*] Unix98 pty support
      • [*] Support multiple instances of devpts

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