LXC Container mit fremden Distributionen unter Fedora erstellen

Posted on Sun 16 October 2016 in lxc

Prolog

Nach der Einrichtung des ersten LXC Containers und Konfiguration mit IPv6 sollen nun weitere Container her. In meinem Setup setze ich auf Fedora 24 als OS für den LXC Host. Allerdings benötige ich für spezielle Applikationen ein CentOS 7.

Dieser Blogeintrag widmet sich der Erstellen von Containers mit zum Hostsystem abweichenden Distributionen.

Einrichtung eines CentOS Containers

Learning: Wie es nicht funktioniert

Ein Blick in mitgelieferten Dateien des Paketes lxc-templates zeigt uns, dass es ein Template für CentOS gibt:

# rpm -ql lxc-templates | grep centos
/usr/share/lxc/config/centos.common.conf
/usr/share/lxc/config/centos.userns.conf
/usr/share/lxc/templates/lxc-centos

Der direkte Weg zur Erstellung sollte wie folgt aussehen:

lxc-create -n centos-test -t centos -- --release 7
Host CPE ID from /etc/os-release: cpe:/o:fedoraproject:fedora:24
Checking cache download in /var/cache/lxc/centos/x86_64/7/rootfs ...
Downloading centos minimal ...
Redirecting to '/usr/bin/dnf -h' (see 'man yum2dnf')

Redirecting to '/usr/bin/dnf --installroot /var/cache/lxc/centos/x86_64/7/partial -y --nogpgcheck install yum initscripts passwd rsyslog vim-minimal openssh-server openssh-clients dhclient chkconfig rootfiles policycoreutils' (see 'man yum2dnf')

Error: Failed to synchronize cache for repo 'updates'
Failed to download the rootfs, aborting.
Failed to download 'centos base'
failed to install centos
lxc-create: lxccontainer.c: create_run_template: 1290 container creation template for centos-test failed
lxc-create: tools/lxc_create.c: main: 318 Error creating container centos-test

Fehleranalyse

Die Analyse ist leider nicht so einfach möglich. Was auffällt ist die ersten Zeile unserer Ausgabe, diese sollte auf CentOS verweisen, allerdings finden wir hier nur die Angabe Fedora: /etc/os-release: cpe:/o:fedoraproject:fedora:24

Zusätzlich fällt folgende Zeile auf:

Error: Failed to synchronize cache for repo 'updates'

Bezieht sich diese auf die CenttOS Repos, welche nicht geladen werden können? Das Standard DNS Log ist leider wenig hilfereich:

# less /var/log/dnf.log
Oct 16 12:57:18 INFO --- logging initialized ---
Oct 16 12:57:18 DDEBUG timer: config: 5 ms
Oct 16 12:57:18 DEBUG cachedir: /var/cache/dnf
Oct 16 12:57:18 DEBUG Loaded plugins: generate_completion_cache, playground, download, builddep, copr, config-manager, Query, protected_packages, debuginfo-install, reposync, needs-restarting, noroot
Oct 16 12:57:18 DDEBUG Cleaning up.

Das Log unter /var/log/dnf.librepo.log ist zwar deutlich ausführlicher, aber liefert ebenfalls keine sinnvollen Anhaltspunkte. /var/log/dnf.rpm.log loggt nur erfolgreiche Operationen mit, sodass hier ebenfalls keine weiteren Informationen zu finden sind.

Manuelle Erstellung des Containers

Glücklicherweise gibt es mit LinuxContainers ein Projekt, welches fertig gebaute Container zum Download anbietet:

$ curl -s https://uk.images.linuxcontainers.org/images/ | html2text
****** Index of /images ******
[[ICO]]       Name             Last modified    Size Description
===========================================================================
[[PARENTDIR]] Parent Directory                     -
[[DIR]]       alpine/          2016-09-02 16:50    -
[[DIR]]       archlinux/       2016-10-13 21:01    -
[[DIR]]       centos/          2014-07-09 03:27    -
[[DIR]]       debian/          2016-03-15 05:20    -
[[DIR]]       fedora/          2016-06-30 16:42    -
[[DIR]]       gentoo/          2014-01-28 11:15    -
[[DIR]]       opensuse/        2016-03-19 01:07    -
[[DIR]]       oracle/          2016-03-18 00:20    -
[[DIR]]       plamo/           2016-03-18 02:15    -
[[DIR]]       ubuntu/          2016-04-25 14:28    -
===========================================================================

Die Images werden jede Nacht neu erstellt, ein Blick in den Ordner für CentOS 7 zeigt die aktuellen Images.

Nachfolgend laden wir die benötigten Dateien herunter, erstellen manuell den Pfad für den neuen LXC Container centos-test und entpacken unser rootfs sowie die Beispielkonfiguration (meta.tar.xz):

# mkdir ~/centos-image
# cd ~/centos-image/
# wget https://uk.images.linuxcontainers.org/images/centos/7/amd64/default/20161016_02:16/rootfs.tar.xz
# wget https://uk.images.linuxcontainers.org/images/centos/7/amd64/default/20161016_02:16/meta.tar.xz
# mkdir -p /var/lib/lxc/centos-test/rootfs
# tar xvf meta.tar.xz  -C /var/lib/lxc/centos-test/
# tar xvf rootfs.tar.xz -C /var/lib/lxc/centos-test/rootfs/

Im Anschluss kann die Konfiguration unter /var/lib/lxc/centos-test/config angepasst werden. Ein Beispiel für eine lauffähige Konfiguration ohne Netzwerk:

# cat /var/lib/lxc/centos-test/config
    lxc.rootfs = /var/lib/lxc/centos-test/rootfs
    lxc.rootfs.backend = dir

    # Include common configuration
    lxc.include = /usr/share/lxc/config/centos.common.conf

    lxc.arch = x86_64
    lxc.utsname = centos-test

Der Container kann im Anschluss mit lxc-start --name=centos-test gestartet werden.