Inhaltsverzeichnis

Installation von LXC auf Ubuntu 14.04

Dokumentation+Beispiele:

Installation von LXC

> aptitude install lxc debootstrap bridge-utils

allgemeine Infos zu LXC

Der Parameter "-n lxctest" beschreibt den Namen des Containers und der Parameter "-t sshd" wählt die Vorlage (/usr/share/lxc/templates/lxc-sshd) aus.

Alle Vorlagen liegen hier: /usr/share/lxc/templates/

/usr/share/lxc/templates/lxc-alpine
/usr/share/lxc/templates/lxc-altlinux
/usr/share/lxc/templates/lxc-archlinux
/usr/share/lxc/templates/lxc-busybox
/usr/share/lxc/templates/lxc-centos
/usr/share/lxc/templates/lxc-cirros
/usr/share/lxc/templates/lxc-debian
/usr/share/lxc/templates/lxc-download
/usr/share/lxc/templates/lxc-fedora
/usr/share/lxc/templates/lxc-gentoo
/usr/share/lxc/templates/lxc-openmandriva
/usr/share/lxc/templates/lxc-opensuse
/usr/share/lxc/templates/lxc-oracle
/usr/share/lxc/templates/lxc-plamo
/usr/share/lxc/templates/lxc-sshd
/usr/share/lxc/templates/lxc-ubuntu
/usr/share/lxc/templates/lxc-ubuntu-cloud
/usr/share/lxc/lxc.functions
#
# lxc: linux Container library
 
# Authors:
# Serge Hallyn <serge.hallyn@ubuntu.com>
 
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
# This file contains helpers for the various lxc shell scripts
 
globalconf=/etc/lxc/lxc.conf
bindir=/usr/bin
templatedir=/usr/share/lxc/templates
lxcinitdir=/usr/lib/x86_64-linux-gnu
 
lxc_path=`lxc-config lxc.lxcpath`
lxc_vg=`lxc-config lxc.bdev.lvm.vg`
lxc_zfsroot=`lxc-config lxc.bdev.zfs.root`

dem Standard nach liegen die "Root-Dateisystembäume" der Container hier:

> ls -lha /var/lib/lxc/

Test-Container erstellen

> lxc-create -n lxctest -t sshd

> lxc-ls
lxctest

> lxc-info -n lxctest
Name:           lxctest
State:          STOPPED

> lxc-start -dn lxctest

> lxc-info -n lxctest
Name:           lxctest
State:          RUNNING
PID:            26638
IP:             10.0.3.45
CPU use:        0.07 seconds
BlkIO use:      0 bytes
Memory use:     4.15 MiB
KMem use:       0 bytes
Link:           vethP8GV61
 TX bytes:      1.16 KiB
 RX bytes:      873 bytes
 Total bytes:   2.02 KiB

Dieser Container hat die IP 10.0.3.45 bekommen.

eine eigene Vorlage für einen individuellen Container erstellen

In diesem Beispiel ist es unser Anliegen, dass wir eine Container-Vorlage erstellen, die praktisch eine bessere ChRoot-Umgebung darstellt. Also in dem alle Programme aus dem Host-System vorhanden sind und nicht extra installiert werden müssen. Das macht auch die Wartung einfacher.

Der Vorteil einer solchen Konstruktion ist, dass man ein Programm mehrfach starten kann. Wenn man zu dem Programm noch unterschiedliche Konfigurationsdateien an Orten ablegt, auf die der entsprechende Container Zugriff hat, dann man auf einem Host das gleiche Programm mit unterchiedlichen Einstellungen fahren.

Leider gibt es soeine Vorlage nicht. Die Vorlage "sshd" kommt dem schon am nächsten, die werden wir erweitern.

/usr/share/lxc/templates/lxc-chroot
#!/bin/bash
 
#
# lxc: linux Container library
 
VERSION="v2017092100"
 
#==============================================================================#
### hiermit wird bereits ein funktionstüchtiger Container angelegt,
### allerdings kann der noch nicht genug
. /usr/share/lxc/templates/lxc-sshd $@
 
#==============================================================================#
### hier kommen die individuellen Änderungen am bestehenden
### sshd-Container, der für unsere Zwecke zu minimalistisch ist
#------------------------------------------------------------------------------#
### in das "/" des Containers wechseln
 
date > /tmp/lxc.log
 
if [ -z "$rootfs" ] ; then
        echo "Es ist die Variable '$rootfs' nicht gesetzt." | tee -a /tmp/lxc.log
        echo 'Es kann nicht in das RootFS gewechselt werden!' | tee -a /tmp/lxc.log
        echo 'ABBRUCH!' | tee -a /tmp/lxc.log
else
        if [ -d "$rootfs" ] ; then
                cd $rootfs/
                rm -f /tmp/lxc.log
        else
                echo "Die Variable '$rootfs' enthält kein Verzeichnis." | tee -a /tmp/lxc.log
                echo 'Es kann nicht in das RootFS gewechselt werden!' | tee -a /tmp/lxc.log
                echo 'ABBRUCH!' | tee -a /tmp/lxc.log
        fi
fi
 
#------------------------------------------------------------------------------#
###
### fehlendes an der Basis
###
chmod 1777 tmp
 
### /etc
mv ../config ../config_sshd
cat ../config_sshd | grep -Fv 'etc/' > ../config
echo "lxc.mount.entry = /etc etc none ro,bind 0 0" >> ../config
rm -f ../config_sshd
 
### mknod: '/dev/xconsole': Read-only file system
cp ../config ../config_SiK
cat ../config_SiK | sed -e 's|dev dev none ro,bind|dev dev none rw,bind|' > ../config
rm -f ../config_SiK
 
### Sep 21 15:15:07 lxctest rsyslogd-2181: $WorkDirectory: /var/spool/rsyslog can not be accessed, probably does not exist - directive ignored [try http://www.rsyslog.com/e/2181 ]
### Sep 21 15:15:07 lxctest rsyslogd-2182: $WorkDirectory: trailing slashes removed, new value is '/var/spool/rsyslog' [try http://www.rsyslog.com/e/2182 ]
mkdir -p var/spool/rsyslog
 
# rsyslogd: run failed with error -2103 (see rsyslog.h or try http://www.rsyslog.com/e/2103 to learn what that number means)
mkdir -p var/log
chown root:adm var/log
chmod 0775 var/log
 
#------------------------------------------------------------------------------#
### SSH-Schlüssel für root hinterlegen
#
# dann sollte, nach dem Start des Containers,
# ein solcher Login beispielsweise funktionieren:
# ssh -i /etc/ssh/ssh_host_ed25519_key 10.0.3.174
#
cp -ar /root/.ssh root/
mkdir -p root/.ssh
chmod 0755 root/.ssh
touch root/.ssh/authorized_keys
chmod 0644 root/.ssh/authorized_keys
cat /etc/ssh/ssh_host_ed25519_key.pub >> root/.ssh/authorized_keys
cat /etc/ssh/ssh_host_rsa_key.pub >> root/.ssh/authorized_keys
 
#------------------------------------------------------------------------------#
### /root/bin - Skripte übernehmen
cp -ar /root/bin root/
 
#------------------------------------------------------------------------------#
### DB-Verzeichnisse
cp -a /root/.my.cnf root/
mkdir -p var/lib/mysql
mkdir -p var/log/mysql
chown -R mysql:mysql var/lib/mysql
chown -R mysql:mysql var/log/mysql
echo "lxc.mount.entry = /var/log/mysql var/log/mysql none rw,bind 0 0" >> ../config
 
#------------------------------------------------------------------------------#
### Test-DB-Verzeichnis (nur ein Beispiel, z.Z. deaktiviert)
mkdir -p var/lib/mysql/${name}
echo "#lxc.mount.entry = /var/lib/mysql/${name} var/lib/mysql none rw,bind 0 0" >> ../config
> lxc-create -n lxctest -t chroot ; lxc-start -dn lxctest ; sleep 5 ; lxc-info -n lxctest ; cd /var/lib/lxc/lxctest/rootfs/
Generating public/private rsa key pair.
Your identification has been saved in /var/lib/lxc/lxctest/rootfs/etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /var/lib/lxc/lxctest/rootfs/etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
52:d1:57:30:96:9f:5e:1d:b5:21:1d:2e:d5:f0:56:b3 root@tcdb07
The key's randomart image is:
+--[ RSA 2048]----+
|        ..  +=+**|
|         ...o.++B|
|        .  . o E=|
|       .      +.o|
|      . S    . . |
|       .      .  |
|                 |
|                 |
|                 |
+-----------------+
Generating public/private dsa key pair.
Your identification has been saved in /var/lib/lxc/lxctest/rootfs/etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /var/lib/lxc/lxctest/rootfs/etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
e4:21:e4:ee:05:65:70:c1:12:26:fe:58:c2:14:c2:54 root@tcdb07
The key's randomart image is:
+--[ DSA 1024]----+
| oo.E.=+=.       |
|  .= =.+.        |
|    + =.o        |
|     * = .       |
|    . o S        |
|     . .         |
|      .          |
|                 |
|                 |
+-----------------+
Name:           lxctest
State:          RUNNING
PID:            10762
IP:             10.0.3.168
CPU use:        0.07 seconds
BlkIO use:      0 bytes
Memory use:     4.39 MiB
KMem use:       0 bytes
Link:           vethTGN7YW
 TX bytes:      1.16 KiB
 RX bytes:      914 bytes
 Total bytes:   2.06 KiB

den öffentlichen Schlüssel hinterlegen:

> mkdir -p /var/lib/lxc/lxctest/rootfs/root/.ssh
> cat /etc/ssh/ssh_host_ed25519_key.pub >> /var/lib/lxc/lxctest/rootfs/root/.ssh/authorized_keys

Jetzt können wir uns so passwortlos vom Host-System aus einloggen:

> ssh -i /etc/ssh/ssh_host_ed25519_key 10.0.3.168

erweiterte Einstellungen

soll ein Container beim booten automatisch gestartet werden, dann muss man in dieser Datei folgende Einstellung vornehmen:

> vi /etc/default/lxc
...
LXC_AUTO="true"
...

…ist das erledigt, kann man in diesem Verzeichnis ein SymLink zum container ablegen und dann wird er bei booten automatisch gestartet:

/etc/lxc/auto

Netzwerkkonfiguration

Standard: lxc-net

Die Voreinstellungen für das Netzwerk sind hier zu finden:

> vi /etc/default/lxc-net
...
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
...

nach dem dort Änderungen vorgenommen wurden, muss der Dienst neu gestartet werden:

> service lxc-net restart

lxc-net deaktivieren

Unter anderem arbeitet LXC-Net auch mit IP-Forwarding, was bei uns unerwünscht ist.

die Bridge für den LXC-DHCP-Server runter fahren:

> service lxc-net stop

den DHCP-Server von LXC beenden (manchmal wird er nicht sauber gestoppt, wenn lxc-net runter fährt):

> killall dnsmasq

die Bridge für den LXC-DHCP-Server deaktivieren:

> echo 'USE_LXC_BRIDGE="false"' >> /etc/default/lxc-net

Zu beachten ist, dass im LXC-Container nach der Umstellung des Netzwerkes, der SSH-Dienst nicht mehr automatisch startet! Dafür sind weitere Maßnahmen erforderlich."

eine eigene Bridge für die LXC-Container anlegen

LXC sagen, dass er in Zukunft unsere Bridge verwenden soll:

> sed -ie 's/lxc.network.link/#&/' /etc/lxc/default.conf && rm -f /etc/lxc/default.confe
> echo 'lxc.network.link = br0' >> /etc/lxc/default.conf

eth0 steht hier für das NIC im Host-System und die IP-Adresse 192.168.2.1/16 war bisher auf dem Host-NIC:

> brctl addbr br0
> ifconfig eth0 0.0.0.0 promisc
> brctl addif br0 eth0
> ip a add 192.168.2.1/16 dev br0
> ifconfig br0 up

einen LXC-Container im Vordergrund starten

das wird meistens nur für Testzwecke so gemacht:

> lxc-execute -n lxctest -- /bin/bash

LXC-Container beim booten automatisch starten

> mkdir -p /etc/lxc/auto/lxctest/
> ln -s /var/lib/lxc/lxctest/config /etc/lxc/auto/lxctest/

Dienste im LXC-Container starten

LXC-Container (mit dem Namen lxctest) starten:

> lxc-start -dn lxctest

die drei Dienste starten, die uns am Herzen liegen:

> lxc-attach -n lxctest -- /etc/init.d/rsyslog start &
> lxc-attach -n lxctest -- /etc/init.d/ssh start &
> lxc-attach -n lxctest -- /etc/init.d/mysql start &