User Mode Linux für Anfänger – Setup und erste VM

English Deutsch

Warum noch ein UML-Tutorial?

Dies ist nicht das erste Tutorial über UML – es gibt hunderte davon im Internet. Keines davon scheint jedoch meine Anforderungen zu erfüllen:

Was brauchst du?

UML bauen

Für erweiterte Informationen zum Bauen von UML siehe diesen großartigen Artikel. Beachte jedoch, dass der Artikel 32-Bit-UML kompiliert, was im Wesentlichen nicht

Eine Alternative zum Bauen von UML ist die Installation der Binärdatei von deinem System-Maintainer (z.B. sudo apt-get install user-mode-linux auf Ubuntu). Die Binärdateien sind jedoch etwas aufgebläht (6,4 Megabyte gegenüber 2,2 Megabyte in meinem Fall) und normalerweise überhaupt nicht aktuell.

Der User Mode Linux-Code wurde vor einigen Jahren in den Mainline-Linux-Kernel integriert, sodass wir nur den aktuellsten Kernel mit den richtigen Konfigurationsoptionen kompilieren müssen.

build_mini_kernel.sh
cat > mini.config << 'EOF' &&
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_BINFMT_ELF=y
CONFIG_HOSTFS=y
CONFIG_LBD=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_STDERR_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_EXT2_FS=y
CONFIG_MODULES=y
CONFIG_INOTIFY_USER=y
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_EXT3_FS=m
CONFIG_EXT4_FS=m
EOF
make ARCH=um allnoconfig KCONFIG_ALLCONFIG=mini.config
make ARCH=um -j4 all modules

Erste einfache UML-VM

Von nun an gehen wir davon aus, dass du dich derzeit in dem Verzeichnis befindest, in dem du deine erste VM erstellen möchtest. Momentan sollte dieses Verzeichnis nur die ausführbare Datei linux enthalten.

Das Einfachste, was man mit UML tun kann, ist die Linux-Installation des Hosts für erste Experimente zu verwenden. Führe dies als normaler Benutzer aus (nicht als Root!):

run_uml_basic.sh
./linux rootfstype=hostfs rw init=/bin/bash quiet

Du solltest eine Kommandozeile erhalten. UML ist standardmäßig ziemlich gesprächig (selbst mit der Kernel-Option quiet), aber das Wesentliche ist, dass der Kernel keine echte Initialisierung verwendet, sondern einfach /bin/bash startet. Du könntest jetzt cd und ls auf deinem System machen, aber das wäre ziemlich sinnlos, also drücke Ctrl+D um UML zu beenden.

Beim Beenden auf diese Weise schlägt UML fehl und zeigt einen Kernel-Fehler. Das ist nicht abnormal, da wir die VM nicht ordnungsgemäß mit einem echten init usw. gestartet haben. Einige Shells (z.B. zsh) zerstören die Formatierung nach dem Beenden von UML; verwende den Befehl reset, um das zu beheben.

Eine VM mit debootstrap einrichten

Jetzt können wir eine ordnungsgemäße minimale Installation einrichten. Dieses Beispiel verwendet Debian Wheezy. Das Ändern des Distributionsnamens und des Mirrors sollte ausreichen, wenn du eine andere Distribution verwenden möchtest.

  1. Stelle sicher, dass debootstrap installiert ist (sudo apt-get install debootstrap auf Ubuntu)
  2. Führe diesen Befehl als Root aus (debootstrap läuft nicht als Nicht-Root), um ein minimales Debian Wheezy in das Verzeichnis wheezy-uml zu installieren:
debootstrap_wheezy.sh
debootstrap --arch amd64 --variant minbase wheezy wheezy-uml http://mirror.switch.ch/ftp/mirror/debian
  1. Es wird einige Zeit dauern. Hol dir einen Kaffee, um nicht gelangweilt zu werden.
  2. Der Dateibesitzer des gesamten wheezy-uml-Baums ist Root, aber UML sollte Schreibberechtigungen haben, wenn es als Nicht-Root ausgeführt wird. Behebe das mit diesem Befehl:
chown_wheezy.sh
chown -R $USER:$USER wheezy-uml
  1. Starte die UML-VM
run_wheezy_uml.sh
./linux rootfstype=hostfs rootflags=$(pwd)/wheezy-uml init=/bin/bash rw mem=128M

Wenn du dir jetzt den Dateisystem-Baum in UML anschaust, kannst du sehen, dass es nicht dein Host-Dateisystem ist. Außerdem kannst du Dateien überall bearbeiten.

Die Nicht-Root-hostfs-Methode hat jedoch einige Berechtigungsprobleme – das Dateisystem listet deine Benutzer- und Gruppen-ID (normalerweise 1000 für den ersten erstellten Benutzer) als Besitzer des wheezy-uml-Baums auf.

Mehr UML?

Ursprünglich war dies als mehrteilige Serie geplant. Seitdem ich dies geschrieben habe, sind jedoch Werkzeuge wie Docker aufgetaucht, die es größtenteils unnötig machen, alles von Grund auf zu bauen. LXC (das von Docker verwendet wird) scheint ebenfalls signifikante Vorteile zu haben. Da es für meine Anwendungsfälle keinen offensichtlichen Vorteil gegenüber anderen gibt, habe ich derzeit keine Pläne, die Serie fortzusetzen.


Check out similar posts by category: Container, Linux