Server Installation/UML

Aus Opennet
Version vom 23. Oktober 2017, 20:06 Uhr von Lars (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche


UML Virtualisierung wurde kurzzeitig auf Server/jun eingesetzt.

Inhaltsverzeichnis

Allgemeines

user-mode-linux ermöglicht die Virtualisierung eines Systems im Userspace eines Hosts. Abgesehen von der Netzwerkkonfiguration genügen somit einfache Nutzerrechte, um diese Virtualisierung zu verwenden und zu verwalten.

Als Voraussetzung ist ein für die Ziel-Plattform "UML" kompilierter Linux-Kernel erforderlich. Dieser kompilierte Kernel ist im Unterschied zu einem üblichen Linux-Kernel ein ausführbares Programm. Zusätzlich zum UML-Kernel wird ein root-Dateisystem benötigt. Es wird üblicherweise in Form eines Images als Paramter bei der Ausführung mitgegeben.

Da ein UML-Kernel nur auf einer bestimmten Plattform lauffähig ist (der des Build-Hosts), verteilt OpenWrt keine UML-Kernel. Somit sind diese selbst zu kompilieren. Alternativ liefert beispielsweise auch Debian ein user-mode-linux-Paket aus. Für die Verwendung von openwrt-Images muss anschließend lediglich das im Debian-Paket enthaltene /lib/modules/-Verzeichnis auf das Image kopiert werden.

Ersteinrichtung

Pakete

Pakete installieren:

apt-get install dnsmasq vde2

Konfigurationen

dnsmasq-Konfiguration (/etc/dnsmasq.d/custom.conf):

interface=lo
interface=virt-uplink
dhcp-range=172.16.10.10,172.16.10.50,12h
server=/on/192.168.10.2
server=172.23.12.1
# die virtuellen Clients sollen bei uns die DNS-Anfragen aufloesen
dhcp-option=6, 172.16.10.1

Virtuelle Interfaces konfigurieren (/etc/network/interfaces):

auto virt-uplink
iface virt-uplink inet static
  address 172.16.10.1
  netmask 255.255.255.0
  vde2-switch -t virt-uplink

auto virt-mesh1
iface virt-mesh1 inet manual
  vde2-switch -t virt-mesh1

auto virt-mesh2
iface virt-mesh2 inet manual
  vde2-switch -t virt-mesh2

auto virt-mesh3
iface virt-mesh3 inet manual
  vde2-switch -t virt-mesh3
 
auto virt-mesh4
iface virt-mesh4 inet manual
  vde2-switch -t virt-mesh4

Nutzer einrichten:

adduser --disabled-password uml-virt
adduser uml-virt vde2-net

Verwaltung

Script

Nun fehlt noch ein Skript für den Start der Hosts bzw. für die Definition der Vernetzung.

Die interessanteste Zeile in diesem Skript ist der Aufruf des UML-Kernels:

./uml_vmlinuz uml_dir=run ssl=pty mem=32M ubd0=host_foo.cow:openwrt-uml-ext4.img umid=host_foo eth0=daemon,,,/var/run/vde2/virt-uplink.ctl/ctl

Auf Server/jun verwenden wir folgendes Skript:

#!/bin/sh

set -eu

BASE_DIR=~/uml

# Wir wollen keine absoluten Links in den cow-Dateien - also lieber ins Verzeichnis
# wechseln und dann mit relativen Pfaden arbeiten.
cd "$BASE_DIR"


SCREEN_NAME=uml_console
UML_BIN="./openwrt-0.5.3-unstable-1728-uml-vmlinux"
UML_BASE_IMAGE="openwrt-0.5.3-unstable-1728-uml-ext4.img"
UML_IMAGE_DIR="hosts"
UML_RUN_DIR="run"
UML_MEMORY=32M
UML_DEFAULT_ARGS="uml_dir=$UML_RUN_DIR ssl=pty mem=$UML_MEMORY"


send_screen_command() {
       screen -S "$SCREEN_NAME" -X "$@"
}


run_screen_if_not_running() {
       screen -ls "$SCREEN_NAME" >/dev/null || screen -S "$SCREEN_NAME" -d -m
}


poweroff_host() {
       local name="$1"
       local pidfile="$UML_RUN_DIR/$name/pid"
       [ -e "$pidfile" ] || return
       kill "$(cat "$pidfile")"
}


clear_host_cow() {
       local name="$1"
       rm -f "$UML_IMAGE_DIR/${name}.cow"
}

configure_host_in_current_window() {
       local name="$1"
       # TODO: leider funktioniert "select" nicht - also muss das Zielfenster aktuell aktiv sein :( 
       #send_screen_command select "$name"
       # oeffne die Konsole
       send_screen_command stuff "\n"
       while read line; do
               send_screen_command stuff "$line\n"
       done <<-EOF

               uci set "system.@system[0].hostname=$name"
               uci set "network.lan.ifname=none"
               uci delete -q "network.wan"
               uci set "network.wan=interface"
               uci set "network.wan.ifname=eth0"
               uci set "network.wan.proto=dhcp"
               uci set "network.wan.hostname=$name"
               uci set "firewall.@zone[1].input=ACCEPT"
               uci commit
               reload_config
EOF
}


run_host() {
       local name="$1"
       local host_image="$UML_IMAGE_DIR/${name}.cow"
       local run_post_configure=0
       shift
       local args="$UML_DEFAULT_ARGS ubd0=$host_image:$UML_BASE_IMAGE umid=$name"
       local netname
       local netindex=0
       for netname in "$@"; do
               args="$args eth${netindex}=daemon,,,/var/run/vde2/${netname}.ctl/ctl"
               netindex=$((netindex+1))
       done
       # ist eine Nachkonfiguration noetig?
       [ -e "$host_image" ] || run_post_configure=1
       send_screen_command screen -t "$name" "$UML_BIN" $args
       [ "$run_post_configure" = "0" ] || {
               # warte auf Ende des Boot-Vorgangs
               sleep 10
               configure_host_in_current_window "$name"
       }
}


case "${1:-help}" in
       start)
               run_screen_if_not_running
               run_host "host1" "virt-uplink" "virt-mesh1"
               run_host "host2" "virt-uplink" "virt-mesh1" "virt-mesh2"
               run_host "host3" "virt-uplink" "virt-mesh2" "virt-mesh3"
               run_host "host4" "virt-uplink" "virt-mesh3"
               ;;
       stop)
               poweroff_host "host1"
               poweroff_host "host2"
               poweroff_host "host3"
               poweroff_host "host4"
               send_screen_command quit
               ;;
       restart)
               "$0" stop
               "$0" start
               ;;
       connect)
               screen -x "$SCREEN_NAME"
               ;;
       clear-cow)
               clear_host_cow "host1"
               clear_host_cow "host2"
               clear_host_cow "host3"
               clear_host_cow "host4"
               ;;
       --help|help)
               echo "Syntax:  $(basename "$0")  SESSION  { start | stop | restart | connect | clear-cow | help }"
               echo
               ;;
       *)
               "$0" help >&2
               exit 1
               ;;
esac

Pfade sind natürlich anzupassen.

Hosts und Netzwerke konfigurieren

Die Konfiguration der Hosts und ihrer Netzwerke findet per Hand in der Datei bin/admin-uml statt. Dort werden (in der start-Sektion am Ende der Datei) die Hosts und ihre zugeordneten Netzwerke definiert.

Übliche Verwaltungsaktionen

Hosts starten
admin-uml start
Hosts stoppen
admin-uml stop
Hosts zurücksetzen (die Konfiguration verwerfen)
admin-uml clear-cow
Terminal-Sitzung mit Hosts eröffnen (via screen)
admin-uml connect
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Start
Opennet
Kommunikation
Karten
Werkzeuge