[HOWTO] Setup einer virtuellen Maschine (Der Rechner im Rechner) / User Mode Linux (UML)

  • User Mode Linux


    ist ein virtuelles Linux, das als zweites System in einem Linux läuft. Das eröffnet viele Möglichkeiten:
    mal mit einem anderen Linux herumspielen, Sandbox oder Jail - Prozesse die unter UML laufen haben keinen Zugriff auf das Hostsystem, ein Netzwerk mit nur einem Computer simulieren...


    In meinem Fall benötigte ich einen zusätzlichen Rechner, der zum booten von Diskless-Clienten mit älteren PXE-Netzwerkkarten den Dienst tftpd mit eingeschänkten Netzwerkdiensten zur Verfügung stellt. Für diese kleine Aufgabe einen eigenen Rechner bereitzustellen, das wäre reine Hardware-Verschwendung und unnötiger Stromverbrauch. So kam mir die Idee, einen Rechner im Rechner aufzusetzen.
    Erste Erfahrungen mit User Mode Linux (UML) bekam ich durch das c't-Debian-Server Projekt. In diesem Projekt wird eine Firewall (IPCOP) die sonst nur auf einen eigenen Rechner läuft, auf einem Server in einer virtuellen Maschine bereitgestellt.


    Dieses HOWTO beschreibt Schritt für Schritt, wie man unter Debian ein User Mode Linux (UML) installiert.


    Veraussetzung ist ein lauffähiges Debian-System mit ca 600 MB freien Festpattenspeicher. Um schnell zum Erfolg (Zeitaufwand ca 1 Stunde) zu kommen, benutze ich die offiziellen Paketquellen von Debian und die vom Heise-Verlag bereitgestellten Paketquellen für den c't-Debian-Server. Heise hat einem so viel Arbeit erspart, man muß keinen Kernel kompilieren und keine Skripte schreiben.


    Vorbereitung des Wirtsystem


    Damit alle nötigen Pakete nachinstalliert werden können, wird unter /etc/apt die sources.list geändert.

    Zitat


    Code
    apt-get update

    ausführen,damit die Paketquellen wirksam sind.


    Wer die ct-spezial Netzwerke CD besitzt kann diese alternativ für den online-download benutzen und sollte sie in die sources.list eintragen.


    Damit es später keine Probleme mit dem UML gibt, benötigt das Wirtsystem einen Kernel mit skas-Patch (separiert die Adressräume von UML-Prozessen und bringt Performance-Verbesserungen). Diese Kernel´s gibt es fertig kompiliert und sind auch VDR tauglich.

    Code
    apt-get install kernel-image-2.4.31-ct-1


    Jetzt sollte man das System mit dem neuen Kernel starten.



    Einrichten einer UML-Umgebung


    Als nächstes werden alle Pakete die für eine UML Umgebung notwendig sind installiert

    Code
    apt-get install bridge-utils ctumluties


    Als Erstes erstellt man die virtuellen Festplatten in Form einer Datei mit dem passenden ext3-Image. Es wird ein minimales, lauffähiges Debian zusammen gestellt. Dieser Vorgang kann je nach Rechnergeschwindigkeit einen Moment dauern.

    Code
    ct_mk_uml_image --size 256 --dist stable


    Es wird eine 256 MB große Image-Datei im Verzeichnis /var/lib/uml/.images erstellt.


    Danach wird der Befehl

    Code
    ct_mk_uml_instance --name virtuellserver --ip 192.168.1.14 --dist stable --bridge br0

    eingegeben.


    Jetzt wird die eigentliche UML Infrastruktur erzeugt. Das Skript legt einen User namens virtuellserver (frei wählbar) an und erstellt sein Home-Verzeichnis /var/lib/uml/virtuellserver. Dies enthält alles, was für eine UML Umgebung benötigt wird. Die UML-Instanz erhält die eigene IP Adresse 192.168.1.14 (frei wählbar, nicht die des Wirtsystem) und wird an die bridge br0 gebunden. So ist der virtuelle Rechner mit eigene IP Adresse über die gleiche pysikalische Netzwerkkarte des Wirtsystem erreichbar.


    Um weitere Änderungen vorzunehmen, kann man das Image mit

    Code
    mount /var/lib/uml/virtuellserver root.img /mnt/ -o loop

    ins Dateisystem einhängen.


    Mit

    Code
    chroot /mnt

    wechselt man in die UML-Umbebung.


    Die UML-Umbebung kann man mit

    Code
    exit

    wieder verlassen.
    Danach sollte man auch das Image mit

    Code
    umount /mnt

    wieder freigeben.


    Jetzt muß noch das Netzwerk des Wirtsystem für die UML-Umbebung angepasst werden. Die Datei /etc/network/interfaces wird nun so umgeschrieben. (Eine Sicherung der alten Datei sollte man vornehmen, um gegebenenfalls den alten Zustand des Netzwerks wieder herstellen zu können.)

    Zusätzlich noch die Datei /etc/network/run/ifstate ändern:

    Code
    lo=lo
    tap0=tap0
    eth0=eth0
    br0=br0


    Nun ist alles eingerichtet und nach einem Neustart der Rechners können wir den virtuellen Rechner starten.


    Mit

    Code
    /var/lib/uml/virtuellserver/startit.sh

    wird er gestartet und mit

    Code
    /var/lib/uml/virtuellserver/stopit.sh

    wird der virtuelle Rechner heruntergefahren.
    Um Boot-Meldungen auf der aktuellen Konsole zu sehen kann man die UML mit

    Code
    /var/lib/uml/virtuellserver/startit.sh --debug

    starten.


    Um zu überprüfen ob alle Netzwerkeinstellungen richtig sind, sollte man versuchen den gestarteten virtuellen Rechner übers Netzwerk mit Putty oder ssh zu ereichen. (In diesem Beispiel wird dazu die IP 192.168.1.14 verwendet.)


    Um einen UML Login von der Konsole des Wirtsystem zu erhalten, muß man noch ein paar Vorbereitungen machen.

    Code
    apt-get install screen


    Wenn die UML nicht gestartet ist, in das Verzeichnis /var/lib/uml/virtuellserver wechseln

    Code
    mount devpts -t devpts dev/pts
    mount root.img /mnt/ -o loop


    Dann /mnt/etc/inittab mit einem Editor öffnen und den Eintrag

    Zitat

    1:2345:respawn:/sbin/getty 38400 tty1

    auskommentieren.
    Nach dem Start der UML zeigt ein

    Code
    ls -al /dev/pts

    den Device-Eintrag, der dem UML-User virtuellserver gehört.
    Mit einem Befehl wie

    Code
    screen /dev/pts/1

    erhält man einen Login-Prompt.



    Bei der Erstellung dieses HOWTO´s waren die in der c't veröffendlichten Artikel zum c't-Debian-Server sehr hilfreich.
    c't-Debian-Server - Artikelübersicht
    Weitere ausfühliche Infos auf der Homepage des User Mode Linux (UML) Projekts


    Gruß MAK


    VDR - VDR mit XBMC - MythTV

    3 Mal editiert, zuletzt von MAK ()

  • Hallo,
    was jetzt noch fehlt wäre ein Start und Stop Skript, welches die UML automatisch nach dem Start des Wirtsystem startet und vor dem Herunterfahern des Wirtsystem die UML sauber beendet.
    Leider habe ich keine Ahnung, wie man das macht.
    Würde mich über Hilfe freuen.
    Gruß MAK

  • Zitat

    Original von MAK
    was jetzt noch fehlt wäre ein Start und Stop Skript, welches die UML


    DAS ist kein Problem :)


    Da Du ja alle Befehle auf der Kommandozeile bereits kennst, schreibst Du die einfach in ein Skript rein.


    Das Skript erweiterst Du so, daß es die Parameter "start" und "stop" auswertet und abhängig davon UML halt startet oder stopt.


    Das ist der große Schritt.


    Dann schaust Du Dir mal das Verzeichnis /etc/init.d an und kopierst Dein Skript dort hin. In diesem Dir gibt es weitere Dirs mit rc1.d rc2.d rc3. etc.
    Runlevel sagt Dir etwas? Richtig, die Zahlen passen dazu.
    Jetzt ist der Rest einfach. Alles, was in Runlevel 2 gestartet (bzw. beim Verlassen gestoppt) werden soll, steht dort drinnen.
    Dort findest Du dann eben symbolische Links wie z.B. rc2.d/S09samba, als Link auf /etc/init.d/samba
    Heißt: Samba wird in Runlevel 2 an 9. Stelle gestartet. Ein rc2.d/K05samba ist ein Link auf das gleiche Skript /etc/init.d/samba, hat nur ein "K" davor und wird deshalb mit dem Parameter "stop" aufgerufen. Und zwar an 5. Stelle.


    Du suchst Dir jetzt eine Stelle aus, an der Dein UML hinpaßt (z.B. sollte Netzwerk gestartet sein) und erstellst einfach die passenden Links dazu.


    System erkannt?

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Original von knebb
    Das Skript erweiterst Du so, daß es die Parameter "start" und "stop" auswertet und abhängig davon UML halt startet oder stopt.


    Das einfachste ist, sich aus den vorhandenen Skripten eines auszusuchen und
    entsprechend anzupassen. Hier eine minimale Version:


    Hier findet sich (bei Debian) eine etwas ausführlichere Variante:

    Code
    /etc/init.d/skeleton
  • Hallo,
    ich habe mal jetzt ein start-stop Skript gebastelt. Dieses ist nicht auf meinem Mist gewachsen, ich habe es einfach frei nach dem Motto: "Denn Sie wissen nicht was Sie da tun" vom c't-Debian-Server abgekupfert. Dieses Skript startete ursprünglicht beim c't-Debian-Server die IPCOP Firewall als virtuelle Maschine, ich habe es nur angepasst und es funktioniert auch. Was das Skript genau macht, kann ich also nicht sagen. Sollte etwas nicht richtig sein oder bedenklich sein, bitte melden.


    Dieses Skipt nach /etc/init.d/virtuellserver kopieren und Symbolische Links nach /etc/rc?.d setzen.

    Code
    ln -s ../init.d/virtuellserver /etc/rc0.d/K15virtuell_server
    ln -s ../init.d/virtuellserver /etc/rc1.d/K15virtuellserver
    ln -s ../init.d/virtuellserver /etc/rc2.d/S15virtuellserver
    ln -s ../init.d/virtuellserver /etc/rc3.d/S15virtuellserver
    ln -s ../init.d/virtuellserver /etc/rc4.d/S15virtuellserver
    ln -s ../init.d/virtuellserver /etc/rc5.d/S15virtuellserver
    ln -s ../init.d/virtuellserver /etc/rc6.d/K15virtuellserver


    jetzt noch unter /var/lib/uml/virtuellserver das Verzeichnis /run anlegen undin diesem Verzeichnis die Datei virtuellserver.pid mit diesem Inhalt anlegen

    Code
    1012


    Wenn man jetzt den Rechner neu startet, wird die UML automatisch mitgestartet. Beim Herunterfahren wird die UML automatisch vorher heruntergefahren.
    Gruß MAK


    VDR - VDR mit XBMC - MythTV

    2 Mal editiert, zuletzt von MAK ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!