Was ist LXC und warum machen wir damit VServer

LXC steht für Linux-Containers und ist eine Art virtueller Server für Linux. Dabei nutzen alle virtuellen Server-Instanzen den Kernel der Wirtsystems mit. Implementiert werden die Container in Linux über die Namespace Erweiterungen, die dafür sorgen, dass Prozesse in eigene Adressräume isoliert werden können. Da dies nicht nur Prozesse und Speicher, sondern auch Netzwerke umfasst, können hiermit vollständige virtuelle Server implementiert werde.

Bislang wurde bei PING die ältere Linux-VServer-Implentierung eingesetzt, die einen eigenen Kernel-Patch und Userspace-Tools implementiert. Bis zur Version Squeeze von Debian wurde dabei vom Debian-Kernel-Team ein entsprechend gepatchter Kernel zur Verfügung gestellt. Mit Release von Wheezy wurde dies allerdings zu Gunsten der weiter fortgeschrittenen Entwicklung der Linux-Containers entfernt.

Für Linux-Containers sind einige Optionen zu Namespaces zu aktivieren, was aber bei den Kernel-Images von Debian bereits der Fall ist. Es ist somit nur noch das Paket lxc zu installieren, welches die Userspace-Tools zu Erzeugung und Verwaltung der Container enthält.

Probleme

LXC ist noch in der Entwicklung, früher waren LXC-Container nicht ausbruchsicher, dies ist aber seit Debian Jessie nicht mehr der Fall siehe https://wiki.debian.org/LXC

Konvertierung eines Linux-VServer Gastes in einen LXC Container

http://schmidi2.blog.com/2010/10/25/migrating-from-vserver-to-lxc/

Installation des Hosts

Der Anleitung im Debian Wiki folgend, muss zunächst das LXC-Paket installiert werden:

root@containers:~# apt-get install lxc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  arch-test bridge-utils busybox-static cloud-image-utils debootstrap distro-info dns-root-data dnsmasq-base genisoimage libaio1 libglib2.0-0 libglib2.0-data liblxc1 libpam-cgfs lxc-templates lxcfs qemu-utils rsync shared-mime-info uidmap uuid-runtime xdg-user-dirs
Suggested packages:
  cloud-utils-euca ubuntu-archive-keyring squid-deb-proxy-client shunit2 wodim cdrkit-doc btrfs-progs lvm2 python3-lxc qemu-block-extra
The following NEW packages will be installed:
  arch-test bridge-utils busybox-static cloud-image-utils debootstrap distro-info dns-root-data dnsmasq-base genisoimage libaio1 libglib2.0-0 libglib2.0-data liblxc1 libpam-cgfs lxc lxc-templates lxcfs qemu-utils rsync shared-mime-info uidmap uuid-runtime xdg-user-dirs
0 upgraded, 23 newly installed, 0 to remove and 0 not upgraded.
Need to get 8030 kB of archives.
After this operation, 34.4 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Vorbereitung der unprivilegierten Root-Container

Da die als VServer gedachten Container von Root während des Startes des Systems erzeugt werden, diese aber unprivilegiert sein sollen, muss ein uid- und gid-Bereich dem Nutzer Root zugewiesen werden (vergl. https://linuxcontainers.org/lxc/getting-started/#creating-unprivileged-containers-as-root):

root@containers:/etc# git diff
diff --git a/lxc/default.conf b/lxc/default.conf
index d2d1d51..30231e3 100644
--- a/lxc/default.conf
+++ b/lxc/default.conf
@@ -1,3 +1,5 @@
 lxc.net.0.type = empty
 lxc.apparmor.profile = generated
 lxc.apparmor.allow_nesting = 1
+lxc.idmap = u 0 100000 65536
+lxc.idmap = g 0 100000 65536
diff --git a/subgid b/subgid
index dc7d014..44be50f 100644
--- a/subgid
+++ b/subgid
@@ -1,2 +1 @@
-dh:100000:65536
-bodo:165536:65536
+root:100000:65536
diff --git a/subuid b/subuid
index dc7d014..44be50f 100644
--- a/subuid
+++ b/subuid
@@ -1,2 +1 @@
-dh:100000:65536
-bodo:165536:65536
+root:100000:65536

Netzwerk

Damit die LXC-Container auf das Netwerk zugreifen können, müssen derren virtuellen Netzwerkkarten an das membersnetz1 angebunden werden. Da containers.ping.de selbst schon in diesem Netz ist und sommit eth0 von containers.ping.de als Interface in einer Bridge genutzt werden kann, muss aus dem eth0-Interface einfach eine Bridge werden. Hierfür wird /etc/network/interfaces wie folgt angepasst:

auto membersnetz1
iface membersnetz1 inet static
 bridge_ports eth0
 bridge_stp off
 bridge_fd 0
 address 83.97.41.30
 gateway 83.97.41.1
 netmask 255.255.255.192

Damit LXC für die erzäugten Container auch ein Interface im Host erzäugt und dies der Bridge hinzufügt, muss /etc/lxc/default.conf angepasst werden:

diff --git a/lxc/default.conf b/lxc/default.conf
index 30231e3..c6bd25e 100644
--- a/lxc/default.conf
+++ b/lxc/default.conf
@@ -1,4 +1,6 @@
-lxc.net.0.type = empty
+lxc.net.0.type = veth
+lxc.net.0.link = membersnetz1
+lxc.net.0.flags = up
 lxc.apparmor.profile = generated
 lxc.apparmor.allow_nesting = 1
 lxc.idmap = u 0 100000 65536

Container erstellen

Container speichern ihr Dateisystem unter /var/lib/lxc/<name>/rootfs. Aus diesem Grund sollte hier ein Dateisystem für den Container eingehängt werden (z.B. ein LV aus dem Dom0 durchgereicht).

Da die genutzten Container unprivilegiert sind, muss das download-Template genutzt werden. Hier ist dann die Distribution (z.B.: debian), das Release (z.B.: buster) und die Architecture (z.B.: amd64) angegeben werden.

root@containers:~# lxc-create -n name.ping.de -t download
Setting up the GPG keyring
Downloading the image index

---
DIST    RELEASE ARCH    VARIANT BUILD
---
alpine  3.10    amd64   default 20191221_13:00
alpine  3.10    arm64   default 20191221_13:00
alpine  3.10    armhf   default 20191221_13:00
alpine  3.10    i386    default 20191221_13:01
alpine  3.10    ppc64el default 20191221_13:00
alpine  3.10    s390x   default 20191221_13:00
alpine  3.11    amd64   default 20191221_13:00
alpine  3.11    arm64   default 20191221_13:00
alpine  3.11    armhf   default 20191221_13:00
alpine  3.11    i386    default 20191221_13:00
alpine  3.11    ppc64el default 20191221_13:00
alpine  3.11    s390x   default 20191221_13:00
alpine  3.7     amd64   default 20191220_13:00
alpine  3.7     arm64   default 20191220_13:00
alpine  3.7     armhf   default 20191220_13:00
alpine  3.7     i386    default 20191220_13:00
alpine  3.8     amd64   default 20191221_13:00
alpine  3.8     arm64   default 20191221_13:00
alpine  3.8     armhf   default 20191221_13:00
alpine  3.8     i386    default 20191221_13:01
alpine  3.8     ppc64el default 20191221_13:00
alpine  3.8     s390x   default 20191221_13:00
alpine  3.9     amd64   default 20191221_13:00
alpine  3.9     arm64   default 20191221_13:00
alpine  3.9     armhf   default 20191221_13:00
alpine  3.9     i386    default 20191221_13:01
alpine  3.9     ppc64el default 20191221_13:00
alpine  3.9     s390x   default 20191221_13:00
alpine  edge    amd64   default 20191221_13:00
alpine  edge    arm64   default 20191221_13:00
alpine  edge    armhf   default 20191221_13:00
alpine  edge    i386    default 20191221_13:00
alpine  edge    ppc64el default 20191221_13:00
alpine  edge    s390x   default 20191221_13:00
alt     Sisyphus        amd64   default 20191221_01:17
alt     Sisyphus        arm64   default 20191221_01:17
alt     Sisyphus        i386    default 20191221_01:17
alt     Sisyphus        ppc64el default 20191221_01:17
alt     p8      amd64   default 20191221_01:17
alt     p8      i386    default 20191221_01:17
alt     p9      amd64   default 20191221_01:17
alt     p9      arm64   default 20191221_01:17
alt     p9      i386    default 20191221_01:18
alt     p9      ppc64el default 20191119_01:17
apertis 17.12   amd64   default 20191117_10:53
apertis 17.12   arm64   default 20191117_10:53
apertis 17.12   armhf   default 20191117_10:53
apertis 18.03   amd64   default 20191117_10:53
apertis 18.03   arm64   default 20191117_10:53
apertis 18.03   armhf   default 20191117_10:53
apertis 18.06   amd64   default 20191117_10:53
apertis 18.06   arm64   default 20191117_10:53
apertis 18.06   armhf   default 20191117_10:53
apertis 18.09   amd64   default 20191117_10:53
apertis 18.09   arm64   default 20191117_10:53
apertis 18.09   armhf   default 20191119_11:19
apertis 18.12   amd64   default 20191221_10:53
apertis 18.12   arm64   default 20191221_10:53
apertis 18.12   armhf   default 20191221_10:53
archlinux       current amd64   default 20191221_04:18
archlinux       current arm64   default 20191221_05:17
archlinux       current armhf   default 20191221_05:17
centos  6       amd64   default 20191221_07:08
centos  6       i386    default 20191221_07:08
centos  7       amd64   default 20191221_07:08
centos  7       arm64   default 20191221_07:08
centos  7       armhf   default 20191221_07:08
centos  7       i386    default 20191221_07:08
centos  7       ppc64el default 20191221_07:08
centos  8       amd64   default 20191221_07:08
centos  8       arm64   default 20191221_07:08
centos  8       ppc64el default 20191221_07:08
debian  bullseye        amd64   default 20191221_05:24
debian  bullseye        arm64   default 20191221_05:31
debian  bullseye        armel   default 20191221_05:52
debian  bullseye        armhf   default 20191221_05:24
debian  bullseye        i386    default 20191221_05:24
debian  bullseye        ppc64el default 20191221_05:24
debian  bullseye        s390x   default 20191221_05:24
debian  buster  amd64   default 20191221_05:24
debian  buster  arm64   default 20191221_05:31
debian  buster  armel   default 20191221_05:41
debian  buster  armhf   default 20191221_05:38
debian  buster  i386    default 20191221_05:24
debian  buster  ppc64el default 20191221_05:24
debian  buster  s390x   default 20191221_05:24
debian  jessie  amd64   default 20191221_05:24
debian  jessie  armel   default 20191221_05:53
debian  jessie  armhf   default 20191221_05:37
debian  jessie  i386    default 20191221_05:24
debian  sid     amd64   default 20191221_05:24
debian  sid     arm64   default 20191221_05:31
debian  sid     armel   default 20191221_05:37
debian  sid     armhf   default 20191221_05:24
debian  sid     i386    default 20191221_05:24
debian  sid     ppc64el default 20191221_05:24
debian  sid     s390x   default 20191221_05:24
debian  stretch amd64   default 20191221_05:24
debian  stretch arm64   default 20191221_05:24
debian  stretch armel   default 20191221_05:53
debian  stretch armhf   default 20191221_05:42
debian  stretch i386    default 20191221_05:24
debian  stretch ppc64el default 20191221_05:24
debian  stretch s390x   default 20191221_05:24
devuan  ascii   amd64   default 20191221_11:50
devuan  ascii   arm64   default 20191221_11:50
devuan  ascii   armel   default 20191221_11:50
devuan  ascii   armhf   default 20191221_11:50
devuan  ascii   i386    default 20191221_11:50
fedora  29      amd64   default 20191220_20:33
fedora  29      arm64   default 20191220_20:33
fedora  29      armhf   default 20191220_20:33
fedora  29      ppc64el default 20191220_20:33
fedora  29      s390x   default 20191220_20:33
fedora  30      amd64   default 20191220_20:33
fedora  30      arm64   default 20191220_20:33
fedora  30      ppc64el default 20191220_20:33
fedora  30      s390x   default 20191220_20:33
fedora  31      amd64   default 20191220_20:33
fedora  31      arm64   default 20191220_20:33
fedora  31      ppc64el default 20191220_20:33
fedora  31      s390x   default 20191220_20:33
funtoo  1.3     amd64   default 20191220_16:57
funtoo  1.3     arm64   default 20191220_16:45
funtoo  1.3     armhf   default 20191220_16:45
funtoo  1.3     i386    default 20191220_16:45
gentoo  current amd64   default 20191221_16:07
gentoo  current armhf   default 20191220_16:07
gentoo  current i386    default 20191221_16:07
gentoo  current ppc64el default 20191221_16:07
gentoo  current s390x   default 20191221_16:07
kali    current amd64   default 20191220_17:24
kali    current arm64   default 20191220_17:14
kali    current armel   default 20191220_17:14
kali    current armhf   default 20191220_17:14
kali    current i386    default 20191220_17:14
mint    sarah   amd64   default 20191221_08:51
mint    sarah   i386    default 20191221_08:51
mint    serena  amd64   default 20191221_08:51
mint    serena  i386    default 20191221_08:51
mint    sonya   amd64   default 20191221_08:51
mint    sonya   i386    default 20191221_08:51
mint    sylvia  amd64   default 20191221_08:51
mint    sylvia  i386    default 20191221_08:51
mint    tara    amd64   default 20191221_08:51
mint    tara    i386    default 20191221_08:51
mint    tessa   amd64   default 20191221_08:51
mint    tessa   i386    default 20191221_08:51
mint    tina    amd64   default 20191221_08:51
mint    tina    i386    default 20191221_08:51
mint    tricia  amd64   default 20191221_08:51
mint    tricia  i386    default 20191221_08:51
opensuse        15.0    amd64   default 20191205_04:20
opensuse        15.0    arm64   default 20191205_04:20
opensuse        15.1    amd64   default 20191221_04:20
opensuse        15.1    arm64   default 20191221_04:20
opensuse        15.1    ppc64el default 20191221_04:20
opensuse        tumbleweed      amd64   default 20191221_04:20
opensuse        tumbleweed      arm64   default 20191221_04:20
opensuse        tumbleweed      i386    default 20191221_04:20
opensuse        tumbleweed      ppc64el default 20191221_04:20
openwrt 18.06   amd64   default 20191221_11:57
openwrt current amd64   default 20190903_11:57
openwrt snapshot        amd64   default 20191221_11:57
oracle  6       amd64   default 20191221_07:46
oracle  6       i386    default 20191221_07:46
oracle  7       amd64   default 20191221_07:46
oracle  8       amd64   default 20191221_07:46
plamo   6.x     amd64   default 20191221_01:33
plamo   6.x     i386    default 20191221_01:33
plamo   7.x     amd64   default 20191221_01:33
sabayon current amd64   default 20191221_01:52
ubuntu  bionic  amd64   default 20191221_07:42
ubuntu  bionic  arm64   default 20191221_07:42
ubuntu  bionic  armhf   default 20191221_08:03
ubuntu  bionic  i386    default 20191221_07:42
ubuntu  bionic  ppc64el default 20191221_07:42
ubuntu  bionic  s390x   default 20191221_07:42
ubuntu  cosmic  amd64   default 20191029_07:42
ubuntu  cosmic  arm64   default 20191029_07:42
ubuntu  cosmic  armhf   default 20191029_08:15
ubuntu  cosmic  i386    default 20191029_07:43
ubuntu  cosmic  ppc64el default 20191029_07:42
ubuntu  cosmic  s390x   default 20191029_07:42
ubuntu  disco   amd64   default 20191221_07:42
ubuntu  disco   arm64   default 20191221_07:42
ubuntu  disco   armhf   default 20191221_07:42
ubuntu  disco   i386    default 20191221_07:42
ubuntu  disco   ppc64el default 20191221_07:42
ubuntu  disco   s390x   default 20191221_07:42
ubuntu  eoan    amd64   default 20191221_07:42
ubuntu  eoan    arm64   default 20191221_07:51
ubuntu  eoan    armhf   default 20191221_07:42
ubuntu  eoan    i386    default 20191221_07:42
ubuntu  eoan    ppc64el default 20191221_07:42
ubuntu  eoan    s390x   default 20191221_07:49
ubuntu  focal   amd64   default 20191221_07:42
ubuntu  focal   arm64   default 20191221_07:42
ubuntu  focal   armhf   default 20191221_07:42
ubuntu  focal   i386    default 20191206_07:44
ubuntu  focal   ppc64el default 20191221_07:53
ubuntu  focal   s390x   default 20191221_07:42
ubuntu  trusty  amd64   default 20191221_07:42
ubuntu  trusty  arm64   default 20191221_07:42
ubuntu  trusty  armhf   default 20191221_08:03
ubuntu  trusty  i386    default 20191221_07:42
ubuntu  trusty  ppc64el default 20191221_07:55
ubuntu  xenial  amd64   default 20191221_07:42
ubuntu  xenial  arm64   default 20191221_07:42
ubuntu  xenial  armhf   default 20191221_08:01
ubuntu  xenial  i386    default 20191221_07:42
ubuntu  xenial  ppc64el default 20191221_07:42
ubuntu  xenial  s390x   default 20191221_07:42
voidlinux       current amd64   default 20191220_17:16
voidlinux       current arm64   default 20191220_17:10
voidlinux       current armhf   default 20191220_17:10
voidlinux       current i386    default 20191220_17:10
---

Distribution:
debian
Release: 
buster
Architecture: 
amd64

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a Debian buster amd64 (20191221_05:24) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.

Um den Container beim Booten automaitsch starten zu lassen, muss eine Zeile zu seiner Config hinzugefügt werden:

echo "lxc.start.auto = 1" >> /var/lib/lxc/<name>/config

Damit der Container auch Netzwerk hat, wird ganz normal seine /etc/network/interfaces angepasst. Z.B:

cat >>/var/lib/lxc/<name>/rootfs/etc/network/interfaces <<EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 83.97.41.<IP-Ende>
        netmask 255.255.255.192
        gateway 83.97.41.1

iface eth0 inet6 static
        address 2A00:8647:4200:4100::<IP-Ende>
        netmask 64
        gateway 2A00:8647:4200:4100::1

source /etc/network/interfaces.d/*.cfg
EOF

cat >>/var/lib/lxc/<name>/rootfs/etc/resolv.conf <<EOF
nameserver 83.97.42.196
nameserver 83.97.42.197
domain ping.de
search ping.de
EOF

Mit lxc-autostart kann der Container gestartet werden. Mit lxc-attach -n peace.ping.de betritt man den Container und installiert alles wichtige, wie einen SSH-Server.

Software/LXCVServer (zuletzt geändert am 2019-12-21 20:25:38 durch DanielHess)