Obsah

Používání KVM na vpsFree.cz

VPS jsou linuxové kontejnery, tzn. na nodu běží jeden kernel, který je sdílený mezi všemi VPS. Pokud z nějakého důvodu potřebuješ vlastní kernel, nebo chceš provozovat jiný operační systém, můžeš si ve VPS spouštět vlastní plnohodnotné virtuály pomocí QEMU/KVM.

Konfigurace

Nejprve je potřeba ve vpsAdminu v detailu VPS zapnout následující vlastnosti:

Na vpsFree není jiná možnost než mít disky pro KVM virtuály v souborech (images). Doporučujeme k tomu vytvořit nový (sub)dataset, vypnout v něm kompresi a nastavit velikost bloku (Record size) na 65536 B. Vypnutí komprese je velmi důležité, jinak vám bude image bobtnat a bobtnat, přes deklarovanou velikost image, dokud nenarazí na kvótu datasetu! Pro optimální výkon vytvářejte „raw“ image.

libvirt

Virtuály můžeš spravovat pomocí libvirt ve VPS a připojit se k němu přes virt-manager.

Mount dataset export z NAS serveru pro QEMU/KVM

Pokud chceš používat v QEMU/KVM připojený dataset export z NAS serveru, například pro mount ISO obrazu CD pro boot systému a dostaneš toto hlášení „Failed to lock byte 100: No locks available“, musí být daný export namountován do hostitelského systému s příznakem „nolock“.

Například pokud používáš pro mount do systému fstab:

562.586.65.25:/nas/4562 /mnt/export4562 nfs vers=3,nofail 0 0

Nově použiješ mount příkaz takto:

562.586.65.25:/nas/4562 /mnt/export4562 nfs vers=3,nofail,nolock 0 0

(562.586.65.25 > Adresa tvého NFS serveru; 4562 > číslo tvého datasetu na NFS serveru)

KVM na Alpine Linuxu

Připravu hypervizoru lze provést automatizovaně pomocí Ansible.

Na GitHubu jsou dle níže uvedeného návodu automatizovány zatím tyto sekce:

Instalace balíčků a konfigurace hypervizoru

Nainstalujte potřebné balíčky (ip6tables je volitelný):

apk update
apk add qemu-system-x86_64 qemu-openrc qemu-img bridge iptables ip6tables

Nastavte potřebná práva pro přístup ke KVM a TUN (do skupin kvm a netdev by měl patřit uživatel qemu, pod kterým bude běžet vytvořený virtuál):

chown :kvm /dev/kvm
chmod g+rw /dev/kvm
chown :netdev /dev/net/tun
chmod g+rw /dev/net/tun

Nakonfigurujte bridge pro Qemu/KVM virtuály; vytvořte soubor /etc/network/interfaces.tail (IP adresu si samozřejmě můžete zvolit libovolnou z privátního rozsahu):

auto br0
iface br0 inet static
     pre-up brctl addbr br0
     address 172.17.1.1
     netmask 255.255.255.0
     post-down brctl delbr br0

Jelikož OpenVZ poněkud neohrabaně přepisuje soubor /etc/network/interfaces (proto také konfiguraci bridge přidáváme do interfaces.tail, tak nejjistější je v tuto chvíli kontejner restartovat. :/

Povolte uživateli ve skupině qemu spravovat vytvořený bridge:

echo "allow br0" > /etc/qemu/bridge.conf
chown root:qemu /etc/qemu/bridge.conf
chmod 0640 /etc/qemu/bridge.conf

Nastavte IP maškarádu pro přístup Qemu/KVM virtuálů ven do veřejného Internetu.

Pokud už máte nakonfigurované iptables, tak jen přidejte pravidlo:

iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -o br0 -j MASQUERADE

V opačném případě můžete postupovat např. podle odstavce Nastavení iptables.

Vytvoření a spuštění virtuálu

V tomto návodu předpokládám použití qemu-openrc – OpenRC init skript pro startování Qemu/KVM. Na Alpine samozřejmě můžete používat i libvirt, ale opravdu chcete a potřebujete jeho neohrabané XML konfiguráky a/nebo klikátka nad ním…? ;) Qemu-openrc je výrazně jednodušší a transparentnější řešení. Každý virtuál je reprezentovaný init skriptem, stejně jako ostatní programy, můžete deklarativně nastavovat závislosti mezi virtuály atd.

Vytvoření nového virtálu spočívá pouze v přípravě image disku, vytvoření symlinku pro init skript a úpravě jednoduchého konfiguračního skriptu. Nechť se nový virtuál jmenuje třeba „myvirt.“

Připravte raw image pro myvirt o potřebné velikosti:

mkdir -p /var/lib/qemu/myvirt/
qemu-img create -f raw /var/lib/qemu/myvirt/disk0.raw 5G
chown qemu:qemu /var/lib/qemu/myvirt/disk0.raw
chmod 0600 /var/lib/qemu/myvirt/disk0.raw

Zkopírujte výchozí konfigurák /etc/conf.d/qemu do /etc/conf.d/qemu.myvirt a upravte dle potřeby:

cd /etc/conf.d
cp qemu qemu.myvirt
vi qemu.myvirt  # read comments and edit

Zejména tedy přidejte připravený image:

disk1_file="/var/lib/qemu/myvirt/disk0.raw"
disk1_format="raw"

A zřejmě také instalační CD některé distribuce, které jste si předem stáhli:

cdrom0_file="/var/lib/qemu/alpine-virt-3.4.1-x86_64.iso"

Vytvořte symlink pro init skript a spusťte myvirt:

cd /etc/init.d
ln -s qemu qemu.myvirt
 
rc-service qemu.myvirt start
Pokud máte problémy s tím, že při větším provozu na síťové kartě spadne ve virtuálu sít, zkuste použít driver e1000 místo výchozího virtio-net-pci:
net0_device="e1000"

stabilitu je možno otestovat iperf-em, na testovanem stroji:

iperf -s

na hostiteli pak:

iperf -c 172.17.1.X -P 20

Nastavení iptables

Pokud nepoužíváte žádný nástroj pro generování iptables pravidel (jako např. ferm), doporučuji vyjít z připravené šablony pravidel. Tyto jsou přímo ve formátu iptables, který je možný načíst pomocí iptables-restore.

Stáhněte upravenou šablonu pravidel s přidanou maškarádou pro náš bridge do /etc/iptables:

rmdir /etc/iptables
wget -O /etc/iptables https://gist.githubusercontent.com/jirutka/3742890/raw/c9f6bdbfcf597578e562c92ea1e256a9ebcf3a2c/rules-both.iptables

Upravte konfigurák /etc/conf.d/iptables (IPv4):

# /etc/conf.d/iptables
 
IPTABLES_SAVE="/etc/iptables"
#SAVE_RESTORE_OPTIONS="-c"
SAVE_ON_STOP="no"
IPFORWARD="yes"

…a /etc/conf.d/ip6tables (IPv6):

# /etc/conf.d/ip6tables
 
IP6TABLES_SAVE="/etc/iptables"
SAVE_RESTORE_OPTIONS="-T filter"
SAVE_ON_STOP="no"
IPFORWARD="yes"

Spusťte iptables a ip6tables a přidejte je do runlevel boot:

rc-service iptables start
rc-service ip6tables start
rc-update add iptables boot
rc-update add ip6tables boot

Kontakty