CentOS 7 – libvirt – CentOS 7 im LXC Container

Für den Fall, dass man mal schnell eine Test-Umgebung benötigt oder Dienste komplett in eine VM auslagern möchte, bietet sich die leichtgewichtige Container Virtualisierung LXC an.

Vorraussetzung für LXC-Betrieb

LXC setzt ein aktiviertes SE-Linux vorraus. Wir können dies aber etwas vereinfachen indem wir SE-Linux in dem permissive Modus versetzten. Dazu die Datei /etc/selinux/config wie folgt abändern.

SELINUX=permissive

Anschliessen muss das System einmal neu gestartet werden!

Weiterhin installieren wir die benötigten Paket libvird und libvirt-client.

yum install libvirt libvirt-client

Wir aktivieren die installierten Dienste für den automatischen Start bei System-Start und starten die Dienste.

systemctl enable libvirt-guests
systemctl enable libvirtd

systemctl start libvirt-guests
systemctl start libvirtd

Installation des LXC Filesystems

Zuerst erstellen wir uns einen Ordner indem wir das Filesystem des LXC Containers ablegen. Anschliessend hinterlegen wir ein Repo für Yum um CentOS 7 in diesen Ordner zu installieren.

mkdir /var/lib/libvirt/lxc/centos-7-x86_64/etc/yum.repos.d/ -p
cat /etc/yum.repos.d/CentOS-Base.repo |sed s/'$releasever'/7/g > /var/lib/libvirt/lxc/centos-7-x86_64/etc/yum.repos.d/CentOS-Base.repo

Im Anschluss installieren wir die Kern-Komponenten von CentOS 7 in den erstellen Ordner.

yum groupinstall core --installroot=/var/lib/libvirt/lxc/centos-7-x86_64/ --nogpgcheck -y
yum install plymouth libselinux-python --installroot=/var/lib/libvirt/lxc/centos-7-x86_64/ --nogpgcheck -y

Das dauert ein paar Minuten. Im Anschluss sind die benötigenden Dateien installiert.

Konfiguration im LXC Filsystem

Bevor wir das CentOS 7 Filesystem mit LXC nutzen können sind noch ein paar Anpassungen nötig. Dazu wechseln wir per chroot in die neue Umgebung und nehmen diese Änderungen vor.

chroot /var/lib/libvirt/lxc/centos-7-x86_64/

Nun befinden wir uns im chroot. Alle nachfolgenden Anweisungen müssen im chroot des neuen CentOS 7 Filesystems ausgeführt werden.

Setzen des neuen Passworts für den User root.

echo NEWROOTPW |passwd root --stdin

Anpassungen für den Login per Konsole und per SSH sind ebenfalls nötig.

# login console
echo "pts/0" >>/etc/securetty
sed -i s/"session    required     pam_selinux.so close"/"#session    required     pam_selinux.so close"/g /etc/pam.d/login
sed -i s/"session    required     pam_selinux.so open"/"#session    required     pam_selinux.so open"/g /etc/pam.d/login
sed -i s/"session    required     pam_loginuid.so"/"#session    required     pam_loginuid.so"/g /etc/pam.d/login

# login ssh
sed -i s/"session    required     pam_selinux.so close"/"#session    required     pam_selinux.so close"/g /etc/pam.d/sshd
sed -i s/"session    required     pam_loginuid.so"/"#session    required     pam_loginuid.so"/g /etc/pam.d/sshd
sed -i s/"session    required     pam_selinux.so open env_params"/"#session    required     pam_selinux.so open env_params"/g /etc/pam.d/sshd

Es folgt die Netzwerkkonfiguration. Wir werden den LXC Container für DHCP vorbereiten. Eine angepasste Netzwerkkonfiguration mit externer IP folgt in einen anderem Artikel.

cat > /etc/sysconfig/network << EOF
NETWORKING=yes
HOSTNAME=lxc.der-linux-admin.de
EOF
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
EOF

Der sshd Dienst wird automatisch gestartet, sodass ein Login auch per ssh möglich ist. Die beiden Dienste avahi-daemon und auditd werden nicht benötigt und daher für den  System-Start deaktiviert.

systemctl enable sshd

systemctl disable avahi-daemon
systemctl disable auditd

Anschliessend verlassen wir die chroot Umgebung.

exit

Erstellen einen LXC Containers mit Centos 7

Nachdem wir unsere chroot Umgebung wieder verlassen haben, können wir auf Grundlage unseres bereitgestellten Filesystem ein CentOS 7 innerhalb eines LXC Containers installieren.

virt-install --connect lxc:/// --name centos-7-x86_64 --ram 512 --vcpu 1 --filesystem /var/lib/libvirt/lxc/centos-7-x86_64/,/ --noautoconsole

Den nun erstellen LXC Container können wir auch gleich betreten.

virsh --connect lxc:/// console centos-7-x86_64

Centos 7 sollte nun ohne Probleme booten und uns einen Login präsentieren.

Detected virtualization 'lxc-libvirt'.

Welcome to CentOS Linux 7 (Core)!

Initializing machine ID from container UUID.
Failed to install release agent, ignoring: No such file or directory
Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
[  OK  ] Reached target Remote File Systems.
[  OK  ] Created slice Root Slice.
[  OK  ] Created slice User and Session Slice.
[  OK  ] Created slice System Slice.
[  OK  ] Reached target Slices.
[  OK  ] Created slice system-getty.slice.
[  OK  ] Listening on Delayed Shutdown Socket.
[  OK  ] Listening on /dev/initctl Compatibility Named Pipe.
[  OK  ] Listening on Journal Socket.
         Starting Journal Service...
[  OK  ] Started Journal Service.
         Mounting Debug File System...
         Mounting Configuration File System...
         Mounting FUSE Control File System...
         Starting Show Plymouth Boot Screen...
         Mounting POSIX Message Queue File System...
         Mounting Huge Pages File System...
[  OK  ] Reached target Encrypted Volumes.
[  OK  ] Reached target Swap.
         Starting Configure read-only root support...
         Starting Load/Save Random Seed...
[  OK  ] Reached target Local File Systems (Pre).
[  OK  ] Mounted Debug File System.
[  OK  ] Mounted Configuration File System.
[  OK  ] Mounted FUSE Control File System.
[  OK  ] Mounted POSIX Message Queue File System.
[  OK  ] Mounted Huge Pages File System.
[  OK  ] Started Load/Save Random Seed.
[  OK  ] Started Configure read-only root support.
[  OK  ] Reached target Local File Systems.
         Starting Mark the need to relabel after reboot...
         Starting Trigger Flushing of Journal to Persistent Storage...
         Starting Tell Plymouth To Write Out Runtime Data...
         Starting Create Volatile Files and Directories...
[  OK  ] Started Show Plymouth Boot Screen.
[  OK  ] Started Mark the need to relabel after reboot.
[  OK  ] Started Tell Plymouth To Write Out Runtime Data.
[  OK  ] Started Trigger Flushing of Journal to Persistent Storage.
[  OK  ] Started Create Volatile Files and Directories.
         Starting Update UTMP about System Reboot/Shutdown...
[  OK  ] Started Update UTMP about System Reboot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Reached target Timers.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Paths.
[  OK  ] Reached target Basic System.
         Starting LSB: Start the iprupdate utility...
         Starting Dump dmesg to /var/log/dmesg...
         Starting Permit User Sessions...
         Starting Network Manager...
         Starting System Logging Service...
         Starting irqbalance daemon...
[  OK  ] Started irqbalance daemon.
         Starting Dynamic System Tuning Daemon...
         Starting Login Service...
         Starting D-Bus System Message Bus...
[  OK  ] Started D-Bus System Message Bus.
         Starting LSB: Start the ipr init daemon...
[  OK  ] Started Permit User Sessions.
         Starting Command Scheduler...
[  OK  ] Started Command Scheduler.
         Starting Terminate Plymouth Boot Screen...
         Starting Wait for Plymouth Boot Screen to Quit...
         Starting Cleanup of Temporary Directories...
[  OK  ] Started System Logging Service.

CentOS Linux 7 (Core)
Kernel 3.10.0-123.4.4.el7.x86_64 on an x86_64

lxc login:

Nach dem Login prüfen wir die Netzwerkumgebung. Wir holden uns per dhcp eine IP-Adresse aus dem Pool. Wenn das erfolgt ist, sollten wir ohne Probleme andere IP-Adressen erreichen können.

[root@lxc ~]# dhclient eth0

[root@lxc ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
9: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 26:58:6a:04:28:2e brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.107/24 brd 192.168.122.255 scope global dynamic eth0
       valid_lft 3583sec preferred_lft 3583sec
    inet6 fe80::2458:6aff:fe04:282e/64 scope link
       valid_lft forever preferred_lft forever

[root@lxc ~]# ping der-linux-admin.de
PING der-linux-admin.de (212.83.36.6) 56(84) bytes of data.
64 bytes from celkar.bea5t.de (212.83.36.6): icmp_seq=1 ttl=57 time=23.0 ms

Wir können nun mit unserem neuen CentOS 7 im LXC Container arbeiten, weitere Programme installieren usw.

Verlassen könnt Ihr den Container wieder mit einen Druck auf CTRL+5! Alternativ kann man den LXC Container auch über SSH unter der nun bekannten IP erreichen.

Start, Stop und Löschen des LXC Containers

Mit den folgenden Befehlen kann man den Container starten, stoppen und löschen.

# start
virsh --connect lxc:/// start centos-7-x86_64
# stop
virsh --connect lxc:/// destroy centos-7-x86_64
# löschen
virsh --connect lxc:/// undefine centos-7-x86_64

Um den LXC Container beim Systemstart automatisch zu starten kann man wie in meinen anderen Artikel Autostart eines LXC-Containers beschrieben vorgehen.

Fazit

Ich persönlich nutze ein konfiguriertes Filesystem als Template und Grundlage für weitere LXC Instanzen. Man die kann Bereitstellung sehr einfach mit ein paar Skripten automatisieren. So hat man innerhalb von Sekunden ein oder mehrere funktionierende Testsysteme für ganz verschiedene Szenarien.

Als Vorlage diente das alte Tutorial für CentOS 6. Wie immer lohn ein Blick auf die Projektseite.

6 Kommentare

  1. Bekomme bei

    echo NEWROOTPW |passwd root --stdin
    folgende Ausgabe:

    Changing password for user root.
    passwd: Authentication token manipulation error

    Außerdem war plymouth und libselinux-python bereits installiert.

    Package plymouth-0.8.9-0.13.20140113.el7.centos.x86_64 already installed and latest version
    Package libselinux-python-2.2.2-6.el7.x86_64 already installed and latest version
    Nothing to do

    Wo liegt das Problem oder kann ich den Fehler von passwd ignorieren?

    P.S.: Sehr gute und hilfreiche Website.

    1. Hallo Andreas,

      vielen Dank für das Lob.
      Die angesprochenen Meldungen kannst Du getrost ignorieren. Falles es dennoch nicht funktionieren sollte kannst Du das Passwort auch in der chroot-Umgebung wie gewohnt mit “password” ändern.
      Wenn die Pakete bereits installiert sind werden diese nicht nochmals installiert.

      Dann viel Spass beim ausprobieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.