Debian LXC: Unterschied zwischen den Versionen
Zeile 551: | Zeile 551: | ||
lxc-attach -n <container> passwd. | lxc-attach -n <container> passwd. | ||
geändert werden. | geändert werden. | ||
==Optional: Aktivieren Login mittels Root== | |||
Sollte der SSH login für '''root''' nicht aktiviert sein, kann dies in der sshd_config aktiviert werden. | |||
nano /etc/ssh/sshd_config | |||
Folgender Eintrag muss geändert werden: | |||
Von: | |||
PermitRootLogin without-password | |||
nach: | |||
PermitRootLogin yes | |||
Anschließend muss der SSH Server neu gestartet werden: | |||
/etc/init.d/ssh restart |
Version vom 6. Januar 2017, 20:27 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 Debian Squeeze
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 /cgroup cgroup defaults 0 0
Cgroup mounten:
mkdir /cgroup mount /cgroup
Cgroups Debian Wheezy+Jessie
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 /sys/fs/cgroup cgroup defaults 0 0
Cgroup mounten:
mount /sys/fs/cgroup
Debian Wheezy Template
Das mit Debian Wheezy installierte Template ist leider fehlerhaft. Hier wird ein gefixtes Template installiert.
cd /usr/share/lxc/templates wget ftp://download:download@schiele.homelinux.org/debian/lxc-debian-wheezy chmod +x lxc-debian-wheezy
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.
Debian Wheezy
lxc-create -n wheezy -t debian-wheezy
Damit wird der Container wheezy mit dem User root und dem Passwort root angelegt.
Debian Jessie
lxc-create -n jessie -t debian -- -r jessie
Damit wird der Container jessie angelegt. Das Passwort des User root wird während des Prozesses angezeigt.
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
Vorhandene Einträgen notfalls auskommentieren:
#lxc.utsname = debain #lxc.network.ipv4 = 0.0.0.0/24 #lxc.network.hwaddr = 00:1E:2F:BA:F0:2A
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 und Domain
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
Desweiteren sollte die Domain korrekt gesetzt werden:
vi rootfs/etc/hosts
Am Anfang des Files sollten folgende beiden Zeilen vorhanden sein bzw. eingefügt werden:
127.0.0.1 localhost 127.0.1.1 debian.schiele.homelinux.org debian
Paketquellen
cd /var/lib/lxc/debian vi rootfs/etc/apt/sources.list
Es epfiehlt sich, dass das File folgende Zeilen enthält (für einen Debian-Wheezy Container):
deb http://ftp.de.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.de.debian.org/debian/ wheezy main contrib non-free deb http://security.debian.org/ wheezy/updates main contrib non-free deb-src http://security.debian.org/ wheezy/updates main contrib non-free deb http://ftp.de.debian.org/debian/ wheezy-updates main contrib non-free deb-src http://ftp.de.debian.org/debian wheezy-updates main contrib non-free
Für einen Debian-Jessie Container:
deb http://ftp.de.debian.org/debian/ jessie main contrib non-free deb-src http://ftp.de.debian.org/debian/ jessie main contrib non-free deb http://security.debian.org/ jessie/updates main contrib non-free deb-src http://security.debian.org/ jessie/updates main contrib non-free deb http://ftp.de.debian.org/debian/ jessie-updates main contrib non-free deb-src http://ftp.de.debian.org/debian jessie-updates main contrib non-free
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
Mit dem Befehl
lxc-shutdown -n lxc-container
kann der LXC-Container vom Hostsystem heruntergefahren werden, falls der Workaround (siehe hier) eingerichtet wurde.
Nun den Container zum ersten mal starten:
lxc-start -n debian -d
Hinweis: | |
Aus Sicherheitsgründen sollte als erster Schritt das Root-Passwort geändert werden. Dies ist Standardmäßig 'root: passwd root |
LXC Info
Mit dem Befehl lxc-info besteht die Möglichkeit zu prüfen, ob ein Container gestartet oder gestoppt wurde:
lxc-info -n lxc-container
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.
- Debian Wheezy:
vi /etc/default/lxc
- folgende Änderungen durchführen:
LXC_AUTO="true" LXC_DIRECTORY="/var/lib/lxc"
- symbolische Links im Ordner /etc/lxc/auto erstellen:
ln -s /var/lib/lxc/debian/config /etc/lxc/auto/debian ln -s /var/lib/lxc/squeeze/config /etc/lxc/auto/squeeze
- Debian Jessie:
vi /var/lib/lxc/debian/config
Folgenden Eintrag anpassen/ergänzen:
lxc.start.auto = 1
LXC-Shutdown
Hinweis: | |
Nicht erforderlich für Debian Jessie. lxc-stop fährt den Container zuverlässig herunter, anstatt diesen zu killen. |
Wenn der Hostrechner neu gebootet (reboot)oder abgeschaltet wird (poweroff), dann werden die LXC-Gastcontainer mittels lxc-stop Befehl gekilled. Dies könnte unter Umständen zu Schäden am Dateisystem der Gastcontainer führen. Deshalb wird hier ein Workaround für dieses Problem beschrieben, sodass alle Gast Container ordentlich heruntergefahren werden, bevor der Hostrechner komplett ausgeschaltet wird.
Bei ALLEN Gastcontainern folgende Änderung im File /etc/inittab durchführen. Dies kann entweder vom Host aus erfolgen:
vi /var/lib/lxc/lxc-container/rootfs/etc/inittab
oder im Gast selbst per lxc-console/Putty:
vi /etc/inittab
Folgende Zeile einfügen (z.B. am Ende):
pf::powerwait:poweroff
Achtung: | |
|
Ändern des/der Templates, damit das File etc/inittab beim künftigen Anlegen von LXC-Containern automatisch den zusätzlichen Eintrag enthält:
vi /usr/lib/lxc/templates/debian-squeeze
In Block die Zeile pf::powerwait:poweroff ergänzen, sodass der Block folgendermaßen aussieht:
cat <<EOF > $rootfs/etc/inittab id:3:initdefault: si::sysinit:/etc/init.d/rcS l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin 1:2345:respawn:/sbin/getty 38400 console c1:12345:respawn:/sbin/getty 38400 tty1 linux c2:12345:respawn:/sbin/getty 38400 tty2 linux c3:12345:respawn:/sbin/getty 38400 tty3 linux c4:12345:respawn:/sbin/getty 38400 tty4 linux pf::powerwait:poweroff EOF
Durch obige Änderung wird bei einem Powerfail Ereignis der poweroff Befehl im jeweiligen Container ausgeführt. Dieses Powerfail Ereignis wird von folgendem Script lxc-shutdown für den jeweiligen Container ausgelöst.
vi /usr/bin/lxc-shutdown
Folgende Zeilen einfügen:
#! /bin/sh # Shut down container. if [ $# -ne 2 ]; then echo "lxc-shutdown: missing container name, use --name option" exit 1 fi case "$1" in -n|--name) cont=$2 ;; *) echo "lxc-shutdown: missing container name, use --name option" exit 1 ;; esac PS=`lxc-ps -C init -opid|grep $cont` if [ -z "$PS" ]; then echo " Error: LXC-Container '$cont' not running or not existing!" exit 1 fi echo "$PS" | while read VM PID ; do echo -n " shutting down LXC-Container '$cont' ... " kill -PWR $PID timeout 30 lxc-wait -n $VM -s STOPPED echo "success" done
Script ausführbar machen:
chmod +x /usr/bin/lxc-shutdown
Damit dieses Shutdown-Script beim Herunterfahren des Hostsystems bzw. beim Befehl /etc/init.d/lxc stop ausgeführt wird, muss noch das Startscript angepasst werden:
vi /etc/init.d/lxc
Den Block um ca. Zeile 57
stop) log_daemon_msg "Stopping $DESC" action_all "lxc-stop -n"
folgendermaßen abändern
stop) log_daemon_msg "Stopping $DESC" action_all "lxc-shutdown -n"
Funktionstest: Auf den LXC-Gastsystemen ein Putty-Fenster öffnen, um beobachten zu können, ob der jeweilige Gast ordnungsgemäß heruntergefahren wird, oder gekillt wird.
Auf dem Hostsystem ausführen:
/etc/init.d/lxc stop
Sämtliche in /etc/default/lxc definierten Container sollten nun ordnungsgemäß heruntergefahren werden. Dies ist an folgender Meldung im jeweiligen Putty-Fenster ersichtlich:
The system is going down for system halt NOW!
Optional: LXC-Reboot
Folgendes Script bietet eine einfache und komfortable Möglichkeit, einen LXC-Container vom Hostsystem zu rebooten.
Voraussetzung:
- Debian Wheezy: LXC-Shutdown-Script eingerichtet
- Debian Jessie: keine
vi /usr/bin/lxc-reboot
- Unter Debian Wheezy folgende Zeilen einfügen:
#! /bin/sh # Reboot container. if [ $# -ne 2 ]; then echo "lxc-reboot: missing container name, use --name option" exit 1 fi case "$1" in -n|--name) cont=$2 ;; *) echo "lxc-reboot: missing container name, use --name option" exit 1 ;; esac lxc-shutdown -n $cont echo -n "Starting Container '$cont' ... " lxc-start -n $cont -d echo "success"
- Unter Debian Jessie folgende Zeilen einfügen:
#! /bin/sh # Reboot container. if [ $# -ne 2 ]; then echo "lxc-reboot: missing container name, use --name option" exit 1 fi case "$1" in -n|--name) cont=$2 ;; *) echo "lxc-reboot: missing container name, use --name option" exit 1 ;; esac lxc-stop -n $cont echo -n "Starting Container '$cont' ... " lxc-start -n $cont -d echo "success"
Script ausführbar machen:
chmod +x /usr/bin/lxc-reboot
Container neu starten:
lxc-reboot -n lxc-container
Container auflisten
Mittels lxc-ls können sämtliche definierten und aktuell laufende LXC-Container angezeigt werden.
lxc-ls
Ausgabe z.B.:
debian squeeze test squeeze test
Die Ausgabe bedeutet:
Die Container in der ersten Zeile sind definiert => debian, squeeze und test Die Container in der zweiten Zeile werden aktuell ausgeführt => squeeze und test
Gastcontainer löschen
Zum löschen eines Containers dient der Befehl
lxc-destroy -n lxc-container z.B. lxc-destroy -n debian
Container clonen
Damit der "Clone" Befehl funktioniert, muss rsync und lxc-clone installiert sein.
apt-get install rsync
Nun kann mittels dem "Clone" Befehl der Container geklont werden. Dies geht so:
lxc-clone -o <Containername Original> -n <Containername Kopie>
Z.B.
lxc-clone -o webserver -n webserver_bak
Zugriff auf USB-Geräte
USB-Geräte können in einem LXC-Container zur Verfügung gestellt werden. Im Gastcontainer muss zunächst ein Verzeichnis angelegt werden, in dem die USB-Geräte zur Verfügung gestellt werden können:
- Im Gastcontainer:
mkdir -p /dev/bus/usb
- alternativ vom Host-PC:
mkdir -p /var/lib/container_name/root/dev/bus/usb
Folgende Schritte auf dem Host-PC ausführen:
- Ermitteln der ID-des zu verwendenden USB-Gerätes (Paket usbutils muss installiert sein):
lsusb
- Die Ausgabe könnte z.B. folgendermaßen aussehen:
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 003: ID 067b:2305 Prolific Technology, Inc. PL2305 Parallel Port Bus 002 Device 004: ID 04b4:fd11 Cypress Semiconductor Corp.
- Hier soll z.B. das Gerät 004 am USB-Bus 002 (SIS-PM Steckdosenleiste) im Container freigegeben werden. Diese verwendet einen Cypress USB-Adapter Chip.
ls -l /dev/bus/usb/002
- Die Ausgabe könnte folgendermaßen aussehen:
crw-rw-r-T 1 root root 189, 128 May 12 19:21 001 crw-rw-r-T 1 root root 189, 129 May 12 19:21 002 crw-rw-r-T 1 root lp 189, 130 May 12 19:21 003 crw-rw-r-T 1 root sispm 189, 131 May 15 02:29 004
=> Die ID- des USB-Gerätetreibers für Gerätes 004 am Bus 002 ist 189 (wie auch von allen anderen Geräten). Diese ID wird im folgenden Schritt benötigt, um den Zugriff aus dem Gastcontainer auf diese Geräteklasse zu erlauben.
vi /var/lib/lxc/lxc-container/config
Folgende Zeilen (im Bereich der bereits vorhandenen cgroup Statements) einfügen, um Zugriff auf USB-Geräte zu erlauben (hier ID 189, evtl anpassen):
#USB lxc.cgroup.devices.allow = c 189:* rwm
Folgende Zeile im Bereich der bereits vorhandenen Mount-Points einfügen, um das USB-Directory im Container zu mounten:
- Debian Wheezy Host:
lxc.mount.entry=/dev/bus/usb /var/lib/lxc/lxc-container/rootfs/dev/bus/usb none rw,bind 0 0
- Debian Jessie Host:
lxc.mount.entry=/dev/bus/usb dev/bus/usb none bind,optional,create=dir
- Container neu starten
- Überprüfen, ob USB-Geräte im Container verfügbar sind (Paket usbutils muss installiert sein):
lsusb
- Die Ausgabe sollte analog der Ausgabe auf dem Host sein (siehe oben)
Optional: Webinterface für LXC
Zur grafischen Verwaltung im Webbrowser kann LXC Wep Panel (LWP) verwendet werden. Mit Hilfe dieses Interfaces können Container angelegt, gestart, gestoppt, gecloned und die Settings geändert werden.
Installation:
wget -O - http://claudyus.github.io/LXC-Web-Panel/claudyus.gpg.key | apt-key add - echo "deb http://claudyus.github.io/LXC-Web-Panel/ debian/" | sudo tee /etc/apt/sources.list.d/lwp.list apt-get update apt-get install lwp
Falls die Installation mit einer Fehlermeldung abbricht, fehlt höchst wahrscheinlich das Startscript /etc/init.d/lwp:
vi /etc/init.d/lwp
Folgende Zeilen einfügen:
#!/bin/bash # Copyright (c) 2013 LXC Web Panel # All rights reserved. # # Author: Elie Deloumeau # # /etc/init.d/lwp # ### BEGIN INIT INFO # Provides: lwp # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: LWP Start script ### END INIT INFO WORK_DIR="/usr/bin/" SCRIPT="lwp" DAEMON="/usr/bin/python $WORK_DIR/$SCRIPT" PIDFILE="/var/run/lwp.pid" USER="root" function start () { echo -n 'Starting server...' /sbin/start-stop-daemon --start --pidfile $PIDFILE \ --user $USER --group $USER \ -b --make-pidfile \ --chuid $USER \ --chdir $WORK_DIR \ --exec $DAEMON echo 'done.' } function stop () { echo -n 'Stopping server...' /sbin/start-stop-daemon --stop --pidfile $PIDFILE --signal KILL --verbose echo 'done.' } case "$1" in 'start') start ;; 'stop') stop ;; 'restart') stop start ;; *) echo 'Usage: /etc/init.d/lwp {start|stop|restart}' exit 0 ;; esac exit 0
ausführbar machen:
chmod +x /etc/init.d/lwp
Installation erneut starten:
apt-get install lwp
Mit Webbrowser http://IP_des_Server:5000 aufrufen.
Login: User=admin / Passwort=admin
Optional: Container Password ändern ohne login
Hat man das Password eines Containers vergessen, kann man kann es mittels Befehl:
lxc-attach -n <container> passwd.
geändert werden.
Optional: Aktivieren Login mittels Root
Sollte der SSH login für root nicht aktiviert sein, kann dies in der sshd_config aktiviert werden.
nano /etc/ssh/sshd_config
Folgender Eintrag muss geändert werden:
Von: PermitRootLogin without-password nach: PermitRootLogin yes
Anschließend muss der SSH Server neu gestartet werden:
/etc/init.d/ssh restart