Debian LXC: Unterschied zwischen den Versionen
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 106: | 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 112: | 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: | 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 | 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: | Vorhandene Einträgen notfalls auskommentieren: | ||
Zeile 177: | Zeile 180: | ||
==Start/Stop des LXC Containers== | ==Start/Stop des LXC Containers== | ||
Der Container kann mit folgenden Befehlen (auf dem Host ausführen!) gestartet bzw. beendet werden: | Der Container kann mit folgenden Befehlen (auf dem Host ausführen!) gestartet bzw. beendet werden:f | ||
lxc-start -n '''''lxc-container''''' | lxc-start -n '''''lxc-container''''' | ||
lxc-stop -n '''''lxc-container''''' | lxc-stop -n '''''lxc-container''''' | ||
Zeile 185: | Zeile 188: | ||
lxc-start -n '''''debian''''' | 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. | |||
{{Hinweis| | {{Hinweis| | ||
Container muss gestartet sein, damit lxc-attach funktioniert.}} | |||
Zeile 370: | Zeile 378: | ||
Login: User=admin / Passwort=admin | Login: User=admin / Passwort=admin | ||
==Optional: Aktivieren Login mittels Root== | ==Optional: Aktivieren Login mittels Root== |
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
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.
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
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