Debian LXC: Unterschied zwischen den Versionen

Aus Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(55 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 52: Zeile 52:
Netzwerk neu starten, um die Änderungen zu übernehmen:
Netzwerk neu starten, um die Änderungen zu übernehmen:
  /etc/init.d/networking restart
  /etc/init.d/networking restart
===LXC Container Defaults anpassen===
vi /etc/lxc/default.conf
Folgende Zeile löschen
lxc.network.type = empty
und durch folgenden Block ersetzen, damit alle neu angelegten LCC-Container eine virtuelle Netzwerk Karte zugewiesen werden:
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.hwaddr = 02:50:c2:20:xx:xx




===Cgroups===
===Cgroups===
Für die Verwaltung der Ressourcen der LXC-Container sind sog. cgroups erforderlich.
Für die Verwaltung der Ressourcen der LXC-Container sind sog. cgroups erforderlich. In Debian Stretch sollte der cgroups Eintrag bereits vorhanden sein.  
  vi /etc/fstab
  vi /etc/fstab
Folgende Zeilen ans Ende anfügen:
Folgende Zeilen ans Ende anfügen:
  #CGroup for LXC
  #CGroup for LXC
  cgroup  /var/local/cgroup cgroup defaults  0  0
  cgroup  /sys/fs/cgroup cgroup defaults  0  0
 
Cgroup Verzeichnis erstellen:
mkdir -p /var/local/cgroup
 
Cgroup mounten:
Cgroup mounten:
  mount /var/local/cgroup
  mount /sys/fs/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.:
==LXC Container anlegen==
vi /usr/lib/lxc/templates/lxc-debian
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.
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:
===Debian Jessie Gast===
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
  lxc-create -n '''jessie''' -t debian -- -r jessie
* 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


Damit wird der Container '''jessie''' angelegt. Das Passwort des User '''root''' wird während des Prozesses angezeigt.


==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'''''
===Debian Stretch Gast===
/usr/lib/lxc/templates/lxc-squeeze -p /var/lib/lxc/'''''debian'''''/


{{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.}}
lxc-create -n '''jessie''' -t debian -- -r stretch


Damit wird der Container '''jessie''' angelegt. Das Passwort des User '''root''' wird während des Prozesses angezeigt.


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 [[Debian_LXC#Autostart|(Siehe hier)]]. Dies wird mit Hilfe eines symbolischen Links erledigt:
ln -s /var/lib/lxc/'''''debian'''''/config /etc/lxc/'''''debian'''''.conf




Zeile 121: Zeile 106:
  cd /var/lib/lxc/'''''debian'''''
  cd /var/lib/lxc/'''''debian'''''
  vi config
  vi config
Folgende Einträge ergänzen:
Folgende Einträge ergänzen (diese sollten bereits enthalten sein, da diese in den Container Defaults oben ergänzt wurden):
  lxc.network.type = veth
  lxc.network.type = veth
  lxc.network.flags = up
  lxc.network.flags = up
Zeile 127: Zeile 112:
  lxc.network.name = eth0
  lxc.network.name = eth0
  lxc.network.mtu = 1500
  lxc.network.mtu = 1500
Optional: Festlegen der MAC-Adresse des virtuellen Gastes (z.B. MAC-Adresse=ce:a2:45:df:2a:3f):
Optional: Festlegen der MAC-Adresse des virtuellen Gastes (z.B. MAC-Adresse=ce:02:50:c2:20:2a:3f):
  lxc.network.hwaddr = ce:a2:45:df:2a:3f
  lxc.network.hwaddr = 02:50:c2:20:2a:3f
 
{{Hinweis|
MAC-Adressen müssen im gesamten Netzwerk eindeutig/einmalig sein. Für jeden Container eine individuelle MAC-Adresse vergeben}}


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===
===Netzwerkkonfiguration===
Zeile 163: Zeile 155:




===TTY-Devices für Consolen===
===Paketquellen===
  cd /var/lib/lxc/'''''debian'''''
  cd /var/lib/lxc/'''''debian'''''
  mknod -m 666 rootfs/dev/tty1 c 4 1
  vi rootfs/etc/apt/sources.list
  mknod -m 666 rootfs/dev/tty2 c 4 2
Es epfiehlt sich, dass das File folgende Zeilen enthält (für einen Debian-Wheezy Container):
  mknod -m 666 rootfs/dev/tty3 c 4 3
deb http://ftp.de.debian.org/debian/ stretch main contrib non-free
  mknod -m 666 rootfs/dev/tty4 c 4 4
  deb-src http://ftp.de.debian.org/debian/ stretch main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
  deb-src http://security.debian.org/ stretch/updates main contrib non-free
deb http://ftp.de.debian.org/debian/ stretch-updates main contrib non-free
  deb-src http://ftp.de.debian.org/debian stretch-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


===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.


==Start/Stop des LXC Containers==
Der Container kann mit folgenden Befehlen (auf dem Host ausführen!) gestartet bzw. beendet werden:f
lxc-start -n '''''lxc-container'''''
lxc-stop -n '''''lxc-container'''''


Mittels chroot in den Container wechseln, um die folgenden Änderungen durchzuführen:
chroot /var/lib/lxc/'''''debian'''''/rootfs


Nun den Container zum ersten mal starten:
lxc-start -n '''''debian'''''


Locales konfigurieren:
lxc-start versucht den Container standardmäßig im Daemon-Mode zu starten (lxc-start -d in früheren Versionen). Falls Startprobleme auftreten, kan der Container im Vordergrund gestartet werden:
dpkg-reconfigure locales
lxc-start -n '''''debian''''' -F
* 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:
==Root Passwort festlegen==
dpkg-reconfigure tzdata
beim Anlegen eines Containers wird ein zufälliges Root Passwort vergeben.
* In der Liste '''Europe''' markieren
Dieses kann folgendermaßen vom Host festgelegt werden (auch hilfreich, wenn das Root Passwort eines Containers vergessen wurde):  
* Mit Tab-Taste '''OK''' auswählen und Return betätigen
  lxc-attach -n '''''lxc-container''''' passwd
* In der Liste Timezone '''Berlin''' markieren
geändert werden.
* Mit Tab-Taste '''OK''' auswählen und Return betätigen
{{Hinweis|
 
Container muss gestartet sein, damit lxc-attach funktioniert.}}
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'''''
 
{{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''''' bzw. '''''poweroff''''' 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.}}
Mit dem Befehl
lxc-shutdown -n '''''lxc-container'''''
kann der LXC-Container vom Hostsystem heruntergefahren werden, falls der Workaround (siehe [[Debian_LXC#Workaround für Container Shutdown|hier]]) eingerichtet wurde.
 
Nun den Container zum ersten mal starten:
lxc-start -n '''''debian''''' -d




Zeile 236: Zeile 215:
==Autostart==
==Autostart==
LXC-Container können beim Systemstart automatisch gestartet werden.
LXC-Container können beim Systemstart automatisch gestartet werden.
  vi /etc/default/lxc
  vi /var/lib/lxc/'''debian'''/config
folgende Änderungen durchführen:
Folgenden Eintrag anpassen/ergänzen:
RUN=yes
lxc.start.auto = 1
# Start /etc/lxc/'''''debian'''''.conf, /etc/lxc/'''''squeeze'''''.conf
 
  CONTAINERS="'''''debian''''' '''''squeeze'''''"
 
==LXC-Reboot==
Entweder:
lxc-stop -n '''''debian'''''
  lxc-start -n '''''debian'''''
 
oder:
lxc-stop -n '''''debian'''''
 


Dadurch werden beim Systemstart die beiden Container '''''debian''''' und '''''squeeze''''' automatisch gestartet
==Container auflisten==
Mittels lxc-ls können sämtliche definierten LXC-Container angezeigt werden:
lxc-ls
anzeige der laufenden Container:
lxc-ls --running
anzeige der gestoppten Container:
lxc-ls --stopped


Eine tabellarische Auflistung incl. State(running/stopped), Autostart, IP-Adresse kann mit folgendem Befehl angezeigt werden:
lxc-ls --fancy


==Workaround für Container Shutdown==
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 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:
==Gastcontainer löschen==
  vi /var/lib/lxc/'''''lxc-container'''''/rootfs/etc/inittab
Zum löschen eines Containers dient der Befehl
oder im Gast selbst per lxc-console/Putty:
lxc-destroy -n '''''lxc-container'''''
vi /etc/inittab
z.B.
Folgende Zeile einfügen (z.B. am Ende):
  lxc-destroy -n '''''debian'''''
pf::powerwait:poweroff


{{Achtung|
* Diese Änderung an allen LXC-Containern durchführen, mindestens jedoch bei denjenigen, die als Autostart (siehe [[Debian_LXC#Autostart|hier]]) eingerichtet wurden.
* evtl. laufende LXC-Container müssen unbedingt nach dieser Änderung angehalten und evtl. neu gestartet werden, da diese Änderung an /etc/inittab nur beim Start des Containers übernommen wird.
* Falls nicht beide Punkte beachtet wurden, dann wird der Hostrechner nicht mehr korrekt herunterfahren, sondern im Shutdownprozess "unendlich" lange warten.}}


Ändern des/der Templates, damit das File etc/inittab beim künftigen Anlegen von LXC-Containern automatisch den zusätzlichen Eintrag enthält:
==Container clonen==
vi /usr/lib/lxc/templates/debian-squeeze
Mittels dem "Copy" Befehl kann der Container geklont werden.
In Block die Zeile '''''pf::powerwait:poweroff''''' ergänzen, sodass der Block folgendermaßen aussieht:
Dies geht so:
    cat <<EOF > $rootfs/etc/inittab
    lxc-copy -n <Containername Original> -N <Containername Kopie>
id:3:initdefault:
Z.B.
si::sysinit:/etc/init.d/rcS
    lxc-clone - webserver -N webserver_bak
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
==Zugriff auf USB-Geräte==
Folgende Zeilen einfügen:
USB-Geräte können in einem LXC-Container zur Verfügung gestellt werden.
#! /bin/sh
Im Gastcontainer muss zunächst ein Verzeichnis angelegt werden, in dem die USB-Geräte zur Verfügung gestellt werden können:
# Shut down container.
* Im Gastcontainer:
  mkdir -p /dev/bus/usb
if [ $# -ne 2 ]; then
* alternativ vom Host-PC:
    echo "lxc-shutdown: missing container name, use --name option"
  mkdir -p /var/lib/'''container_name'''/root/dev/bus/usb
    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
    lxc-wait -n $VM -s STOPPED
    echo "success"
done


Script ausführbar machen:
Folgende Schritte auf dem Host-PC ausführen:
  chmod +x /usr/bin/lxc-shutdown
* 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


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:
*Container neu starten
  vi /etc/init.d/lxc
* Überprüfen, ob USB-Geräte im Container verfügbar sind (Paket usbutils muss installiert sein):
Den Block um ca. Zeile 57
  lsusb
  stop)
:Die Ausgabe sollte analog der Ausgabe auf dem Host sein (siehe oben)
    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:
==Optional: Webinterface für LXC==
/etc/init.d/lxc stop
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.
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!


==LXC-Reboot==
Installation:
Folgendes Script bietet eine einfache und komfortable Möglichkeit, einen LXC-Container vom Hostsystem zu rebooten.
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


Voraussetzung:
Falls die Installation mit einer Fehlermeldung abbricht, fehlt höchst wahrscheinlich das Startscript /etc/init.d/lwp:
* LXC-Shutdown-Script eingerichtet
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
   
   
  vi /usr/bin/lxc-reboot
  WORK_DIR="/usr/bin/"
Folgende Zeilen einfügen:
SCRIPT="lwp"
  #! /bin/sh
  DAEMON="/usr/bin/python $WORK_DIR/$SCRIPT"
  # Reboot container.
  PIDFILE="/var/run/lwp.pid"
USER="root"
   
   
  if [ $# -ne 2 ]; then
  function start () {
    echo "lxc-reboot: missing container name, use --name option"
        echo -n 'Starting server...'
    exit 1
        /sbin/start-stop-daemon --start --pidfile $PIDFILE \
fi
                --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
  case "$1" in
-n|--name)
        'start')
    cont=$2
                start
    ;;
                ;;
*)
        'stop')
    echo "lxc-reboot: missing container name, use --name option"
                stop
    exit 1
                ;;
    ;;
        'restart')
                stop
                start
                ;;
        *)
                echo 'Usage: /etc/init.d/lwp {start|stop|restart}'
                exit 0
                ;;
  esac
  esac
   
   
  lxc-shutdown -n $cont
  exit 0
  echo -n "Starting Container '$cont' ... "
ausführbar machen:
  lxc-start -n $cont -d
  chmod +x /etc/init.d/lwp
echo "success"
Installation erneut starten:
  apt-get install lwp
 


Script ausführbar machen:
Mit Webbrowser http://'''IP_des_Server''':5000 aufrufen.
chmod +x /usr/bin/lxc-reboot
Login: User=admin / Passwort=admin


Container neu starten:
lxc-reboot -n '''''lxc-container'''''


==Gastcontainer löschen==
==Optional: Aktivieren Login mittels Root==
Zum löschen eines Containers dient der Befehl
Sollte der SSH login für '''root''' nicht aktiviert sein, kann dies in der sshd_config aktiviert werden.
lxc-destroy -n '''''lxc-container'''''
 
  z.B.
nano /var/lib/lxc/'''<container>'''/rootfs/etc/ssh/sshd_config
  lxc-destroy -n '''''debian'''''
 
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

Aktuelle Version vom 12. Januar 2019, 10:07 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


LXC Container Defaults anpassen

vi /etc/lxc/default.conf

Folgende Zeile löschen

lxc.network.type = empty

und durch folgenden Block ersetzen, damit alle neu angelegten LCC-Container eine virtuelle Netzwerk Karte zugewiesen werden:

lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.hwaddr = 02:50:c2:20:xx:xx


Cgroups

Für die Verwaltung der Ressourcen der LXC-Container sind sog. cgroups erforderlich. In Debian Stretch sollte der cgroups Eintrag bereits vorhanden sein.

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


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 Jessie Gast

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.


Debian Stretch Gast

lxc-create -n jessie -t debian -- -r stretch

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 (diese sollten bereits enthalten sein, da diese in den Container Defaults oben ergänzt wurden):

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:02:50:c2:20:2a:3f):

lxc.network.hwaddr = 02:50:c2:20:2a:3f
Bulbgraph.png Hinweis:

MAC-Adressen müssen im gesamten Netzwerk eindeutig/einmalig sein. Für jeden Container eine individuelle MAC-Adresse vergeben

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/ stretch main contrib non-free
deb-src http://ftp.de.debian.org/debian/ stretch main contrib non-free

deb http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free

deb http://ftp.de.debian.org/debian/ stretch-updates main contrib non-free
deb-src http://ftp.de.debian.org/debian stretch-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:f

lxc-start -n lxc-container
lxc-stop -n lxc-container


Nun den Container zum ersten mal starten:

lxc-start -n debian

lxc-start versucht den Container standardmäßig im Daemon-Mode zu starten (lxc-start -d in früheren Versionen). Falls Startprobleme auftreten, kan der Container im Vordergrund gestartet werden:

lxc-start -n debian -F


Root Passwort festlegen

beim Anlegen eines Containers wird ein zufälliges Root Passwort vergeben. Dieses kann folgendermaßen vom Host festgelegt werden (auch hilfreich, wenn das Root Passwort eines Containers vergessen wurde):

lxc-attach -n lxc-container passwd

geändert werden.

Bulbgraph.png Hinweis:

Container muss gestartet sein, damit lxc-attach funktioniert.


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
Bulbgraph.png Hinweis:

Manchmal erscheint der Login Prompt nicht sofort. In diesem Fall hilft es, die Return-Taste zu betätigen. Die Gast-Console kann mit <CTRL a + q> verlassen werden. D.h. Tasten <CTRL> und <a> gleichzeitig drücken, dann beide loslassen und anschließend zeitnah betätigen


Autostart

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

vi /var/lib/lxc/debian/config

Folgenden Eintrag anpassen/ergänzen:

lxc.start.auto = 1


LXC-Reboot

Entweder:

lxc-stop -n debian
lxc-start -n debian

oder:

lxc-stop -n debian


Container auflisten

Mittels lxc-ls können sämtliche definierten LXC-Container angezeigt werden:

lxc-ls

anzeige der laufenden Container:

lxc-ls --running

anzeige der gestoppten Container:

lxc-ls --stopped

Eine tabellarische Auflistung incl. State(running/stopped), Autostart, IP-Adresse kann mit folgendem Befehl angezeigt werden:

lxc-ls --fancy


Gastcontainer löschen

Zum löschen eines Containers dient der Befehl

lxc-destroy -n lxc-container
z.B.
lxc-destroy -n debian


Container clonen

Mittels dem "Copy" Befehl kann der Container geklont werden. Dies geht so:

    lxc-copy -n <Containername Original> -N <Containername Kopie>

Z.B.

    lxc-clone - 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: Aktivieren Login mittels Root

Sollte der SSH login für root nicht aktiviert sein, kann dies in der sshd_config aktiviert werden.

nano /var/lib/lxc/<container>/rootfs/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