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:
Wenn man für das Gastsystem eine eigene IP Adresse zur Verfügung hat, kann man NAT verwenden.
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