Page 1 of 1

Initscript für Usermode Linux

Posted: Fri Oct 08, 2004 9:26 pm
by slick
Ich habe ein wenig mit Usermode-Linux experimentiert und möchte hier mein passendes Init-Script vorstellen. Die Grundversion war mal in einer älteren PC-Zeitschrift vorgestellt. Habs mir ein wenig modifiziert, speziell um Netzwerkeinrichtung. Wems hilft...

Code: Select all

#!/sbin/runscript

USER="uml_user"
UMID="uml_id"
UMLDIR="/mnt/umls/${UMID}"

#NICE="/usr/bin/nice -n 2"

DISKS="ubd0=${UMLDIR}/root_fs ubd1=${UMLDIR}/swap_fs"
CONSOLE="con0=null con=pts"
RAM="20M"

DEVICE="tap0"
LOCAL_IP="192.168.0.254"
REMOTE_IP="192.168.0.1"
NETMASK="255.255.255.0"
MAC="fe:fd:aa:bb:cc:dd"


start() {

        ebegin "Booting up usermode linux id: ${UMID} "

                /usr/bin/tunctl -u ${USER} -t ${DEVICE} > /dev/null
                /sbin/ifconfig ${DEVICE} mtu 1484 ${LOCAL_IP} netmask ${NETMASK} up
                ${NICE} /usr/bin/sudo -H -u ${USER} /usr/bin/screen -d -m ${UMLDIR}/linux umid=${UMID} mem=${RAM} ${DISKS} ${CONSOLE} eth0=tuntap,${DEVICE},${MAC}
        eend $?
}

stop() {
    ebegin "Shutting down usermode linux id: ${UMID} "
        /usr/bin/sudo -H -u ${USER} /usr/bin/uml_mconsole ${UMID} cad &> /dev/null
        einfon "Waiting ."
        while ps aux | grep "${UMLDIR}/linux umid=${UMID}" | grep -v grep &> /dev/null
        do
            cnt=`expr $cnt + 1`
            if [ $cnt -gt 60 ]
            then
                # > 120 seconds now.
                /usr/bin/tunctl -d ${DEVICE} &> /dev/null
                eend 1 "Failed."
                break
            fi
            sleep 2
            echo -n "."
        done
        /usr/bin/tunctl -d ${DEVICE} &> /dev/null
        echo -n "done." 
    eend 0
}
:!: english users can found the following comments at http://forums.gentoo.org/viewtopic-p-20 ... ml#2093976

$USER ist ein normaler User unter dessen Account die Maschine läuft um die nicht als root zu starten.

$NICE ist optional

$REMOTE_IP wird hier nicht benötigt, steht aber zu "Merkezwecken" gleich mit drin. Diese sollte dann in der UML-Maschine mit den üblichen Werkzeugen gesetzt werden.

$CONSOLE ist hier auf "null" gesetzt weil ich die Maschine nicht booten sehen will. Ich erreiche sie ja später mit dem Kommando:

Code: Select all

screen `sudo -H -u $USER /usr/bin/uml_mconsole $UMID config con1 | cut -d ":" -f 2`
Alle $MAC müssen meiner Erfahrung nach mit "fe:fd" beginnen um gesetzt zu werden.

Für das Stoppen wird hier der Befehl cad der uml_mconsole verwendet. Hierzu muss der Eintrag in der /etc/inittab (der virtuellen Maschine) entsprechend geändert werden.

Streiche: ca:12345:ctrlaltdel:/sbin/shutdown -r now
Setze: ca:12345:ctrlaltdel:/sbin/halt

Das Script läuft nicht korrekt wenn /tmp als noexec gemountet ist. Keine Ahnung warum... wer's weiß bitte melden.

Feedback welcome

Posted: Sat Oct 09, 2004 12:30 pm
by Fibbs
Supi danke,
genau sowas wollte ich auch bauen, war nur bisher zu faul.

Da sage einer, Faulheit zahle sich nicht aus ;-)

Gruß,
Fibbs

Posted: Sun Oct 10, 2004 1:40 am
by slick
So kann man's auch sehen.

Ich bin ja auch faul, deswegen habe ich mir das gebaut, muss ich weniger tippen ;-)

Merke: Ein guter Admin ist immer faul!

Posted: Sat Feb 12, 2005 6:08 pm
by TheSmallOne
-–- gelöscht -–-

Posted: Tue Feb 15, 2005 9:52 am
by slick
Hab es gleich mal in dem genannten Thread kreuzgelinkt ;-)

Posted: Thu Nov 03, 2005 8:32 am
by fangorn
Danke Leute,

Es ist immer wieder erstaunlich, wie viel Arbeit man sich spart, wenn man nicht dazu kommt, sich etwas selbst zu bauen :wink:

Posted: Mon Nov 07, 2005 8:34 am
by COiN3D
Hallo Slick,

eine Frage, was bringt dein Script im Endeffekt? :)

Grüße coin

Posted: Tue Nov 08, 2005 6:44 pm
by slick
COiN3D wrote:eine Frage, was bringt dein Script im Endeffekt? :)
Also damit kannst Du eine virtuelle Usermode-Linux Maschine über ein (das) Initscript starten, z.B. gleich automatisch per Runlevel. Das Initscript erstellt auch ein Netzdevice (tap*) auf der lokalen Maschine mit dem dann Deine virtuelle Maschine mit Deiner lokalen kommunizieren kann. Desweiteren kannst Du mit dem initscript die virtuelle Maschine wieder herunterfahren, ansonsten müßtest Du Dich ja erst auf der einloggen und dort "halt" aufrufen. Anschliessend wird auch das Netzwerkdevice wieder entfernt. Zumindest so in aller Kürze erklärt...

Ich denke mal das war auch eher eine nicht ganz ernst gemeinte Frage oder? Denn wenn Du nicht weißt was das Script tut und für was es gut ist solltest Du die Finger davon lassen ;-)

Posted: Thu Feb 09, 2006 9:59 pm
by slick
Update

1) Ist $BRIDGE gesetzt wird das Device dort eingebunden bzw. beim Beenden wieder entfernt, die angegebene bridge muß hierfür existieren
2) /etc/init.d/uml login startet den screen (siehe Erläuterung oben), dieser kann dann später mit screen -r <UMID> fortgesetzt werden
3) überarbeitetes stop()

Code: Select all

#!/sbin/runscript

USER="umluser"
UMID="umlid"
UMLDIR="/home/uml/umlid"

DISKS="ubd0=${UMLDIR}/root.fs ubd1=${UMLDIR}/swap.fs"
CONSOLE="con0=pts con=pts"
RAM="128M"

DEVICE="tap0"
#BRIDGE="br0"

LOCAL_IP="192.168.0.254"
REMOTE_IP="192.168.0.1"
NETMASK="255.255.255.0"

MAC="fe:fd:aa:bb:cc:dd"
# NICE="/usr/bin/nice -n 5"

opts="${opts} login"

start() {

        ebegin "Booting up usermode linux id: ${UMID} "

        # Rechte von /dev/net/tun beachten, 
        # evt. für die Gruppe der uml-User (hier: tun) Rechte setzen
        # chown root:tun /dev/net/tun
        # chmod 770 /dev/net/tun

        /usr/bin/tunctl -u ${USER} -t ${DEVICE} > /dev/null
        if [ "${BRIDGE}" == "" ] ; then
            /sbin/ifconfig ${DEVICE} mtu 1484 ${LOCAL_IP} netmask ${NETMASK} up
        else
            /sbin/ifconfig ${DEVICE} mtu 1484 up
            brctl addif ${BRIDGE} ${DEVICE}
        fi
        ${NICE} /usr/bin/sudo -H -u ${USER} ${UMLDIR}/linux mem=${RAM} umid=${UMID} ${DISKS} ${CONSOLE} eth0=tuntap,${DEVICE},${MAC} &> /dev/null &
        eend $?
}

stop() {
        ebegin "Shutting down usermode linux id: ${UMID} "
        /usr/bin/sudo -H -u ${USER} /usr/bin/uml_mconsole ${UMID} cad &> /dev/null
        einfon "Waiting ."
        while ps aux | grep "${UMLDIR}/linux mem=${RAM} umid=${UMID}" | grep -v grep &> /dev/null
        do
            cnt=`expr $cnt + 1`
            if [ $cnt -gt 60 ] ; then
                # Waited 120 seconds now. Fail.
                break
            fi
            sleep 2
            echo -n "."
        done
        if [ "${BRIDGE}" != "" ] ; then
            brctl delif ${BRIDGE} ${DEVICE}
        fi
        /usr/bin/tunctl -d ${DEVICE} &> /dev/null
        if [ $cnt -gt 60 ] ; then
            echo -n "Failed"
            eend 1
        else 
            echo -n "done."
            eend 0
        fi
}

login() {
        screen -S ${UMID} `sudo -H -u ${USER} uml_mconsole ${UMID} config con1 | cut -d ":" -f 2`
}