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.
Bekomme bei
folgende Ausgabe:echo NEWROOTPW |passwd root --stdin
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.
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.
Das Problem mit dem Password-Token hatte ich auch. Mit
setenforce 0
und dem anschließenden chroot && passwd funktioniert es.