OpenVZ Tipps · 7 min read · Jan 17, 2026

Einige Tipps zur OpenVZ-Bereitstellung

Einige Tipps zur OpenVZ-Bereitstellung

Ich verlasse mich stark auf OpenVZ. In diesem Artikel möchte ich einige meiner persönlichen Erfahrungen bei der Bereitstellung von OpenVZ teilen. Ich gehe davon aus, dass die Leser bereits wissen, wie man OpenVZ installiert und die Grundlagen von OpenVZ. Dieser Artikel beschreibt einige Tipps zur Nutzung von OpenVZ über die Befehlszeile. Wenn Sie die GUI der Befehlszeile vorziehen, wenden Sie sich bitte an die Anleitung zur Installation von WebVZ.

Die hier beschriebene Einrichtung folgt diesen Richtlinien:

  • Der echte Server hat minimale Software installiert (ich verwende Debian Etch mit minimaler Installation) als Ausgangspunkt. Zusätzliche Anwendungen werden nach Bedarf während der Bereitstellung installiert.
  • Der echte Server sollte so sicher wie möglich sein. Andererseits möchte ich es einfach und leicht einrichtbar/zu wartend halten. Daher habe ich einen Kompromiss gewählt: Ich verlasse mich nur auf das, was mit Debian leicht bereitgestellt werden kann, und gehe nicht auf zusätzliche Sicherheitsmaßnahmen wie Openwall, SELinux, Grsecurity usw.
  • Jeder benötigte Dienst wird in einem separaten Container bereitgestellt, damit sie sich gegenseitig so wenig wie möglich stören.
  • Intrusion Detection für den echten Server sowie die Container wird auf dem echten Server mit OSSEC bereitgestellt.
  • Die Firewall (iptables) wird auf dem echten Server eingerichtet; die Container führen nur die Dienste aus.
  • Ich verlasse mich auf SSH als einziges Mittel, um auf den echten Server und die Container zuzugreifen und sie zu warten.

Grundlegende Sicherheit

Bevor ich irgendwelche OVZ-Container bereitstelle, nehme ich einige Änderungen an der Konfiguration des echten Servers vor, um ihn sicherer zu machen:

  • Root-Passwort deaktivieren
  • Einen Benutzer admin-user hinzufügen, der alles mit sudo ausführen kann; dieser Benutzer hat ein einfaches Passwort
  • Einen Benutzer ssh-user hinzufügen, der sich per SSH mit dem echten Server verbinden kann; nachdem ich den SSH-Schlüssel für diesen Benutzer hochgeladen habe, ändere ich die Zeile in .ssh/authorized_keys zu lesen: command="/bin/su - admin-user" ssh-rsa AAAA... und ändere /etc/pam.d/su, um nur diesem Benutzer das Su zu erlauben: auth required pam_wheel.so group=ssh-user
  • Um Dateien vom/zum echten Server zu kopieren, erstelle ich einen weiteren Benutzer sftp-user und installiere MySecureShell.
  • Ändere sshd_config so, dass: - nur ssh-user und sftp-user sich verbinden dürfen.
  • Die Passwortauthentifizierung ist deaktiviert (nachdem die SSH-Schlüssel für ssh-user und sftp-user hochgeladen wurden).
  • sshd läuft auf einem nicht standardmäßigen Port.

Das obige Schema funktioniert wie folgt: Um eine Verbindung zum echten Server herzustellen, verbinden wir uns als ssh-user. Dann müssen wir das Passwort für admin-user eingeben. Wenn jemand den SSH-Schlüssel für ssh-user erhält, muss er dennoch das Passwort für admin-user kennen, um Zugriff auf den Server zu erhalten (ein Fehler von /bin/su - admin erzeugt sofort einen E-Mail-Alarm von OSSEC).

Um Dateien vom/zum Server zu kopieren, verwenden wir SFTP mit dem Konto sftp-user. Wenn jemand den SSH-Schlüssel für diesen Benutzer erhält, ist das kein großes Problem, da er nur auf Dateien in seinem $HOME zugreifen kann.

Erstellen von OpenVZ-Containern

Ich finde es bequemer, eine Vorlage für alle Container zu erstellen, sodass ich, wenn ich einen neuen Container benötige, einfach einen Klon von der Vorlage mache. Ich verwende nur Debian Stable für den echten Server sowie für die Container. Der erste Schritt besteht also darin, eine Vorlage zu erstellen und sie nach meinem Geschmack anzupassen:

  • Erstellen eines neuen Containers: vzctl create 2002 --ostemplate debian-4.0-amd64-minimal

  • Einige grundlegende Parameter festlegen: vzctl set 2002 --ipadd 192.168.100.2 --nameserver 1.2.3.4 --hostname host2 --save

  • Den Container starten: vzctl start 2002

  • In den Container eintreten: vzctl enter 2002

  • Ich bevorzuge es, alles auf das absolute Minimum zu beschränken und nach Bedarf hinzuzufügen. Da die Installation eines Pakets mit Debian so einfach ist, erfordert es sehr wenig Aufwand, um jedes benötigte Paket zu installieren. Daher nehme ich die folgenden Änderungen für die Vorlage vor: - aptitude ausführen und die Optionen/Abhängigkeitsverwaltung/Empfohlene Pakete automatisch installieren deaktivieren.

  • Einige Pakete entfernen, die ich nicht in der Vorlage haben möchte: bsdmainutils ed groff-base info iptables libconsole libgdbm3 man-db manpages nano netcat openssh-client openssh-server quota ssh traceroute

  • /etc/apt/sources.list bearbeiten, um sie nach meinen Vorlieben anzupassen.

  • Dann stoppe ich die Vorlage: vzctl stop 2002

Jedes Mal, wenn ich einen neuen Container benötige, verwende ich ein Skript vz-clone wie folgt:

#!/bin/bash

# Skript zum Klonen eines OpenVZ VE

set -e

if [ -z "$2" ]; then
    echo "Verwendung: $0  "
    exit 1
fi

cfg="/etc/vz/conf/$1.conf"
newcfg="/etc/vz/conf/$2.conf"

if [ ! -e $cfg ]; then 
    echo $cfg nicht gefunden!
    exit 1
fi

VEID=$1
. $cfg
veprivate="$VE_PRIVATE"

VEID=$2
. $cfg
newveprivate="$VE_PRIVATE"

if [ -e $newcfg ]; then 
    echo $newcfg existiert bereits!
    exit 1
fi

if [ -e $newveprivate ]; then 
    echo $newveprivate existiert bereits!
    exit 1
fi

if vzlist | fgrep -w -q $1
then
    vzctl stop $1
fi

echo "Klonen von $cfg nach $newcfg"
cp -a $cfg $newcfg

echo "Klonen von $veprivate nach $newveprivate"
mkdir -p $newveprivate
cd $veprivate
tar cf - . | (cd $newveprivate && tar xf -)

echo "Vergessen Sie nicht, $newcfg zu bearbeiten (Sie müssen mindestens HOSTNAME und IP_ADDRESS bearbeiten)"
echo "Vergessen Sie auch nicht, ein Alias zu erstellen"

Verwendung:

sudo sh vz-clone 2002 2010
Klonen von /etc/vz/conf/2002.conf nach /etc/vz/conf/2010.conf  
Klonen von /vz/private/2002 nach /vz/private/2010  
Vergessen Sie nicht, /etc/vz/conf/2010.conf zu bearbeiten (Sie müssen mindestens HOSTNAME und IP_ADDRESS bearbeiten)  
Vergessen Sie auch nicht, ein Alias zu erstellen

Je nach Ihrer /etc/vz/vz.conf können die Pfade oben unterschiedlich sein. Ich verwende die folgenden Einstellungen:

VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEID

Dann müssen wir /etc/vz/conf/2010.conf bearbeiten, z.B. HOSTNAME auf host10, IP_ADDRESS auf 192.168.100.10 ändern und wir sind bereit, mit dem neuen Container zu starten. Wir werden auch ein Alias für den neuen Container erstellen, der im nächsten Abschnitt beschrieben wird.

Arbeiten mit OpenVZ-Containern

Die OVZ-Container werden durch Nummern identifiziert. Ich finde es einfacher, sie nach Namen/Alias zu benennen, sodass ich mir nicht merken muss, dass z.B. 2010 die ID des Containers ist, der den DNS-Dienst ausführt. Abgesehen davon möchte ich mich auch von der Erinnerung an die verschiedenen Befehle vzctl, vzlist, vzquota usw. und deren Parameter befreien. Daher erstelle ich einige einfache Skripte, um mir zu helfen.

  • Zuerst erstelle ich eine Liste von Aliasnamen /etc/vz-aliases: # Aliase für OpenVZ VEs 2001 test 2002 template 2010 dns 2020 ldap 2030 mail 2040 web ...
  • Um zwischen IDs und Aliasnamen zu übersetzen, erstelle ich ein Skript /usr/local/bin/vz-get-alias wie unten und mache vz-get-veid als Symlink zu vz-get-alias: #!/bin/sh vz_alias_file="/etc/vz-aliases" case $0 in *vz-get-alias) cat $vz_alias_file | egrep "^[[:space:]]*$1[[:space:]]" | awk '{print $2}' ;; *vz-get-veid) cat $vz_alias_file | egrep "[[:space:]]$1[[:space:]]*$" | awk '{print $1}' ;; esac
  • Dann packe ich häufige Befehle zur Manipulation von OVZ-Containern in ein Skript namens /usr/local/bin/vz-cmd-generic: #!/bin/sh set -e ## zuerst vz-list behandeln, da es keine ID/Alias benötigt case $0 in *vz-list) sedfile=`mktemp` cat /etc/vz-aliases | egrep '^[0-9]' | \ sed 's/\([0-9]*\) *\([a-zA-Z0-9-]*\)/s,\1 .*,\&\2,/' > $sedfile sudo vzlist "$@" | sed 's/ $//' | \ sed -f $sedfile | \ sed '1s/$/ALIAS/' exit ;; esac ## die anderen Befehle benötigen eine ID oder einen Alias if [ -z "$1" ]; then echo "Verwendung: $0 | []" exit 1 fi veid=`/root/bin/vz-get-veid $1` if [ -z "$veid" ]; then veid=$1 fi shift case $0 in *vz-start) sudo vzctl start $veid ;; *vz-restart) sudo vzctl restart $veid ;; *vz-stop) sudo vzctl stop $veid ;; *vz-enter) sudo vzctl enter $veid ;; *vz-exec) sudo vzctl exec $veid "$@" ;; *vz-edit) sudo vi /etc/vz/conf/$veid.conf ;; *vz-quota-ls) sudo vzquota stat $veid ;; *vz-ubc) sudo head -2 /proc/user_beancounters sudo cat /proc/user_beancounters | egrep -A23 "^[[:space:]]+${veid}:" ;; esac Und mache alle Befehle vz-start, vz-stop, vz-exec usw. als Symlinks zu diesem Skript vz-cmd-generic.

Die Verwendung ist dann einfach:

  • Um alle laufenden Container aufzulisten: vz-list VEID NPROC STATUS IP_ADDR HOSTNAME ALIAS 2010 15 running 192.168.100.10 host10 dns 2020 8 running 192.168.100.20 host20 ldap 2030 23 running 192.168.100.30 host30 mail 2040 11 running 192.168.100.40 host40 web
  • Um alle Container (einschließlich der nicht laufenden) aufzulisten: vz-list -a VEID NPROC STATUS IP_ADDR HOSTNAME ALIAS 2002 - stopped 192.168.100.2 host2 template 2010 15 running 192.168.100.10 host10 dns 2020 8 running 192.168.100.20 host20 ldap 2030 23 running 192.168.100.30 host30 mail 2040 11 running 192.168.100.40 host40 web
  • Um einen Container zu starten/stoppen/neustarten: - vz-start dns
  • vz-stop dns
  • vz-restart dns
  • Um einen Befehl innerhalb eines Containers auszuführen: vz-exec dns aptitude update
  • Um UBC eines Containers zu überprüfen: vz-ubc dns
  • Um das Quota eines Containers zu überprüfen: vz-quota-ls dns
  • Es ist auch möglich, eine ID anstelle eines Alias zu verwenden: vz-ubc 2010

Es ist auch eine gute Idee, den Alias über verschiedene echte Server hinweg eindeutig zu halten, damit wir /etc/vz-aliases zwischen ihnen ohne Konflikte teilen können.

Dieser Artikel ist bereits ziemlich lang, also lassen Sie uns hier aufhören. Wir werden im nächsten Teil fortfahren, in dem wir Themen wie die Bereitstellung von Intrusion Detection mit OSSEC, wie man UBC-Parameter für Container überwacht und festlegt, usw. besprechen.

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.