Inhaltsverzeichnis
KVM
Bei Linux-basierten Betriebssystemen, und auch generell, gibt es eine Vielzahl an unterschiedlichsten Virtualisierungslösungen. KVM, also die Kernel-based Virtual Machine, gilt als performante Lösung und ist seit Kernel-Version 2.6.20 im Kernel integriert.
Im Grunde genommen, wird beim Aufruf von kvm das Kommando qemu-system-x86_64 ausgeführt.
Installation
Ubuntu 20.04.1 LTS
> apt install qemu-kvm
Beispiel-VM starten
In diesem Beispiel hat die VM eine Festplatte (disk01.qcow2, 10GB groß), 2GB RAM (-m 2048), zwei CPU-Kerne (-smp 2) sowie Touchscreen- und Maus-Unterstützung (-device usb-tablet).
auf dem Server einloggen, alle folgenden Kommandos funktionieren nur dann, wenn ein derartiger Login funktioniert:
> ssh -X server [root@server ~]#
Laufwerke vorbereiten:
[root@server ~]# qemu-img create -f qcow2 disk01.qcow2 10G Formatting 'disk01.qcow2', fmt=qcow2 size=10737418240 cluster_size=65536 lazy_refcounts=off refcount_bits=16 [root@server ~]# wget http://cdimage.ubuntu.com/ubuntu-legacy-server/releases/20.04.1/release/ubuntu-20.04.1-legacy-server-amd64.iso
Netzwerk vorbereiten (eine Bridge wird vermutlich nicht benötigt):
[root@server ~]# ip link add br0 type bridge
[root@server ~]# ip link set eth0 master br0
[root@server ~]# sysctl -w net.ipv4.ip_forward=1 [root@server ~]# vi /etc/sysctl.conf
VM starten:
[root@server ~]# kvm -hda disk01.qcow2 -cdrom ubuntu-20.04.1-legacy-server-amd64.iso -m 2048 -smp cpus=2,threads=2 -no-acpi -serial none -parallel none -usb -device usb-tablet -k de -boot cd -device e1000,netdev=net12001 -netdev tap,id=net12001,ifname=tap12001 -display vnc=0.0.0.0:12001 -name test12001 [root@server ~]# sleep 10
Wenn man die Ausgabe nicht per VNC ausgeben will,
dann kann man statt der Option -display vnc=0.0.0.0:12001 auch -nographic verwenden,
in dem Fall wird die Ausgabe auf eine System-Console umgeleitet.
Wichtig ist hierbei auch, dass ein VNC-Port niemals mehrfach vergeben werden darf,
denn dann startet die zweite VM, die den gleichen VNC-Port konfiguriert bekommen hat, nicht.
Es müssen noch zwei Routen gesetzt werden,
…diese auf dem Host-System:
[root@server ~]# ip route add ${IPADR_GAST} dev tap12001 scope link
[root@server ~]# ip route
…diese auf dem Gast-System (wenn Host- und Gast-System nicht im selben Sub-Net sind):
[root@gast ~]# ip route add ${IPADR_HOST} dev eth0
[root@gast ~]# ip route add default via ${IPADR_HOST} dev eth0
[root@gast ~]# ip route
…alte Syntax: [root@gast ~]# route add -host ${IPADR_HOST} dev eth0
oder
…diese auf dem Gast-System (wenn Host- und Gast-System im selben Sub-Net sind):
[root@gast ~]# ip route add default via ${IPADR_HOST} dev eth0
[root@gast ~]# ip route
iptables-NAT-Regeln setzen:
[root@server ~]# iptables -t nat -A PREROUTING -d ${IP_HOST} -j DNAT --to-destination ${IP_RUMPF}${IP_ENDUNG}
[root@server ~]# iptables -t nat -A POSTROUTING -s ${IP_RUMPF}${IP_ENDUNG} -j SNAT --to-source ${IP_HOST}
iptables-NAT-Regeln ausgeben:
[root@server ~]# iptables -L -n -t nat
iptables-NAT-Regeln löschen:
[root@server ~]# iptables -t nat -D PREROUTING -d ${IP_HOST} -j DNAT --to-destination ${IP_RUMPF}${IP_ENDUNG}
[root@server ~]# iptables -t nat -D POSTROUTING -s ${IP_RUMPF}${IP_ENDUNG} -j SNAT --to-source ${IP_HOST}
Um die Ausgabe dann sehen zu können, kann man beispielsweise eines der folgenden beiden Kommandos eingeben:
> vncviewer -AutoSelect=0 -FullColour server:12001 > gvncviewer server:12001
[root@server ~]# iptables -L -n -t nat
Zugriff
SSH
Wenn das Betriebssystem in der KVM-VM eine IP hat und dort ein SSHD läuft, dann kann man sich prima per SSH dort einloggen:
# ssh root@[IP des OS in der KVM-VM]
VNC
VNC-Client installieren:
# aptitude install xvnc4viewer
Mit dem VNC-Port kann man sich so verbinden (auf den Port muss man immer 5900 drauf rechnen):
# # vncviewer -AutoSelect=0 -FullColour 192.168.1.42:5901
Netzwerk-Konfiguration
/etc/network/interfaces
# loopback-IF
auto lo
iface lo inet loopback
# 1. NIC
auto eth0
iface eth0 inet manual
bond-master bond0
#bond-primary eth0 eth1
# 2. NIC
auto eth1
iface eth1 inet manual
bond-master bond0
#bond-primary eth0 eth1
# Bonding über beide NICs
auto bond0
iface bond0 inet manual
slaves none
bond_mode 1
bond_miimon 100
bond_updelay 200
bond_downdelay 200
pre-up /sbin/ifconfig eth0 up ; /sbin/ifconfig eth1 up
post-up /bin/sleep 5
# Brücke auf dem Bond-IF
# damit KVM seine VMs daran hängen kann
auto br0
iface br0 inet static
address 192.168.1.42
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports bond0
post-up /bin/sleep 10
/home/bin/kvm-ifup-net1
#!/bin/sh
BRUECKE="br0"
/sbin/ifconfig $1 0.0.0.0 promisc up
#/sbin/ifconfig $1 mtu 1500
/usr/sbin/brctl addif ${BRUECKE} $1
sleep 2
/home/bin/kvm-ifdown-net1
#!/bin/sh
BRUECKE="br0"
/usr/sbin/brctl delif ${BRUECKE} $1
#/sbin/ifconfig $1 mtu 1500
/sbin/ifconfig $1 0.0.0.0 promisc down
sleep 2
