Virtualisierung mit KVM und WebVirtMgr (Teil 1) – update

Nicht ohne Grund haben sich in der modernen IT virtuelle Systeme für die meisten Serversysteme durchgesetzt. Aber auch für den ambitionierteren Privatanwender bietet es einige Vorteile. Für mich war insbesonders die fehlende Wechselwirkung zwischen den Systemen, wenn man pro Anwendung eine VM benutzt, und die einfache Portierbarkeit ausschlaggebend.

Eine gewisse Problematik, wenn man einen Rootserver eines typischen Hosters benutzt, ist daß der Großteil der verbreiteten Virtualisierungslösungen nicht trivial zu installieren sind. Normalerweise werden eine handvoll Linuxversionen in Standardausführung angeboten, die Installation von XenServer oder VMware erfordert hingegen oft einige Klimmzüge, z.B. per aufpreispflichtiger Remote-Konsole.

Nach etwas rumprobieren fiel meine Wahl also auf KVM, da es bei jedem aktuellen Linux bereits dabei ist, so daß ein Standard-Debian (oder eine andere Distribution, ich bevorzuge eben Debian) ausreicht. Um bei der Administration nicht nur auf der Kommandozeile rumzuhacken kombiniere ich das mit WebVirtMgr, eine WebGUI für libvirt.

UPDATE: leicht aktualisierte Version, außerdem benutze ich inzwischen Ubuntu-Server (16.04LTS) statt Debian, da ich ZFS verwenden möchte.

Im Folgenden gehe ich von einem frisch installiertem Ubuntu-Server und dem User root aus. Ein Großteil der Anleitung stammt von hier.

Teil 1: Installation WebVirtMgr

Benötigte Pakete installieren:

  • apt-get install -y libvirt-bin libvirt-daemon libvirt-daemon-system libvirt0 policykit-1 bridge-utils apache2-utils git python-pip python-libvirt python-libxml2 novnc supervisor apache2 qemu qemu-kvm

WebVirtMgr installieren:

  • cd /var/www
  • git clone git://github.com/retspen/webvirtmgr.git
  • cd webvirtmgr
  • pip install -r requirements.txt 
  • ./manage.py syncdb
  • ./manage.py collectstatic
  • nach Aufforderung einen User für das Webinterface erstellen

apache konfigurieren:

Da WebVirtMr normalerweise nur auf localhost erreichbar ist verwenden wir apache2 als Reverse Proxy

  • Datei /etc/apache/sites-available/000-default.conf editieren
<VirtualHost *:80>
  ServerAdmin mail@adres.se
  ServerName serverna.me

  ProxyPreserveHost On
  ProxyPass        "/" "http://127.0.0.1:8000/"
  ProxyPassReverse "/" "http://127.0.0.1:8000/"

  <Location />
    AuthType  Basic
    AuthName  "Nisch mit den Schuhn!"
    AuthUserFile  /etc/apache2/authfiles/htpasswd-virt
    Require   valid-user
  </Location>
</VirtualHost>

Weil sicher ist sicher richten wir einen zusätzlichen Passwortschutz ein (der Location-Block oben):

  • htpasswd -c /etc/apache2/authfiles/htpasswd-virt BENUTZERNAME

Sofern man verschlüsselt darauf zugreifen will (empfehlenswert!) analog mit der Datei /etc/apache2/sites-available/default-ssl.conf verfahren

zu guter Letzt die notwendigen Module aktivieren und den Dienst restarten:

a2enmod proxy

a2enmod proxy_http

a2enmod proxy_html

a2enmod ssl

a2enmod remoteip

service apache2 restart

Supervisor einrichten:

  • chown -R www-data /var/www/webvirtmgr
  • /etc/supervisor/conf.d/webvirtmgr.conf anlegen:
[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr.log
redirect_stderr=true
user=www-data

[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=www-data
  • service supervisor stop
  • service supervisor start

Jetzt sollte WebVirtMgr auf Port 80 und 443 (also standard http/s) laufen und mit den eingerichteten Benutzerdaten zugänglich sein. Blöderweise reicht das noch nicht um die lokalen VMs zu managen, da man sich noch mit libvirt verbinden muß. Theoretisch funktioniert das lokal einfach per Socket, praktisch fehlt da noch ein authentication agent. Da ich nach 3 Sekunden googlen keine Lösung dafür gefunden habe  löse ich das Problem mit bekannten Mitteln: SSH.

lokale passwortlose ssh-Anmeldung einrichten:

  • adduser webvirtmgr
  • chown www-data /var/www
  • su - www-data -s /bin/bash
  • ssh-keygen -t rsa -b 2048 -N “” -f ~/.ssh/id_rsa
  • ssh-copy-id webvirtmgr@127.0.0.1

zum Testen einmal „ssh webwirtmgr@127.0.0.1“ als www-data ausführen, sollte ohne Passwortabfrage funktionieren. Stolperfalle: damit der User webvirtmgr auch die VMs verwalten darf muß er Mitglied der passenden Gruppe (libvirtd) sein.

(Update: scheint nicht mehr notwendig zu sein) Managementrechte einrichten:

Siehe auch hier (vermutlich verbirgt sich da auch die Lösung für den lokalen Socket).

  • Datei /etc/polkit-1/localauthority/50-local.d/org.libvirt.unix.manage.pkla anlegen:
Identity=unix-user:webvirtmgr
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

fertig:

Im WebVirtMgr unter Add Connection -> SSH Connection noch mit IP 127.0.0.1 und User webvirtmgr eine neue Verbindung anlegen und jetzt sollte man in der Lage sein die lokalen VMs und die zugehörige Infrastruktur zu administrieren.

Ausblick

Im 2. Teil beschreibe ich einige Tücken bei der Netzwerkkonfiuration und etwas zur Migration.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s