Debian Jessie OpenVZ Template erstellen

Da sich heute Morgen die Frage, wo man denn ein HowTo zum Debian 8 Template bauen finden würde, in meinem Postfach befand und ich ad-hoc nur auf mein schlecht dokumentiertes Script verweißen konnte, gibt’s jetzt mal ein paar Zeilen dazu.

Zu Beginn ein paar mahnende Worte: Die nachfolgenden Zeilen wurden nach bestem Gewissen erstellt und getestet. Trotzdem übernehme ich keinerlei Haftung dafür, wenn durch sie was kaputt geht.

Zuerst setzen wir ein paar Rahmenbedingungen, wie die VEID (auch Container ID, oder CTID genannt), die zu verwendende IP und die gewünschte Architektur (i386 für 32bit, amd64 für 64bit).

_VEID=1337
_VEIP=1.3.3.7
_ARCH=amd64

Damit wir einen leeren Container anlegen können, benötigen wir ein leeres Dummy-Template. Da OpenVZ sowas nicht kennt, bauen wir es uns einfach selbst

tar cfTz /vz/template/cache/debian-dummy.tar.gz /dev/null

Container mit unserem Dummy-Template erstellen

vzctl create $_VEID --ostemplate debian-dummy

Container mounten

vzctl mount $_VEID

Und ein frisches Debian Jessie bootstrap’en

debootstrap --arch $_ARCH jessie /vz/root/$_VEID

sync() in syslog abschalten

sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /vz/root/$_VEID/etc/*syslog.conf

Container starten

vzctl start $_VEID

Systemd sagen, dass wir nicht alle von mitgelieferten Dienste brauchen. Es müsste nicht alles hier gelistete deaktiviert werden, aber so ist der Boot schön sauber :)

vzctl exec $_VEID "systemctl mask systemd-udevd.service"
vzctl exec $_VEID "systemctl mask systemd-udevd-kernel.socket"
vzctl exec $_VEID "systemctl mask systemd-udevd-control.socket"
vzctl exec $_VEID "systemctl mask proc-sys-fs-binfmt_misc.automount"
vzctl exec $_VEID "systemctl mask console-getty.service"
vzctl exec $_VEID "systemctl mask getty-static.service"
vzctl exec $_VEID "systemctl mask dbus.socket"
vzctl exec $_VEID "systemctl mask display-manager.service"
vzctl exec $_VEID "systemctl disable getty@tty2.service"

Wer sich sicher ist, dass er den Befehl “vzctl console " nicht nutzen wird, kann auch noch den Service console-getty maskieren

vzctl exec $_VEID "systemctl mask console-getty.service"

Unbenötigte Packages entfernen (ich denke nicht, dass wir in nem Container nen DHCP-Client brauchen werden..)

vzctl exec $_VEID "apt-get -y purge isc-dhcp-client isc-dhcp-client"
vzctl exec $_VEID "apt-get clean"

Container stoppen und gemountet lassen

vzctl stop $_VEID --skip-umount

Logfiles, etc aufräumen

find /vz/root/$_VEID/var/log -type f -delete
find /vz/root/$_VEID/tmp -type f -delete

Und finally: Template bauen

cd /vz/root/$_VEID
tar --numeric-owner -vzcf /vz/template/cache/debian-$(cat etc/debian_version)-$_ARCH-minimal.tar.gz .

und Arbeitsverzeichnis aufräumen

vzctl umount $_VEID
vzctl destroy $_VEID

Jetzt habt ihr ein frisches Debian-Template, dessen laufende Prozessliste wirklich minimal ist

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  28124  3232 ?        Ss   10:34   0:00 init -z       
root         2  0.0  0.0      0     0 ?        S    10:34   0:00 [kthreadd/1337]
root         3  0.0  0.0      0     0 ?        S    10:34   0:00 [khelper/1337]
root        35  0.0  0.0  32904  2084 ?        Ss   10:34   0:00 /lib/systemd/systemd-journald
root        84  0.0  0.0  25836  1116 ?        Ss   10:34   0:00 /usr/sbin/cron -f
root        87  0.0  0.0 264748  2096 ?        Ssl  10:34   0:00 /usr/sbin/rsyslogd -n
root       648  0.0  0.0  17436  1136 ?        Rs   10:37   0:00 ps aux

Beim nächsten anzulegenden Container kann nun mittels “-ostemplate debian-8.0-amd64-minimal” auf das gerade gebaute Template zurückgegriffen werden. (Kann abweichen, wenn eine andere Architektur als amd64 verwendet wurde oder Debian die Version 8.0 schon hinter sich gelassen hat.)