Mit LXC (Linux Container) können Linuxsysteme mit sehr geringem Overhead virtualisiert werden. Statt einem eigenen Kernel nutzen sie den Kernel des Hostsystems und es werden keine weiteren Treiber für die Steuerung der Hardware geladen.
Die Größe des rootfs kann bei LXC nicht mit Quotas, wie bei OpenVZ, limitiert werden. Dank LVM ist die Größenlimitierung des rootfs aber kein Problem.
Das Paket lxc und bridge-utils installieren:
aptitude install bridge-utils lxc
Damit der Linux Container auch eine Verbindung ins Internet herstellen kann ist die Netzwerkkonfiguration des Hostsystems in der /etc/network/interfaces zu ändern.
auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.2.10 netmask 255.255.255.0 network 192.168.2.0 gateway 192.168.2.1 dns-nameservers 192.168.2.1 bridge_ports eth0 bridge_fd 0 bridge_stp off
Danach die Netzwerkkonfiguration übernehmen:
/etc/init.d/networking restart
LXC verwendet für die Resourcenlimitierung cgroups (Control Groups). Mountverzeichnis anlegen:
mkdir /cgroup
Eintrag in der /etc/fstab und anschließendes mounten:
none /cgroup cgroup defaults 0 0 mount /cgroup
Mit debootstrap wird das rootfs angelegt.
mkdir -p /lxc/rootfs.natty cd lxc debootstrap --arch=i386 --variant=minbase natty rootfs.natty http://de.archive.ubuntu.com/ubuntu
Die Konfiguration des Linux Containers und der cgroups erfolgt in der conf.natty
# Name des Containers lxc.utsname = natty # TTY des Containers lxc.tty = 4 lxc.pts = 1024 # Netzwerkkonfiguration lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = 08:00:12:34:56:78 lxc.network.ipv4 = 192.168.2.190 lxc.network.name = eth0 # rootfs, fstab pts lxc.mount = /lxc/fstab.natty lxc.rootfs = /lxc/rootfs.natty
Der Zugriff auf die Hostdevices wird mit den cgroups per default verboten. Danach wird der Zugriff nur auf die nötigen Devices erlaubt.
# cgroups lxc.cgroup.devices.deny = a # /dev/null, /dev/zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm # consoles lxc.cgroup.devices.allow = c 5:1 rwm lxc.cgroup.devices.allow = c 5:0 rwm lxc.cgroup.devices.allow = c 4:0 rwm lxc.cgroup.devices.allow = c 4:1 rwm # /dev/random, /dev/urandom lxc.cgroup.devices.allow = c 1:9 rwm lxc.cgroup.devices.allow = c 1:8 rwm lxc.cgroup.devices.allow = c 136:* rwm lxc.cgroup.devices.allow = c 5:2 rwm # RTC lxc.cgroup.devices.allow = c 254:0 rwm
Einträge in der fstab.natty:
none /lxc/rootfs.natty/proc proc defaults 0 0 none /lxc/rootfs.natty/dev/pts devpts defaults 0 0 none /lxc/rootfs.suse114/sys sysfs defaults 0 0 none /lxc/rootfs.natty/var/run tmpfs defaults 0 0 none /lxc/rootfs.natty/dev/shm tmpfs defaults 0 0
In /lxc/rootfs.natty/etc/fstab wird nichts eingetragen. In der /lxc/rootfs.natty/etc/hosts wird der localhost eingetragen:
echo "127.0.0.1 localhost natty" > /lxc/rootfs.natty/etc/hosts
Da der Linux Container die vorhandenen Resourcen des Host nutzt sind noch die Upstart Konfigurationen von Udev zu löschen.
rm /etc/init/udev*
Die Installation des SSH-Servers kann per debootstrap oder anschließend per chroot erfolgen.
Anlegen des Container:
lxc-create -n natty -f conf.natty
Starten des Container
lxc-start -n natty
Anschließend kann in die Konsole des Containers gewechselt werden:
lxc-console -n natty
Stoppen des Containers:
lxc-stop -n natty