KVM steht für Kernel based virtual maschine und wird als Standardvirtualisierung bei vielen Linux Distributionen verwenden, auch bei Debian Lenny.

KVM greift auf Hardware-Virtualisierung zurück, daher kann es nur eingesetzt werden, wenn die CPU dies auch unterstützt. Man findet das mit folgenden Befehl heraus:

egrep '(vmx|svm)' --color=always /proc/cpuinfo

Die Ausgabe sieht dann etwas wie folgt aus (ich verwende hier einen 8 Core Prozessor):

egrep '(vmx|svm)' --color=always /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm ida

Wenn der Befehl nichts ausgibt, wird keine Hardware Virtualisierung unterstützt und KVM kann nicht verwendet werden.

Vorbereitung des Hostsystems

In dieser Anleitung verwende ich als Host System Debian Lenny und als Gastsystem Ubuntu LTS 8.04. Die Anweisungen können aber leicht auf eine andere Linux Distribution übertragen werden. Da sich diese Anweisung auch auf den Server Einsatz beziehen soll, werde ich auch nur auf Kommandozeilen-Programme eingehen.

Zuerst installieren wir die benötigten Pakete:

aptitude install kvm libvirt-bin virtinst

Nun weisen wir den aktuellen Benutzer (welcher root oder root Rechte besitzen sollte) die zusätzliche Gruppe libvirt zu:

adduser `id -un` libvirt

Um die neue Gruppenmitgliedschaft zu aktivieren ist eine Neuanmeldung nötig. Danach kann man mit folgenden Befehl testen, ob soweit alles geklappt hat:

virsh -c qemu:///system list

Folgende Ausgabe sollte dann zu sehen sein:

virsh -c qemu:///system list
 Id Name                 State
----------------------------------

Falls anstelle dessen eine Fehlermeldung ausgegeben wird, muss dieser Fehler erst beseitigt werden, bevor die Anleitung weiter abgearbeitet werden kann.

Netzwerk Einrichtung

Es gibt zwei Möglichkeiten, wie man bei der Einrichtung des Netzwerkes vorgehen kann:

  1. Wenn man für das Gastsystem eine eigene IP Adresse zur Verfügung hat, kann man NAT verwenden.

  2. Wenn das Gastsystem die selbe IP Adresse verwenden soll wie das Hostsystem, dann muss man eine Bridge Konfiguration durchführen. Dazu muss vorab folgender Befehl ausgeführt werden, um die benötigten Pakete zu installieren:

aptitude install bridge-utils

Nun kann die Konfiguration in der Datei /etc/network/interfaces vorgenommen werden. Meine Ausgangs-Konfigurationsdatei sieht mit einer statischen IP-Adresskonfiguration wie folgt aus:

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto  eth0
iface eth0 inet static
  address   188.40.137.203
  broadcast 188.40.137.255
  netmask   255.255.255.192
  gateway   188.40.137.193

Nachdem Änderungen durchgeführt wurden, sieht sie so aus:

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto eth0
iface eth0 inet manual

# Brigded device: br0
auto br0
iface br0 inet static
        address 188.40.137.203
        netmask 255.255.255.192
        broadcast 192.168.0.255
        gateway 188.40.137.193
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Wichtig dabei ist, dass Du DEINE IP Adressen einfügst und nicht die aus dem Beispiel verwendest!!

Nun kann das Netzwerk neu gestartet werden:

invoke-rc.d networking restart

Dann wird mit dem Befehl ifconfig die Einstellung überprüft:

ifconfig

Die Ausgabe sollte ähnlich meiner aussehen (nur mit anderen IP Adressen):

br0       Link encap:Ethernet  HWaddr 40:61:86:2b:8e:57
          inet addr:188.40.137.203  Bcast:192.168.0.255  Mask:255.255.255.192
          inet6 addr: fe80::4261:86ff:fe2b:8e57/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:33 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2382 (2.3 KiB)  TX bytes:3530 (3.4 KiB)

eth0      Link encap:Ethernet  HWaddr 40:61:86:2b:8e:57
          inet6 addr: fe80::4261:86ff:fe2b:8e57/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:772942 errors:0 dropped:12761630012 overruns:0 frame:0
          TX packets:562458 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:673452365 (642.2 MiB)  TX bytes:63177589 (60.2 MiB)
          Interrupt:249 Base address:0xc000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:833 errors:0 dropped:0 overruns:0 frame:0
          TX packets:833 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:185901 (181.5 KiB)  TX bytes:185901 (181.5 KiB)

Einrichtung des Gastsystems

Mit dem Befehl virt-install richtet man auf dem Hostsystem das Image des Gastsystems ein. Hier die Ausgabe aller verfügbaren Parameter:

# virt-install --help
Usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]

Options:
  -h, --help            show this help message and exit
  --connect=CONNECT     Connect to hypervisor with URI

  General Options:
    -n NAME, --name=NAME
                        Name of the guest instance
    -r MEMORY, --ram=MEMORY
                        Memory to allocate for guest instance in megabytes
    --arch=ARCH         The CPU architecture to simulate
    -u UUID, --uuid=UUID
                        UUID for the guest.
    --vcpus=VCPUS       Number of vcpus to configure for your guest
    --check-cpu         Check that vcpus do not exceed physical CPUs and warn
                        if they do.
    --cpuset=CPUSET     Set which physical CPUs Domain can use.

  Full Virtualization specific options.:
    --sound             Use sound device emulation
    --os-type=OS_TYPE   The OS type for fully virtualized guests, e.g.
                        'linux', 'unix', 'windows'
    --os-variant=OS_VARIANT
                        The OS variant for fully virtualized guests, e.g.
                        'fedora6', 'rhel5', 'solaris10', 'win2k'
    --noapic            Disables APIC for fully virtualized guest (overrides
                        value in os-type/os-variant db)
    --noacpi            Disables ACPI for fully virtualized guest (overrides
                        value in os-type/os-variant db)

  Virtualization Type Options:
    -v, --hvm           This guest should be a fully virtualized guest
    -p, --paravirt      This guest should be a paravirtualized guest
    --accelerate        Use kernel acceleration capabilities (kvm, kqemu, ...)

  Installation Method Options:
    -c CDROM, --cdrom=CDROM
                        CD-ROM installation media
    -l LOCATION, --location=LOCATION
                        Installation source (eg, nfs:host:/path,
                        http://host/path, ftp://host/path)
    --pxe               Boot from the network using the PXE protocol
    --livecd            Treat the CDROM media is a LiveCD
    -x EXTRA, --extra-args=EXTRA
                        Additional arguments to pass to the kernel booted from
                        --location

  Storage Configuration:
    --disk=DISKOPTS     Specify storage to use as a disk with various options.
    -f FILE_PATH, --file=FILE_PATH
                        File to use as the disk image
    -s DISKSIZE, --file-size=DISKSIZE
                        Size of the disk image (if it doesn't exist) in
                        gigabytes
    --nonsparse         Don't use sparse files for disks.  Note that this will
                        be significantly slower for guest creation
    --nodisks           Don't set up any disks for the guest.

  Networking Configuration:
    -b BRIDGE, --bridge=BRIDGE
                        Bridge to connect guest NIC to; if none given, will
                        try to determine the default
    -w NETWORK, --network=NETWORK
                        Connect the guest to a virtual network, forwarding to
                        the physical network with NAT
    -m MAC, --mac=MAC   Fixed MAC address for the guest; if none or RANDOM is
                        given a random address will be used

  Graphics Configuration:
    --vnc               Use VNC for graphics support
    --vncport=VNCPORT   Port to use for VNC
    --sdl               Use SDL for graphics support
    --nographics        Don't set up a graphical console for the guest.
    --noautoconsole     Don't automatically try to connect to the guest
                        console
    -k KEYMAP, --keymap=KEYMAP
                        set up keymap for a graphical console

  Miscellaneous Options:
    -d, --debug         Print debugging information
    --noreboot          Disables the automatic rebooting when the installation
                        is complete.
    --wait=WAIT         Total time to wait for VM to shutdown if console not
                        present. Time less than 0 waits indefinitely.
    --force             Forces 'yes' for any applicable prompts, terminates
                        for all others
    --prompt            Request user input for ambiguous situations. Default
                        is false, so will terminate if a prompt would
                        typically be fired.

Wie man sieht, ein sehr mächtiges Programm ;) Mit folgenden Parametern erzeuge ich nun ein Gast Image für Ubuntu LTS 8.04 Server mit Brigded Netzwerk, einer 20GB Festplattenkapazität und 1GB Hauptspeicher:

virt-install --connect qemu:///system -n ubuntu804 -r 1024 --vcpus=2 -f ~/ubuntu804.qcow2 -s 20 -c /srv/software/ubuntu-8.04.3-server-amd64.iso --nographics --os-type linux --os-variant debianLenny --accelerate --network=bridge:br0 --hvm

Mit virsh kann man nun die virtuellen Instanzen steuern. Alle Parameter von virsh hier im Überblick:

virsh --help

virsh [options] [commands]

  options:
    -c | --connect <uri>    hypervisor connection URI
    -r | --readonly         connect readonly
    -d | --debug <num>      debug level [0-5]
    -h | --help             this help
    -q | --quiet            quiet mode
    -t | --timing           print timing information
    -l | --log <file>       output logging to file
    -v | --version          program version

  commands (non interactive mode):
    help            print help
    attach-device   attach device from an XML file
    attach-disk     attach disk device
    attach-interface attach network interface
    autostart       autostart a domain
    capabilities    capabilities
    connect         (re)connect to hypervisor
    console         connect to the guest console
    create          create a domain from an XML file
    start           start a (previously defined) inactive domain
    destroy         destroy a domain
    detach-device   detach device from an XML file
    detach-disk     detach disk device
    detach-interface detach network interface
    define          define (but don't start) a domain from an XML file
    domid           convert a domain name or UUID to domain id
    domuuid         convert a domain name or id to domain UUID
    dominfo         domain information
    domname         convert a domain id or UUID to domain name
    domstate        domain state
    domblkstat      get device block stats for a domain
    domifstat       get network interface stats for a domain
    dumpxml         domain information in XML
    edit            edit XML configuration for a domain
    find-storage-pool-sources discover potential storage pool sources
    find-storage-pool-sources-as find potential storage pool sources
    freecell        NUMA free memory
    hostname        print the hypervisor hostname
    list            list domains
    migrate         migrate domain to another host
    net-autostart   autostart a network
    net-create      create a network from an XML file
    net-define      define (but don't start) a network from an XML file
    net-destroy     destroy a network
    net-dumpxml     network information in XML
    net-edit        edit XML configuration for a network
    net-list        list networks
    net-name        convert a network UUID to network name
    net-start       start a (previously defined) inactive network
    net-undefine    undefine an inactive network
    net-uuid        convert a network name to network UUID
    nodeinfo        node information
    pool-autostart  autostart a pool
    pool-build      build a pool
    pool-create     create a pool from an XML file
    pool-create-as  create a pool from a set of args
    pool-define     define (but don't start) a pool from an XML file
    pool-define-as  define a pool from a set of args
    pool-destroy    destroy a pool
    pool-delete     delete a pool
    pool-dumpxml    pool information in XML
    pool-edit       edit XML configuration for a storage pool
    pool-info       storage pool information
    pool-list       list pools
    pool-name       convert a pool UUID to pool name
    pool-refresh    refresh a pool
    pool-start      start a (previously defined) inactive pool
    pool-undefine   undefine an inactive pool
    pool-uuid       convert a pool name to pool UUID
    quit            quit this interactive terminal
    reboot          reboot a domain
    restore         restore a domain from a saved state in a file
    resume          resume a domain
    save            save a domain state to a file
    schedinfo       show/set scheduler parameters
    dump            dump the core of a domain to a file for analysis
    shutdown        gracefully shutdown a domain
    setmem          change memory allocation
    setmaxmem       change maximum memory limit
    setvcpus        change number of virtual CPUs
    suspend         suspend a domain
    ttyconsole      tty console
    undefine        undefine an inactive domain
    uri             print the hypervisor canonical URI
    vol-create      create a vol from an XML file
    vol-create-as   create a volume from a set of args
    vol-delete      delete a vol
    vol-dumpxml     vol information in XML
    vol-info        storage vol information
    vol-list        list vols
    vol-path        convert a vol UUID to vol path
    vol-name        convert a vol UUID to vol name
    vol-key         convert a vol UUID to vol key
    vcpuinfo        domain vcpu information
    vcpupin         control domain vcpu affinity
    version         show version
    vncdisplay      vnc display

  (specify help <command> for details about the command

Man startet das Program mit:

virsh --connect qemu:///system

Aktualisiert: