Zurück  

Template-Container

Da ich für alle CT gemeinsame Vorgaben habe, erstelle ich als erstes gleich ein eigenes Template. Das erspart mir für die Zukunft einiges an Wiederholungen.

Erstellen eines Containers

Von Bild zu Bild geht es jeweils unten Rechts mit 'Next' (beim letzten mit 'Finish') weiter.

Achtung: Nach dem Klick auf 'Finish' dauert es etwas. Erst wenn das 'TASK OK' erscheint, darf das Fenster oben Rechts mit dem Kreuz/X geschlossen werden.

Ich habe gerne Ordnung mit den MAC-Adressen weshalb ich sie setze und nicht automatisch generieren lasse. Die MAC-Adressen "00:16:3E:x:y:z" sind für XEN reserviert, wobei ich x=00, y=netzwerk und z=IP ersetze.

Oben Rechts im Proxmox-Frontend auf 'Create CT' klicken um den Container zu erstellen.

bild

bild

bild

bild

bild

bild

bild

bild

bild

Der neue Container wird noch nicht gestartet!

Konfiguration auf dem Host

ssh

Erfahrungsgemäss wird Port 22 reativ oft angegriffen. Deshalb ändere ich den SSH-Port auf all meinen Sytemen auf Port 55.

/Pool1/subvol-250-disk-1/etc/ssh/sshd.conf

Wir suchen nach "port 22" und ersetzen das mit "port 55" (Backup gemacht?).

Auch "PermitRootLogin" auf "yes" setzen. In den CT macht ein "no" keinen Sinn, denn ich habe keine andern Benutzer aktiv!

Auf dem Host ist auch noch Port 22 aktiv. Also die obigen Anpassungen auch noch "/etc/ssh/sshd.conf" nachtragen, wobei hier ein "no" angebracht ist.

hosts / resolv

Die Kombination proxmox/lxc überschreibt beim Start diese Konfigurations-Dateien. Insbesondere wird der Rechnername auf die Adresse "127.0.1.1" gesetzt. Dazu habe ich folgenden Workaround:

/Pool1/subvol-250-disk-1/etc/init.d/0hostresolv

DL
#! /bin/sh
### BEGIN INIT INFO
# Provides:          hostresolv
# Required-Start:
# Required-Stop:
# Should-Start:      glibc
# Default-Start:     S
# Default-Stop:
# Short-Description: Set hosts and resolv.conf
# Description:       Set hosts and resolv.conf
### END INIT INFO

case "$1" in
  start|"")
    [ -e /etc/hosts ] && cp -a /etc/hosts /etc/hosts.SET
    [ -e /etc/hosts.OK ] && cp -a /etc/hosts.OK /etc/hosts
    [ -e /etc/resolv.conf ] && cp -a /etc/resolv.conf /etc/resolv.conf.SET
    [ -e /etc/resolv.conf.OK ] && cp -a /etc/resolv.conf.OK /etc/resolv.conf
    exit 0
    ;;
  stop)
    exit 0
    ;;
esac
exit 3

Aktivieren mit

DL
chmod +x /Pool1/subvol-250-disk-1/etc/init.d/0hostresolv

/Pool1/subvol-250-disk-1/etc/resolv.conf.OK

DL
domain intern.comasys.ch
nameserver 8.8.8.8

/Pool1/subvol-250-disk-1/etc/hosts.OK

DL
127.0.0.1	localhost
62.2.169.250	template.local.comasys.ch template
::1	localhost ip6-localhost ip6-loopback
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters

CT Starten

Weiter in einem SSH-Terminal mit "ssh root@62.2.169.250 -p55".

hosts / resolv

update-rc.d 0hostresolv defaults

Jetzt den CT gleich nochmals neustarten, damit unser neues Script auch ausgeführt wird.

Mit "ls -la /etc/{hosts,resolv.}*" kontrollieren, ob die .SET erstellt wurden und die .OK kopiert wurden.

Update

DL
apt-get update
apt-get upgrade

Notwendige Pakete

DL
apt-get install
 attr
 acl

'Meine' Pakete

DL
apt-get install
 mc
 joe
 p7zip

System-Konfiguration

dpkg-reconfigure dash
dpkg-reconfigure locales
dpkg-reconfigure tzdata
update-alternatives --config editor

Wie bei der Vorbereitung

Mail-Versand

In den nächsten Schritten gehe ich davon aus, dass wir über SSH auf dem CT arbeiten. Wer als Editor Mouspad verwenden will, muss die Anpassungen auf dem Host vornehmen. Der CT für das Template ist vom Host aus im Verzeichnis "/Pool1/subvol-250-disk-1/" zu finden.

Damit die Cron-Jobs ihre Mail sauber abliefern können, müssen sowohl auf dem Host als auch in jedem einzelnen Container (auch in allen zukünftigen) noch Anpassungen vorgenommen werden.

Ich verwende in fast allen CT die gleiche Adresse. Deshalb muss ich in den neuen CT nichts mehr anpassen, wenn diese bereits im Template eingetragen sind.

Sender

/etc/postfix/main.cf

Folgende Zeile muss am Ende angefügt werden:

sender_canonical_maps=hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical

Diese Datei wird neu erstellt.

root absender@domain
www-data absender@domain

Damit in Zukunft die Absender umgeschrieben werden (beim Empfänger wird als Absender 'absender@domain' erscheinen), muss das Map-File erstellt und postfix neu gestartet werden

postmap /etc/postfix/sender_canonical
service postfix restart

Ab sofort werden mails von root (also z.Bsp Cron-Jobs) mit dem neuen Absender verschickt. Das zweite Beispiel www-data wäre für den apache Web-Server, der hier aber nicht installiert ist.

Empfänger

/etc/crontab

Folgende Zeile muss am Anfang eingefügt werden:

MAILTO="email@addresse"

/etc/aliases

Damit eMails die z.bsp an 'root' oder 'postmaster' auf diesem Rechner gerichtet sind auf eine beliebige Adresse weitergeleitet werden, muss folgendes eingetragen werden:

root: weiter.an@diese.adresse
postmaster: weiter.an@andere.adresse

anschliessend das Map-File neu erstellen (und eventuell postfix neu starten)

postalias /etc/aliases
service postfix restart

Container Stoppen

Das war es schon. Der CT muss jetzt gestoppt werden

halt

Sobald die Verbindung getrennt ist, kann unser Template erstellt werden.

Template erstellen

(Ab jetzt wieder auf dem Host!)

Für das erstellen des Template habe ich mir ein Bash-Script gebastelt.

Ich lösche die nicht benötigen 'locale' und 'man'-Dateien. Nur englisch und deutsch bleibt, der Rest darf weg. Auch die ganzen doc- und info-Verzeichnisse können weg. Falls ich da mal was brauche ist es auf dem Host noch vorhanden, oder auch im Internet zu finden.

Nun wird der CT gestartet um ein Update/Upgrade durchzuführen, anschliessend die apt-Datenbanken zu säubern und die Datenbank für die man-Dateien neu aufzubauen.

Die Log-Files lösche ich auch, ebenso die /tmp und /var/tmp. Da ich noch nie verstanden habe, wieso es 2 temporäre gibt, lege ich für das /var/tmp einen Symlink auf /tmp an.

Die Netzwerk-Konfiguration wird beim erstellen eines CT neu angelegt, deshalb muss die 'interfaces' auch noch weg.

Jetzt muss nur noch das Template erstellt werden.

/Pool1/Save.sh

DL
#! /bin/bash

ID=250

SRC=/Pool1/subvol-${ID}-disk-1
DST=/var/lib/vz/template/cache/Template.tar.gz

if [ ! -d ${SRC} ]
then
 echo "error!"
 exit
fi

TT=$( tempfile )

cd ${SRC}/..
echo "start container"
lxc-start --name ${ID}
echo "apt"
lxc-attach --name ${ID} -- apt-get update &>/dev/null
lxc-attach --name ${ID} -- apt-get upgrade -y &>${ID}-upgrade.log
lxc-attach --name ${ID} -- apt-get clean &>/dev/null
echo "mandb"
lxc-attach --name ${ID} -- mandb &>/dev/null
echo "stop container"
lxc-stop --name ${ID}

cd ${SRC}
echo "remove"
DIR=usr/share/locale
if [ -d "${DIR}" ]
then
 ls -1 ${DIR} >${TT}
 while read LINE
 do
  keep=0
  [ ${LINE:0:2} == "de" ] && keep=1
  [ ${LINE:0:2} == "en" ] && keep=1
  [ ${keep} -eq 0 -a -d "${DIR}/${LINE}" ] && rm -rf "${DIR}/${LINE}"
 done < ${TT}
fi
DIR=usr/share/man
if [ -d "${DIR}" ]
then
 ls -1 ${DIR} >${TT}
 while read LINE
 do
  keep=0
  [ ${LINE:0:2} == "de" ] && keep=1
  [ ${LINE:0:2} == "en" ] && keep=1
  [ ${LINE:0:3} == "man" ] && keep=1
  [ ${keep} -eq 0 -a -d "${DIR}/${LINE}" ] && rm -rf "${DIR}/${LINE}"
 done < ${TT}
fi
rm -f ${TT}

rm -rf usr/share/doc/*
rm -rf usr/share/doc-base/*
rm -rf usr/share/info/*

echo "cleanup"
rm -rf var/log/*
rm -rf tmp
rm -rf var/tmp
mkdir tmp
chmod 1777 tmp
ln -sf ../tmp var/tmp

rm -f etc/network/interfaces

echo "create archive"
[ -e "${DST}" ] && rm -f "${DST}"
tar -czf "${DST}" ./ 2>/dev/null
echo "...done"

Sollte ausführbar sein:

DL
chmod +x /Pool1/Save

Wenn wir den nächsten CT erstellen, steht nebst dem Orginal auch unser neues Template.tar.gz zur Verfügung. Im weiteren Verlauf werde ich ausschliesslich das eigene verwenden, dann muss ich nich jedes mal meine Pakete enspielen und die Konfig (dash, locale, tzdata, editor) sind auch bereits erledigt.

Das obige Batch-Script kann auch periodisch (z.Bsp mit cron) ausgeführt werden und das Template immer auf dem aktuellen Stand zu halten. Auf meinem Test-Server brauche ich immer mal wieder einen neuen CT, deshalb mache ich den Cron-Update jeweils um 1:00 am Samstag:

/etc/cron.d/templatesave

0 1 6 * * /Pool1/Save

Dieser CT wird natürlich nicht automatisch gestartet!
Und wir lassen ihn auch ausgeschaltet.

Zurück