User Mode Linux für Anfänger – Setup und erste VM
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:
- Alle meine Computer und Server (= UML-Hosts) laufen auf x86_64, nicht auf i386.
- Eine aktuelle (selbstkompilierte) UML-Version verwenden, um die neuesten Features nutzen zu können
- Ein einfacher Satz von Skripten. Führe sie in der richtigen Reihenfolge aus, um alles zum Laufen zu bringen – keine Konfigurationsdatei-Bearbeitung usw.
- Root sollte nicht erforderlich sein (abgesehen von debootstrap) —> Keine /mnt-Mounts oder ähnliches
- Kein nerviges Dateisystem-Image, das Platz auf dem Host frisst und Ressourcen auf der UML-VM begrenzt. HostFS eliminiert all diese Nachteile – wenn du den VM-Speicherplatz begrenzen möchtest, verwende Quotas.
- Kein globaler Zustand (z.B. etwas in /mnt mounten), man sollte eine weitere VM parallel zum Laufen bringen können, indem man die Setup-Skripte in einem anderen Verzeichnis ausführt.
- Schritt-für-Schritt-Anleitungen, so automatisiert und portabel wie möglich, aber dennoch für Menschen lesbar.
- Kein umfangreicher Tech-Talk. Es gibt Referenzdokumentationen für Tech-Talk. Ein Tutorial sollte dir sagen, wie man es zum Laufen bringt, nicht warum es funktioniert.
Was brauchst du?
- Einen aktuellen Linux-Computer – ich habe Ubuntu 13.04 beim Testen verwendet (Paketinstallationsanweisungen werden nur für Ubuntu/Debian aufgelistet), aber wenn du deine Distribution einigermaßen kennst, ist es nicht schwer, es überall zum Laufen zu bringen.
- Wenn du keine zuverlässigen Informationen über die hier referenzierten Werkzeuge finden kannst, verstehst du dein System wahrscheinlich nicht gut genug, um UML überhaupt zu verwenden.
- Viel Zeit
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.
- Lade den aktuellsten Kernel-Quellcode von http://kernel.org herunter und entpacke ihn. Beim Schreiben dieses Artikels war Linux 3.10.0 die aktuellste Version.
- Führe im Kernel-Quellverzeichnis (z.B. linux-3.10) diesen Befehlssatz aus, um eine minimale Konfiguration zu erstellen (siehe diesen Artikel für Details) und den Build zu starten:
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- Nach Abschluss des Builds (normalerweise ca. 45 Sekunden) enthält die Datei linux im Kernel-Quellverzeichnis (z.B. linux-3.10) die UML-ausführbare Datei. Platziere sie in dem Verzeichnis, in dem du deine erste VM erstellen möchtest (z.B. ~/uml)
- Diese Kernel-Konfiguration unterstützt EXT2 nativ, aber andere Dateisysteme und/oder Features können dynamisch geladen werden.
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!):
./linux rootfstype=hostfs rw init=/bin/bash quietDu 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.
- Stelle sicher, dass debootstrap installiert ist (sudo apt-get install debootstrap auf Ubuntu)
- 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 --arch amd64 --variant minbase wheezy wheezy-uml http://mirror.switch.ch/ftp/mirror/debian- Es wird einige Zeit dauern. Hol dir einen Kaffee, um nicht gelangweilt zu werden.
- 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 -R $USER:$USER wheezy-uml- Starte die UML-VM
./linux rootfstype=hostfs rootflags=$(pwd)/wheezy-uml init=/bin/bash rw mem=128MWenn 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.