Debian LXC: Unterschied zwischen den Versionen

Aus Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 60: Zeile 60:
  #CGroup for LXC
  #CGroup for LXC
  cgroup  /var/local/cgroup  cgroup  defaults  0  0
  cgroup  /var/local/cgroup  cgroup  defaults  0  0
Cgroup Verzeichnis erstellen:
mkdir -p /var/local/cgroup
Cgroup mounten:
Cgroup mounten:
  mount /var/local/cgroup
  mount /var/local/cgroup


==LXC Templates==
==LXC Templates==

Version vom 24. April 2011, 15:21 Uhr

Einleitung

LXC (Linux Container) erstellt mehrere isolierte, sichere virtuelle Umgebungen (Virtual Environments, kurz VEs) auf einem einzigen physischem Server, sorgt so für eine bessere Serverausnutzung und stellt sicher, dass Programme (Applikationen) nicht miteinander in Konflikt geraten. Jede VE arbeitet und verhält sich genau wie ein eigenständiger Server; VEs können unabhängig voneinander neu gestartet werden und haben Root-Zugriff, Benutzer, IP-Adressen, Speicher, Prozesse, Dateien, Programme, Systembibliotheken und Konfigurationsdateien.

Im Vergleich zu Virtuellen Maschinen von VMware bzw Virtualbox oder zu Para-Virtualisierungstechnologien wie Xen bietet OpenVZ weniger Flexibilität, was die Auswahl von Gast-Betriebssystemen betrifft: sowohl Gast- als auch Host-Betriebssystem muss Linux sein (obwohl verschiedene Linux-Distributionen in verschiedenen VEs eingesetzt werden können).

Im Gegensatz zu OpenVZ ist LXC Bestandteil des Mainline Kernel und erfordert somit keinerlei spezielle Patches, wie dies bei OpenVZ erforderlich ist. D.h. es wird im Rahmen des "normalen" Linux-Kernels weiterentwickelt und sollte deshalb in Zukunft gegenüber OpenVZ bevorzugt werden. Der Nachfolger des aktuellen Squeeze stellt vermutlich den Support für OpenVZ ein.


Installation LXC

Nachdem LXC Bestandteil des Kernels ist, sind lediglich Userspace-Tools für die Verwaltung der LXC-Container erforderlich.

apt-get update
apt-get install lxc bridge-utils debootstrap


Konfiguration des Host

Netzerkbridge

Für die Nezwerkverwaltung benötiogt LXC eine Netzwerkbrücke (Bridge) auf dem Host.

vi /etc/network/interfaces

Z.B. vorhandene Einstallungen:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
   address 192.168.100.111
   netmask 255.255.255.0
   gateway 192.168.100.1

Die physikalische Netzwerkschnittstelle (z.B. eth0) auf manual setzen (und die iface-Einstellungen auskommentieren):

auto eth0
iface eth0 inet manual
#iface eth0 inet static
#   address 192.168.100.111
#   netmask 255.255.255.0
#   gateway 192.168.100.1
#   broadcast 192.168.100.255

Stattdessen die Bridge automatisch konfigurieren:

auto br0
iface br0 inet static
  address 192.168.100.111
  netmask 255.255.255.0
  gateway 192.168.100.1
  broadcast 192.168.100.255
  bridge_ports eth0
  bridge_fd 0
  bridge_maxwait 0
  bridge_stp off

Netzwerk neu starten, um die Änderungen zu übernehmen:

/etc/init.d/networking restart


Cgroups

Für die Verwaltung der Ressourcen der LXC-Container sind sog. cgroups erforderlich.

vi /etc/fstab

Folgende Zeilen ans Ende anfügen:

#CGroup for LXC
cgroup  /var/local/cgroup  cgroup  defaults  0  0

Cgroup Verzeichnis erstellen:

mkdir -p /var/local/cgroup

Cgroup mounten:

mount /var/local/cgroup

LXC Templates

Im Verzeichnis /usr/lib/lxc/templates/ liegen Templates für die Installation von Debian (Lenny), Ubuntu und Fedory Distributionen als Gast Container.

Das Debian-Template lädt lediglich ein Debian Minimalsystem auf die lokale Festplatte herunter, sodass sogar Basisfunktionalitäten wie Ping nicht zur Verfügung stehen. Die Liste zu installierender Pakete kann jedoch beliebig erweitert werden. Z.B.:

vi /usr/lib/lxc/templates/lxc-debian

Zu Beginn der Funktion download_debian() (Zeile 86) wird die Variable packes definiert, die zusätzliche Pakete enthält, die installiert werden. Diese Variable erweitern (durch \ am Zeilenende erstreckt sich dieser Parameter über mehrere Zeilen). Hier z.B. incl. einiger sinnvoller Ergänzungen nach openssh-server (diese Liste kann beliebig erweitert werden):

   packages=\
ifupdown,\
locales,\
libui-dialog-perl,\
dialog,\
dhcp-client,\
netbase,\
net-tools,\
iproute,\
openssh-server,apt-utils,wget,vim-nox,nano,iputils-ping,netcat,rsyslog


Durch eine kleien Änderung des Debian-Templates kann dieses anstatt einer Lenny auch eine Squeeze Distribution installieren:

cp /usr/lib/lxc/templates/lxc-debian /usr/lib/lxc/templates/lxc-squeeze
chmod +x /usr/lib/lxc/templates/lxc-squeeze
vi /usr/lib/lxc/templates/lxc-squeeze
  • In Zeile 93: dhcp-client durch isc-dhcp-client ersetzen
  • In Zeile 113: lenny durch squeeze ersetzen
  • In Zeile 139: cache="/var/cache/lxc/debian" durch cache="/var/cache/lxc/squeeze" ersetzen
  • In Zeile 223: cache="/var/cache/lxc/debian" durch cache="/var/cache/lxc/squeeze" ersetzen


LXC Container anlegen

Die Container (Root Filesystem des Gastbetriebssystems) werden in Unterverzeichnissen unter /var/lib/lxc abgelegt. Beispielhaft wird hier ein Debian/Squeeze Gast-Container mit Namen debian angelegt.

mkdir /var/lib/lxc/debian
/usr/lib/lxc/templates/lxc-squeeze -p /var/lib/lxc/debian/
Bulbgraph.png Hinweis:
Am Ende des Scriptes werden Fehler bzgl. Locales ausgegeben ("perl: warning: Setting locale failed." ...), die normal sind, da ein minimales Debian Squeeze System installiert wurde. Die Locales werden im Verlauf dieser Erläuterungen konfiguriert.


Das Konfigurationsfile des Containers wurde im Unterverzeichnis debian angelegt. Es sollte aber auch im Ordner /etc/lxc/debian.conf abgelegt werden, damit der Container Autostart beim Systemstart funktioniert (Siehe hier). Dies wird mit Hilfe eines symbolischen Links erledigt:

ln -s /var/lib/lxc/debian/config /etc/lxc/debian.conf


Gast Konfiguration

Allgemein

Das Konfigurationsfile des oben angelegten LXC Containers liegt im jeweiligen Unterverzeichnis des Containers (z.B. /var/lib/lxc/debian/config).

Das Root Filesystem des Gast-Containers wird im selben Unterverzeichnis wie das Konfigfile abgelegt. Im Ordner rootfs/ liegen sämtliche Files des virtuellen Gastbetriebssystems und können vom Host wie normale Files behandelt werden.


Container Konfigurationsfile

Mit Hilfe folgender Einstellungen wird der neue Gast debian an die Network Bridge br0 "angedockt". Die Netzwerkschnittstelle innerhalb des Gastes lautet eth0, der nicht mit der physikalischen Nezwerkkarte eth0 auf dem Host zu verwechseln ist.

cd /var/lib/lxc/debian
vi config

Folgende Einträge ergänzen:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.mtu = 1500

Optional: Festlegen der MAC-Adresse des virtuellen Gastes (z.B. MAC-Adresse=ce:a2:45:df:2a:3f):

lxc.network.hwaddr = ce:a2:45:df:2a:3f


Netzwerkkonfiguration

Standardmäßig verwenden die LXC Gastsysteme DHCP. Falls eine feste IP-Adresse gewünscht wird, folgende Schritte ausführen:

cd /var/lib/lxc/debian
vi rootfs/etc/network/interfaces

Das File sieht standardmäßig folgendermaßen aus:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Ändern in feste IP-Adressen (z.B. 192.168.100.111):

iface eth0 inet static
        address 192.168.100.111
        netmask 255.255.255.0
        broadcast 192.168.100.255
        gateway 192.168.100.1


Hostname

Dem LXC Gast sollte ein eindeutiger Hostname zugewiesen werden, da ansonsten der Name des Hosts verwendet wird.

cd /var/lib/lxc/debian
vi rootfs/etc/hostname

Hostname (ohne Domain) eingeben. Z.B. debian


TTY-Devices für Consolen

cd /var/lib/lxc/debian
mknod -m 666 rootfs/dev/tty1 c 4 1
mknod -m 666 rootfs/dev/tty2 c 4 2
mknod -m 666 rootfs/dev/tty3 c 4 3
mknod -m 666 rootfs/dev/tty4 c 4 4


Locales, Timezone, Shell und Root-Passwort

Während der Installation des Systems wurden keine Locales installiert bzw. generiert, sodass die Konfigscripte für perl Warnungen diesbezüglich ausgeben. Desweiteren wurde als Timezone GMT gewählt und das Root-Passwort auf root gesezt. Diese Einstellungen werden im Folgenden angepasst.


Mittels chroot in den Container wechseln, um die folgenden Änderungen durchzuführen:

chroot /var/lib/lxc/debian/rootfs


Locales konfigurieren:

dpkg-reconfigure locales
  • In der Liste Locales to be generated die zu installierende Locale-Variante (oder mehrere) mit Leertaste auswählen, z.B. en_us.UTF8
  • Mit Tab-Taste OK auswählen und Return betätigen
  • Im nächsten Dialog die Default Locale auswählen (die eben installierte)
  • Mit Tab-Taste OK auswählen und Return betätigen


Einstellen der Zeitzone:

dpkg-reconfigure tzdata
  • In der Liste Europe markieren
  • Mit Tab-Taste OK auswählen und Return betätigen
  • In der Liste Timezone Berlin markieren
  • Mit Tab-Taste OK auswählen und Return betätigen

Standardmäßig kommt Dash als Shell zum Einsatz. Dies ist eine schnelle, schlanke Alternative Shell. Aus Kompatibilitätsgründen empfiehlt es sich allerdings, Bash zu verwenden:

dpkg-reconfigure dash

Im erscheinenden Dialog no selektieren, um Bash zu verwenden.


Aus Sicherheitsgründen sollte das Root-Passwort des LXC-Containers unbedingt geändert werden:

passwd root


Chroot-Umgebung wieder verlassen:

exit


Start/Stop des LXC Containers

Der Container kann mit folgenden Befehlen (auf dem Host ausführen!) gestartet bzw. beendet werden:

lxc-start -n lxc-container -d
lxc-stop -n lxc-container
Bulbgraph.png Hinweis:
Der Befehl lxc-stop bricht eine laufende virtuelle Maschine einfach ab, ohne sie herunterzufahren. D.h. dieser Vorgang entspricht dem Ausschalten der Stromversorgung eines Linux-Rechners, ohne diesen vorher herunterzufahren. Um Schäden am Dateisystem der virtuellen Maschine zu vermeiden, sollte diese immer mit dem Shutdown-Befehl shutdown -h now auf der Console der virtuellen Maschine (lxc-console oder Putty) heruntergefahren werden. Nur wenn dies nicht möglich ist, kann als Ausweg der Befehl lxc-stop verwendet werden.


Nun den Container zum ersten mal starten:

lxc-start -n debian -d


LXC Console

LXC bietet die Möglichkeit, eine Console auf den Gast zu öffnen, und so diesen zu administrieren (z.B. ermitteln der IP-Adresse wenn DHCP im Gastbetriebssystem verwendet wird). Andererseits wird mit dem Debian bzw. Squeeze Installerscript automatisch ein SSH-Server mit installiert, sodass die Console eine eher weniger bedeutendes Feature darstellt (außer die IP-Adresse des Gastes ist nicht bekannt).

lxc-console -n lxc-container


Autostart

LXC-Container können beim Systemstart automatisch gestartet werden.

vi /etc/default/lxc

folgende Änderungen durchführen:

RUN=yes
# Start /etc/lxc/debian.conf, /etc/lxc/squeeze.conf
CONTAINERS="debian squeeze"

Dadurch werden beim Systemstart die beiden Container debian und squeeze automatisch gestartet