LXC - Linux Container Virtualisierung

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.

 

Anleitung basierend auf Ubuntu Maverick

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
« Upgrade von openSuSE 11.3 auf 11.4 Samba 3.6 Pakete für Ubuntu Lucid bauen »