Ausführen von FreeBSD unter Linux KVM

    Ziel: FreeBSD unter Linux ausführen, vorzugsweise mit einem Minimum an Änderungen im Linux-System während der Ersteinrichtung und Aktualisierungen, der Fähigkeit, auf einer Workstation und einem Server ausgeführt zu werden, und mit minimalem Leistungsverlust.

    Sie können jede gängige Linux-Distribution als VPS-Farm verwenden. In unserem Fall ist es Ubuntu 12.10 mit dem Kernel 3.5.0 für amd64.

    Das Gastsystem wird FreeBSD 9.1 für i386 sein. Die i386-Architektur wurde ausgewählt, da 32-Bit-Anwendungen im Vergleich zu 64-Bit-Anwendungen deutlich weniger RAM verbrauchen.

    Als Virtualisierungssystem wird Linux-KVM ("Kernel-based Virtual Machine") verwendet .

    Ein kurzer Vergleich von KVM mit Alternativen


    KVM-Vorteile:
    • Im Gegensatz zu Xen / ESXi / Hyper-V erfordert es keine vorläufige Installation des Hypervisors und der Ressourcenplanung. Zum Studium und Testen kann es auf jeder Linux-Distribution, einschließlich Desktop-Distributionen, ausgeführt werden.
    • Im Gegensatz zu allen anderen Virtualisierungssystemen (außer LXC und mit OpenVZ-Einschränkungen) ist es im Basis-Linux-Kernel enthalten und wird von wichtigen Linux-Entwicklern (hauptsächlich RedHat ) entwickelt.
    • Im Gegensatz zu LXC und OpenVZ ist es in der Lage, beliebige Betriebssysteme auszuführen, einschließlich Linux mit einer eigenen Kernel-Instanz und einer Reihe von Treibern.

    Nachteile KVM:
    • Der Prozessor muss über Hardware-Unterstützung für die Virtualisierung verfügen.
    • Es gibt keine praktischen grafischen Shells zum Starten und Bearbeiten von virtuellen Maschinen.
    • Vom Basissystem aus gibt es keinen transparenten Zugriff auf Dateien, Prozesse und Container-Konsolen (in LXC und OpenVZ).

    Umgebungseinstellung


    Weiterhin nehmen wir an, dass alle Disk-Images und Einstellungsdateien im Home-Verzeichnis im Unterverzeichnis virt gespeichert sind :
    mkdir -p ~/virt && cd ~/virt
    

    Installieren Sie die erforderliche Software unter Linux:
    apt-get update && apt-get -y install kvm
    

    Die Virtualisierung selbst wird vom Modul als Teil des Kernels ausgeführt. Die Pakete, die apt-get je nach Abhängigkeit installiert, enthalten jedoch Steuerungs- und Hilfsprogramme, KVM-spezifische Einstellungen für grundlegende Linux-Dienste (z. B. für udev) usw.

    Überprüfen Sie die Hardware-Unterstützung:
    kvm-ok
    

    Hardware-Virtualisierung (a) muss vom Prozessor unterstützt werden und (b) muss im BIOS aktiviert sein. Andernfalls wird der KVM nicht und das Gast - Team wird mit einem Fehler beginnen oder enden (wenn Sie das angeben --enable-kvm ) oder Wechsel zu einer viel weniger effizienten Art der Software - Virtualisierung auf Basis von QEMU.
    Das Standard - Shell-Skript kvm-ok führt typische Überprüfungen durch und rät bei Fehlschlagen des Ergebnisses zu einer Korrektur.

    Container-Netzwerk


    KVM unterstützt viele Optionen zum Organisieren eines Gastnetzwerks (siehe z. B. eine kurze offizielle Übersicht ). Im Moment enthält "man kvm" 9! 8 Optionen für den Schlüssel " -net " mit Dutzenden von möglichen Unterschlüsseln, und häufig muss "-net" zweimal im Container-Startbefehl mit verschiedenen Unterschlüsselsätzen angegeben werden, um eine Gastschnittstelle und eine Schnittstelle im Basissystem für die Kommunikation mit dem Gast zu erstellen. Möglicherweise sind die Netzwerkeinstellungen während der anfänglichen Entwicklung der unauffälligste Teil von KVM.

    Für eine mehr oder weniger ernsthafte Verwendung sind zwei Optionen sinnvoll:
    1. Das Basissystem ermöglicht den Gästen einen transparenten Zugriff auf ein externes Netzwerk über das sogenannte Netzwerkbrücke ("Netzwerkbrücke"),
    2. Das Basissystem fungiert als Router zwischen dem externen und dem Gastnetzwerk („Router“).

    Beide erfordern Superuser-Berechtigungen, in unserem Fall haben sie die gleichen Parameter für "-net ..." , unterscheiden sich jedoch in den Aktionen im Skript "-net ..., script = ... ", das KVM aufruft, wenn der Container mit der Konfiguration des Netzwerks beginnt eine im Basissystem angelegte Schnittstelle. Die Bridge-Option ist etwas einfacher, daher führt unser Skript ~ / virt / kvm-ifup-bridge.sh Folgendes aus:
    • Wenn es keine Brücke gibt, erstellt sie diese und fügt ihr eine externe physikalische Schnittstelle hinzu.
    • weist der Bridge die gleiche IP wie der physikalischen Schnittstelle zu,
    • Verschiebt alle Routen von der physischen Schnittstelle zur Brücke.
    • Verbindet eine virtuelle Schnittstelle mit der Bridge, um mit dem Gastsystem zu kommunizieren.

    #!/bin/sh
    # Constants
    BRIDGE_IFACE="br0"
    # Variables
    iface="$1"
    gwdev="$(ip route get 8.8.8.8 | grep ' via ' | sed -e 's,.* dev ,,' -e 's, .*,,' | head -1)"
    my_ip="$(ip addr list dev $gwdev | grep ' inet ' | sed -e 's,.* inet ,,' -e 's, .*,,' | head -1)"
    # Create and configure bridge
    if ! ip link list "$BRIDGE_IFACE" >/dev/null 2>&1
    then
            echo "Create bridge $BRIDGE_IFACE..."
            brctl addbr "$BRIDGE_IFACE"
            brctl addif "$BRIDGE_IFACE" "$gwdev"
            ip link set "$BRIDGE_IFACE" up
            ip addr add "$my_ip" dev "$BRIDGE_IFACE"
    fi
    # Move routes from physical iface to bridge
    if test "$gwdev" != "$BRIDGE_IFACE"
    then
            ip route list dev "$gwdev" | grep -v 'scope link' \
            | while read line; do
                    ip route delete $line dev "$gwdev"
                    ip route add    $line dev "$BRIDGE_IFACE"
            done
    fi
    # Add virtual iface to bridge
    ip link set "$iface" up
    brctl addif "$BRIDGE_IFACE" "$iface"
    

    In verschiedenen Handbüchern wird empfohlen, die Bridge im Voraus durch Bearbeiten von / etc / network / interfaces zu konfigurieren. Für Testzwecke auf einer Workstation ist es jedoch einfacher, sie in dem Moment zu erstellen, in dem sie wirklich benötigt wird, d. H. zum Zeitpunkt des ersten Starts des ersten Containers.

    Wenn zusätzliche MAC-Adressen im externen Netzwerk nicht akzeptabel sind, können Routing und ProxyARP anstelle der Bridge verwendet werden . Wenn das externe Netzwerk genau einen MAC und eine IP zulässt, müssen Sie im Basissystem Routing, eine IP-Adresse auf den internen Schnittstellen und NAT verwenden, um die Gastsysteme nach außen zu verlassen. In beiden Fällen müssen Sie entweder statische IP-Adressen in den Gastsystemen konfigurieren oder einen DHCP-Server im Basissystem konfigurieren, um die Gäste zu konfigurieren.

    KVM kann beim Start automatisch MAC-Adressen für Gastnetzwerkschnittstellen generieren. Wenn Sie jedoch vorhaben, Gäste über eine Netzwerkbrücke nach außen freizugeben, ist es besser, ihnen permanente MAC-Adressen zuzuweisen. Insbesondere wenn ein DHCP-Server im externen Netzwerk ausgeführt wird, kann das Gastsystem bei jedem Start dieselbe IP-Adresse abrufen. Stellen Sie zunächst die Basis-MAC-Adresse zusammen:
    perl -e '$XEN_RESERVED = "00:16:3e"; printf "%s:%02x:%02x:%02x\n", $XEN_RESERVED, int(rand(0x7f)), int(rand(0xff)), int(rand(0xff));'
    

    Bei Containern ersetzen wir die letzte Nummer durch die Seriennummer. Wir werden die gleiche Nummer für ihre Namen und für VNC-Konsolen verwenden. Beispiel: Container Nummer 25 heißt "kvm_25", hat MAC 00: 16: 3e: xx: xx: 25 und überwacht VNC-Verbindungen an Port 59 25 . Um Hämorrhoiden mit unterschiedlichen Zahlensystemen nicht zu verschlimmern, um keine unnötigen Probleme zu haben, wird empfohlen, Zahlen von 10 bis 99 zu wählen. Dieser Ansatz wird beim VDS-Hosting natürlich nicht verwendet, ist aber für persönliche Bedürfnisse geeignet.

    Aktionsplan


    1. Booten Sie vom CD-Image, installieren Sie das Betriebssystem auf einem leeren Festplatten-Image und schalten Sie die VM aus.
    2. Bearbeiten Sie das Startskript (schalten Sie die CD aus), booten Sie von der Festplatte, konfigurieren Sie die Virtio-Unterstützung im Gastbetriebssystem und schalten Sie die VM aus.
    3. Wir bearbeiten das Startskript (wir ändern die Datenträger- und Netzwerktypen von IDE und Realtek zu virtio) und booten.

    Vorbereitung für den ersten Start


    Laden Sie das ISO-Image der FreeBSD-Installations-CD herunter:
    wget http://mirror.yandex.ru/freebsd/releases/ISO-IMAGES/9.1/FreeBSD-9.1-RELEASE-i386-disc1.iso
    

    Erstellen Sie ein Festplatten-Image:
    kvm-img create -f qcow2 freebsd9.img 8G
    kvm-img info freebsd9.img
    

    Das Bildformat wird mit der Option "-f" ausgewählt: raw (Standard), qcow2, vdi, vmdk, cloop usw. Raw ist für jede Software verständlich, bietet jedoch nur ein Minimum an Möglichkeiten und nimmt sofort den maximal möglichen Platz ein. Qcow2 ist kompakter (unterstützt dynamische Größenänderung) und funktionaler (unterstützt Snapshots, Komprimierung, Verschlüsselung usw.), wird jedoch nur von QEMU-basierten Systemen erkannt.

    Erster Start und Installation


    Skript zum Ausführen von ~ / virt / freebsd9.start
    #!/bin/sh
    MACBASE="00:16:3e:33:28"
    VM_ID=10
    DIR=$HOME/virt
    sudo kvm \
    -net "nic,model=rtl8139,macaddr=$MACBASE:$VM_ID" \
    -net "tap,ifname=tap$VM_ID,script=$DIR/kvm-ifup-bridge.sh,downscript=/bin/true" \
    -name "kvm_$VM_ID" \
    -enable-kvm \
    -m 512M \
    -hda $DIR/freebsd9.img \
    -cdrom "$DIR/FreeBSD-9.1-RELEASE-i386-disc1.iso" \
    -boot order=d \
    ## END ##
    

    In dem sich öffnenden Fenster sollten CD Loader und das FreeBSD-Installationsprogramm starten. Wir führen die Installation wie gewohnt durch. Fast alle Optionen können standardmäßig belassen werden.

    Befehlserläuterungen starten


    Sudo ist notwendig, weil Zum Erstellen einer TAP-Schnittstelle benötigt der KVM-Loader Superuser-Berechtigungen.

    Mit zwei " -net " -Schlüsseln werden zwei miteinander verbundene Netzwerkschnittstellen erstellt: TAP im Basissystem und virtuelles Realtek-8139 im Gastsystem.

    Der Schalter " -enable-kvm " stellt sicher, dass QEMU den Software-Emulationsmodus nicht automatisch auswählt, wenn KVM nicht gestartet werden kann.

    Die Taste " -name " definiert den Titel des Konsolenfensters und kann zum Durchsuchen der Liste der Prozesse usw. verwendet werden.

    Die Bootdiskette ist die CD (" -boot order = d"). Die Option ist nur gültig, wenn der Container eingeschaltet ist, d. H. Nach dem Neustart startet die Systemsuche von der ersten Festplatte.

    -m "legt die Größe des Gast-RAM fest. Standardmäßig - 128 Megabyte. Damit das Installationsprogramm funktioniert, reicht dies möglicherweise aus. Nach einer erfolgreichen Installation war es jedoch der erste Versuch, ein großes Projekt aus den Ports mit" -m 256M "und einer Swap-Partition von 512 Megabyte (Größe automatisch) zusammenzustellen durch den Installateur) verursacht Kernel - Trap ausgewählt.

    die Lader KVM arbeitet als normaler Benutzer Prozess, schalten sie so die virtuelle Maschine, klicken sie einfach auf die Konsole die Strg + die C (natürlich, die Laufgastbetriebssystem ist besser , es nicht zu tun und genießen poweroff den Gast - Konsole). Svya loader mit einem virtualisierungssystem im kernel implementiert der loader über das symbolische pseudo-device / dev / kvmDaher kann jeder Benutzer, der zum Schreiben berechtigt ist, virtuelle Maschinen starten. In der Regel wird für solche Benutzer die Gruppe " kvm " im System angelegt .

    Um im Hintergrund zu laufen, hat der Bootloader den Schalter " -daemonize ".

    Zweiter Start und Konfiguration von virtio


    Bevor Sie das Skript freebsd9.start ausführen , müssen Sie die Zeilen " boot " und " cdrom " auskommentieren . Dann starten wir es und geben nach Abschluss des FreeBSD-Bootvorgangs seine Befehlszeile mit Superuser-Rechten ein.

    Die virtio-Gasttreiber für FreeBSD sind noch nicht im Kernel enthalten, werden aber als Port verteilt. Daher müssen wir den Ports-Baum installieren:
    portsnap fetch extract
    

    Zum Erstellen benötigen Treiber die Quellen des aktuellen Kernels:
    csup -h cvsup2.ru.FreeBSD.org /usr/share/examples/cvsup/standard-supfile
    

    Danach sammeln und installieren wir die Treiber selbst:
    make -C /usr/ports/emulators/virtio-kmod install clean
    

    Die folgenden Zeilen müssen zu /boot/loader.conf hinzugefügt werden :
    virtio_load="YES"
    virtio_blk_load="YES"
    virtio_pci_load="YES"
    virtio_balloon_load="YES"
    if_vtnet_load="YES"
    

    Sie können aus / var / db / pkg / virtio-kmod * / + DISPLAY kopiert werden. Wenn Sie vergessen - FreeBSD - Kernel wird fallen, wenn der Laden eine Einladung «mountroot>» , weil es nicht das Laufwerk mit Root - FS sehen kann. Sie müssen neu starten, die Befehlszeile des Boot-Managers aufrufen und diese Module manuell mit dem Befehl „load“ vor dem Kernel laden.

    In /etc/rc.conf sollten Sie eine der beiden Linien verwenden:
    ifconfig_vtnet0="DHCP"      # ..ifconfig_re0 можно удалить
    ifconfig_vtnet0_name="re0"  # ..ifconfig_re0 надо оставить!
    

    Wenn eine große Anzahl von Einstellungen bereits an die alte Netzwerkschnittstelle gebunden ist, wird mit der zweiten Option eine weitgehende Änderung vermieden. Aber es macht auch das Gesamtschema etwas verwirrender.

    In / etc / fstab müssen Sie all / dev / ada durch / dev / vtbd ersetzen . Wenn der Datenträger vom Installationsprogramm automatisch markiert wurde, sieht fstab folgendermaßen aus:
    # Device	Mountpoint	FStype	Options	Dump	Pass#
    /dev/vtbd0p2	/		ufs	rw	1	1
    /dev/vtbd0p3	none		swap	sw	0	0
    

    Wenn Sie fstab vergessen oder falsch bearbeitet haben, wird Ihnen beim nächsten Start die Eingabeaufforderung „mountroot“ angezeigt, und Sie müssen manuell „ufs: / dev / vtbd0p2“ eingeben.

    Was ist virtio und warum wird es überhaupt benötigt?


    Wenn eine virtuelle Kopie eines realen Geräts (z. B. einer Realtek-Netzwerkkarte oder einer SCSI-Festplatte) im Container bereitgestellt wird, werden Aufrufe an dieses Gerät zuerst über den Gerätetreiber im Gastsystem ausgeführt. Der Treiber konvertiert Lese- / Schreibaufrufe auf hoher Ebene mit Interrupts, Registern, E / A-Ports usw. in Operationen auf niedriger Ebene. Sie werden vom Virtualisierungssystem abgefangen und erledigen die umgekehrte Arbeit - dies führt zu Aufrufen auf hoher Ebene für ein externes System (z. B. Lesen / Schreiben einer Disk-Image-Datei).

    Wenn sich im Container ein virtio-Gerät befindet, überträgt der Gastsystemtreiber sofort Daten zum und vom externen System. Der Treiber ist vereinfacht, eine einfache Virtualisierung der physischen Ressourcen ist nicht erforderlich.

    Sie schreiben, dass sich der Übergang zu virtio im Gastsystem beschleunigtDas Laufwerk ist verdoppelt , und das Netzwerk ist fast eine Größenordnung .

    Ein weiteres interessantes Merkmal von virtio ist die dynamische Zuweisung von Speicher für das Gastsystem (" Ballooning ") und die Kombination von Speicherblöcken mit demselben Inhalt ( KSM , "Kernel Samepage Merging").

    VirtualBox und KVM verwenden die kompatible virtio-Engine, sodass die Anzahl der Gasttreiber für sie identisch ist. Unter Linux sind Gasttreiber bereits im Standardkernel enthalten, für FreeBSD werden sie als Port verteilt (siehe oben), für Windows werden sie von den KVM-Entwicklern geschrieben (siehe hier ).

    Dritter Start


    Ändern Sie die Zeilen mit der Netzwerkschnittstelle und der Festplatte in ~ / virt / freebsd9.start :
    -net "nic,model=rtl8139,macaddr=$MACBASE:$VM_ID" \
    -hda $DIR/freebsd9.img \
    

    ... zu Folgendem:
    -net "nic,model=virtio,macaddr=$MACBASE:$VM_ID" \
    -drive "file=$DIR/freebsd9.img,if=virtio" \
    

    Wenn der Start von FreeBSD erfolgreich ist, können Sie mit den folgenden Befehlen überprüfen, ob jetzt virtuelle Geräte verwendet werden:
    ifconfig
    df; swapinfo
    kldstat
    dmesg | grep vt
    

    Gastkonsole


    Standardmäßig rendert KVM die Gastkonsole mithilfe der SDL-Bibliothek im Grafikfenster. Diese Option eignet sich nicht zum Ausführen des Containers im Hintergrund, zum Ausführen auf einem Server ohne Grafiken und zum Zugreifen auf die Konsole über das Netzwerk.

    Um dieses Problem zu lösen, kann der KVM-Container über das VNC-Netzwerkprotokoll Zugriff auf die Gastkonsole gewähren. Fügen Sie in ~ / virt / freebsd9.start die Startoptionen ein:
    -vnc localhost:$VM_ID \
    

    Wenn der Container gestartet wird, öffnet KVM kein grafisches Fenster, sondern eine Netzwerkverbindung. Sie können es beispielsweise mit dem Befehl " sudo netstat -ntlp | grep -w kvm " anzeigen .

    Installieren Sie die Client - Anwendung (zB tightvncviewer ) und eine Verbindung zu der Konsole:
    apt-get install vncviewer
    vncviewer :10
    

    Hinweis: Wenn im VNC-Fenster keine Reaktion auf die Tastatur erfolgt, klicken Sie darauf.

    Eine VNC-Verbindung kann durch ein Passwort geschützt werden, es ist jedoch leider nicht möglich, ein Passwort direkt über die Befehlszeile zu vergeben. Sie müssen entweder über eine separate Steuerbuchse eine Verbindung zur Steuerkonsole des Containers herstellen (eine kurze Beschreibung der Konfiguration und der Verbindungsherstellung) oder diese im Hauptfenster von VNC durch Drücken von Strg + Alt + Umschalt + 2 öffnen .

    Zusätzlich zu SDL und VNC wird eine kursbasierte Textschnittstelle unterstützt (die Taste "-curses" oder "-display curses"). Theoretisch könnte es praktisch sein, wenn ein Hintergrund im Bildschirm ausgeführt wird. In der Praxis sendet KVM seinen eigenen Diagnosemüll an die zu erstellende Konsole und macht die Verwendung unbequem.

    Jetzt auch beliebt: