Installation von Debian in der VM

Dies ist der dritte Teil der Artikelserie zur Linux-Virtualisierung mit KVM. Er befasst sich mit der Installation von Linux in der VM. Die hierfür notwendigen Vorarbeiten sind im Artikel Virtualisierung mit KVM und Firewalling und NAT für die private Cloud beschrieben.

Vorbereitungen

Nachdem die Vorarbeiten nun abgeschlossen sind, geht es endlich mit der Installation der ersten VM los. Doch bevor die virtuelle Maschine gestartet werden kann, sind einige Vorbereitungen notwendig.

Speicherplatz

Für die virtuellen Festplatten und die Konfigurationsdaten benötigt man etwas Speicherplatz. Im Folgenden gehe ich davon aus, dass dieser unter /mnt/vms eingehängt wurde. Idealerweise nutzt man hierfür ein eigenes Dateisystem. Wer später auch noch Folder-Sharing mit dem Hostsystem aktiveren möchte, tut gut daran das Dateisystem unter /mnt/vms gleich mit der Option user_xattr einzuhängen. Zwingend notwendig ist das für die ersten Versuche natürlich nicht.

Unter dem Verzeichnis /mnt/vms/ habe ich folgende Unterverzeichnisse angelegt:

Verzeichnis Beschreibung
disks Festplattenimages der VMs
isos ISO-Images für die Installation der VMs
shared Verzeichnis mit zwischen Gast und Host geteilten Daten1
xml Original XML-Beschreibungen der Hosts

Damit libvirt und die Virtualisierungssoftware KVM auch auf die Verzeichnisse zugreifen können, müssen die Rechte noch angepasst werden. Als User sollte libvirt-qemu verwendet werden. Als Gruppe libvirt. Dies lässt sich am einfachsten über folgende Shell-Befehle sicherstellen:

cd /mnt/vms
chown -R libvirt-qemu:libvirt disks/ isos/ shared/ xml/
chmod -R 770 disks/ isos/ shared/ xml/

Wichtig: Alle Dateien, welche später angelegt werden, müssen zumindest für die Gruppe libvirt les- und schreibbar sein! Ansonsten kann der Hypervisor nicht auf diese Dateien zugreifen.

Woher?

Zuerst sollte man sich ein passendes Net-Install ISO-Image herunterladen. D. h. auf einem x86-System die x86-Version auf einem 64Bit-System die 64Bit Fassung. Die Installationsimages gibt es direkt von Debian.

Das ISO-Image kann mit wget direkt nach /mnt/vms/isos heruntergeladen werden.

Wichtig: Nicht vergessen die Rechte auf das ISO-Image so anzupassen, dass die Gruppe libvirt lesen darf.

Installation der VM

Die Vorbereitungen sind für alle zu installierenden Debian VMs nur ein einziges Mal durchzuführen. Jetzt beginnt also die Installation der neuen Debian Squeeze VM.

Wohin?

Die neue VM braucht als erstes einmal eine virtuelle Festplatte. Diese wird unter /mnt/vms/disks/ angelegt. Der Befehl qemu-img create -f raw /mnt/vms/disks/myserver.img 4G erzeugt eine RAW-Image. Ist das Dateisystem, auf welchem das Image angelegt wird, ext3 oder ext4, belegt auch dieses Dateiformat nur so viel Platz, wie auch tatsächlich beschrieben wurde. Hierfür wird das “Sparse”-Feature von ext3/4 genutzt.

Wer bin ich?

Als nächstes muss die XML-Definition der neuen VM erstellt werden. Da libvirt hier manchmal eigene Idee hat wie eine VM aussehen sollte, erstelle ich zuerst eine XML-Definition für die VM und lade diese anschließend über virsh. Die Originaldefinition hebe ich mir unter /mnt/vms/xml/ auf, um später ggf. prüfen zu können, was libvirt daraus gemacht hat.

Wer ebenso vorgehen möchte erstellt also zuerst die Datei /mnt/vms/xml/myserver.xml mit folgendem Inhalt:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>MyServer</name>
  <memory unit='MiB'>256</memory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='i686'>hvm</type>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <!-- Installation -->
      <graphics type='vnc' port='5900'>
        <listen type='address' address='0.0.0.0'/>
      </graphics>
      <disk type='file' device='cdrom'>
        <source file='/mnt/vms/isos/debian-6.0.6-i386-netinst.iso'/>
        <target dev='vdc' bus='ide'/>
        <readonly/>
        <boot order='1'/>
      </disk>
    <!-- Installation -->
    <console type='pty'>
      <target port='0'/>
    </console>
    <disk type='file' device='disk'>
      <source file='/mnt/vms/disks/myserver.img'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>
    <memballoon model='virtio'/>
  </devices>
</domain>

Natürlich können (und sollten) einige Elemente dieses Templates an die eigentliche Systemumgebung angepasst werden. Die folgende Tabelle gibt hierfür einige Hinweise:

Option Beschreibung
name-Tag Hier muss für jede VM ein eindeutiger Name vergeben werden.
memory-Tag Speicher welcher der VM zugeteilt wird. In diesem Fall wird eine statische Zuweisung verwendet.
vcpu-Tag Zuweisung der zu verwendenden, virtuellen CPUs. Die Option static ohne weitere Angabe legt fest, dass alle physikalischen CPUs verwendet werden können. Die vom Tag eingeschlossene Ziffer 1 definiert eine virtuelle CPU. Auf Mehrprozessorsystemen können auch mehrere virtuelle CPUs angelegt werden. Hierbei sollte jedoch die Anzahl an physikalischen CPUs nicht überschritten werden.
os > type-Tag Je nach Typ des Hostsystems sollte hier i686 für 32Bit-Host oder x86_64 für einen 64Bit-Host eingetragen werden. Hierdurch wird das Gastsystem mit der gleichen “Bittigkeit” ausgeführt wie das Hostsystem.
source-Tag im Abschnitt disk Dieses disk-Tag definiert die zu verwendende virtuelle Festplatte für den Server. Das source-Tag muss auf die Datei angepasst werden, welche die virtuelle Festplatte des Servers enthält. Ggf. können weitere disk-Tags eingefügt werden um weitere Festplatten zu definieren. Hierbei ist dann auch das dev-Attribut des enthaltenen target-Tags anzupassen.
source-Tag im Installationsabschnitt Definiert das ISO-Image welche für die Installation des virtuellen Servers verwendet werden soll.

Eine detaillierte Beschreibung aller in der XML-Datei möglichen Einstellungen findet sich auf der libvirt Homepage.

In der XML-Datei ist ein Abschnitt durch Installation-Kommentare eingeschlossen. Die hier definierten Geräte werden ausschließlich während der Installation benötigt und werden anschließend entfernt. Es handelt sich um das CD-ROM mit der Installations CD um um eine virtuelle Grafikkarte mit VNC als Ausgabegerät.

Nun, da die XML-Datei angelegt ist, wird es Zeit die VM zu definieren. Hierfür wird das Programm virsh verwendet. Es stellt alle Operationen bereit, welche für die Verwaltung der VMs notwendig sind. Im Laufe dieses Artikels wird es für alle Verwaltungsaufgaben in Bezug auf die VMs verwendet. Sobald virsh über sudo virsh gestartet wurde, zeigt das Programm als Prompt virsh # an.

Nun wird die VM auf Basis der XML-Datei definiert: define /mnt/vms/xml/myserver.xml. Die VM ist nun vorhanden und kann über list --inactive angezeigt werden:

 Id    Name                           State
----------------------------------------------------
 -     MyServer                       shut off

Um die VM-Definition nachträglich zu bearbeiten bietet virsh den Befehl edit an. Über edit MyServer können die Parameter der VM angezeigt werden. Man sieht sofort, dass libvirt das Template um einige Angaben, wie die UID oder die MAC-Adresse der Netzwerkkarte, ergänzt hat.

Es werde Licht

Bevor die Installation der VM gestartet werden kann ist noch ein VNC-Client notwendig. Dieser wird verwendet um auf den virtuellen Bildschirm der VM zuzugreifen. Später wird die Ausgabe des installierten Linux auf eine serielle Konsole umgeleitet und kann dann aus virsh heraus betrachtet werden. Unter Linux ist der VNC-Client der Distribution brauchbar. Für die Windows-Benuzter bietet sich der TightVNC Java Viewer an, da dieser keine Installation benötigt. Natürlich kann man auch den vollwertigen TightVNC viewer herunterladen und installieren.

Jetzt wird es ernst: Die VM wird durch die Eingabe von start MyServer in virsh gestartet.

Anschließend verbindet man sich auf die VM über den VNC-Viewer unter Verwendung der IP-Adresse des Hostsystems. Als Port nutzt man 5900.

Installationshinweise

Auf die Installation von Debian möchte ich hier nicht eingehen. Jedoch sollten einige Hinweise beachtet werden, damit hinterher auch eine funktionierende VM für die private Cloud heraus kommt:

  • Bei Debian sollte die Experteninstallation gewählt werden. Dadurch können die Parameter besser angepasst und unnötige Pakete entfernt werden.
  • Sollte man eine GUI installieren, bleibt man auf VNC für den Zugriff angewiesen und die Sache wird ziemlich träge. Daher sollte man bei der Paketauswahl die Option “Graphical desktop environment” am besten deaktivieren.
  • Hat man keinen DHCP-Server auf die Bridge br0 gebunden, muss man die IP-Adresse des Servers manuell eingeben. D.h. als IP-Adresse eine Adresse aus dem 192.168.100.0/24-Subnetz und als Gateway 192.168.100.1.
  • Die paravirtualisierten Festplatten werden bei der Installation als “Virtual Disk” erkannt und können normal partitioniert werden.
  • Bei einem System, welches aus dem Internet erreichbar sein soll, empfiehlt sich eine Minimalinstallation. Hierfür entfernt man bei der Paketauswahl nicht nur den Haken bei “Graphical desktop environment” sondern auch bei “Standard System Tools”
  • Die installierte Init-RAM-Disk darf durchaus “targeted” sein, da sich die für die VM notwendigen Treiber wohl nicht mehr ändern werden.
  • Als Bootloader ist GRUB, den man am besten in den MBR installieren sollte, die richtige Wahl.

Nachwehen

Nach Abschluss der Installation und dem ersten Reboot kann man sich, noch immer unter VNC, daran machen, das System an den Betrieb innerhalb der VM anzupassen. Hat man eine Minimalinstallation durchgeführt, müssen jedoch vorher noch ein Editor und ein SSH-Server seinen Weg auf das System finden:

apt-get install vim ssh

Nach einem beherzten update-rc.d ssh enable startet der SSH-Server auch nach dem Reboot. Nun sollte man das System erst einmal herunterfahren und das VNC-Frontend entfernen. Es ist nun definitiv überflüssig. Durch die Eingabe von poweroff auf der VNC-Console fährt das System herunter und die VM beendet sich.

Licht aus

Anschließend öffnet man wieder einmal virsh über sudo virsh und beginnt nun über das edit-Kommando die Konfiguration der VM an den normalen Betrieb anzupassen. Hierfür entfernt man zuerst alle Zeilen, welche das ISO-Image für das CD-ROM einbinden:

<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/mnt/vms/isos/debian-6.0.6-i386-netinst.iso'/>
  <target dev='vdc' bus='ide'/>
  <readonly/>
  <boot order='1'/>
  <address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>

Sollte sich irgendwo in der XML-Datei noch ein Controler vom Typ IDE herumdrücken, kann auch er entfernt werden. Das letzte IDE-Laufwerk ist gerade zusammen mit dem CD-ROM entfernt worden. Ab jetzt ist alles über paravirtualisierte virtio Geräte angebunden.

<controller type='ide' index='0'>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controler>

Zusätzlich muss auch noch die grafische Konsole deaktiviert werden. Hierfür entfernt man in der XML-Datei folgende Zeilen:

<graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
  <listen type='address' address='0.0.0.0'/>
</graphics>
<video>
  <model type='cirrus' vram='9216' heads='1'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<input type='mouse' bus='ps2'/>

Hinweis: Natürlich können einzelne XML-Abschnitte auch in anderer Reihenfolge oder mit leicht veränderten Parametern vorkommen. Hier ist etwas Fingerspitzengefühl gefragt. Sollte man zu viel entfernt haben, kann man die VM einfach mit undefine MyServery löschen2, aus dem VM-Template die Zeilen zwischen den beiden “Installation”-Kommentaren entfernen und den Server über define /mnt/vms/xml/myserver.xml neu anlegen.

Nach dem Speichern der neuen XML-Datei kann man die VM wieder über start MyServer starten.

Abspecken und umschichten

Jetzt kann per SSH auf das System zugegriffen werden. Auf der Konsole sollte die Eingabe von ssh root@192.168.100.1 das Root-Login auf dem System erlauben. Wurde dieses schon während der Installation dekativiert, muss man sich mit dem gewählten Benutzer einloggen und anschließend mit sudo -i zu root werden. Die folgenden Änderungen sollte man alle als root-Benutzer ausführen:

Da auf das System nur noch über SSH zugegriffen werden kann, verbrauchen die standardmäßig aktiven sechs Konsolensitzungen nur unnötig Speicher. Aus diesem Grund sollte die Datei /etc/inittab angepasst und alle Konsolen außer der Ersten auskommentiert werden:

1:2345:respawn:/sbin/getty 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

Um auch im Notfall auf das System zugreifen zu können, ist eine serielle Konsole hilfreich. Auf diese kann dann über virsh zugegriffen werden. Um von dieser Option Gebrauch zu machen, muss in die Datei /etc/inittab die folgende Zeile oberhalb von 1:2345:respawn:/sbin/getty 38400 tty1 eingefügt werden: ~~~ conf T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100 ~~~

Natürlich muss die serielle Konsole auch beim Booten aktiv sein, um ggf. bei Kernelproblemen eingreifen zu können. Hierfür müssen in der Datei /etc/default/grub die folgenden Zeilen eingefügt werden:

GRUB_CMDLINE_LINUX="console=ttyS0,9600n8"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1"
GRUB_TERMINAL="console serial"

Eine evtl. schon vorhandene GRUB_CMDLINE_LINUX=""-Zeile sollte man dabei entfernen.

Um die Änderungen zu aktivieren, muss auf der Konsole des Gastes anschließend update-grub ausgeführt werden.

Um die neue Konsole zu testen, muss die VM zuerst einmal wieder heruntergefahren werden. Dies geht am einfachsten über poweroff auf der Konsole des Gastes.

Sobald die Eingabe von list --all in die virsh des Hostsystems die VM nicht mehr als aktiv anzeigt, kann die VM mit angehängter Konsole neu gestartet werden. Hierfür ist das virsh-Kommando start MyServer --console nützlich. Es startet die neue VM und aktiviert sofort eine Konsole. In dieser sollte nun der GRUB-Bootscreen und anschließend der Start des installierten Linux-Systems zu sehen sein.

Die Konsole kann (bei deutschem Tastaturlayout3) über die Tastenkombination STRG++ verlassen werden.

  1. Wie das geht werde ich in einem späteren Artikel noch erklären. 

  2. Das Festplattenimage bleibt dabei natürlich erhalten. 

  3. Bei amerikanischem Layout ist die Tastenkombination CTRL+\]