# Initscript für Usermode Linux

## 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...

```
#!/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

}
```

 :Exclamation:  english users can found the following comments at https://forums.gentoo.org/viewtopic-p-2093976.html#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:

```
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 welcomeLast edited by slick on Wed Feb 16, 2005 9:47 am; edited 13 times in total

----------

## Fibbs

Supi danke,

genau sowas wollte ich auch bauen, war nur bisher zu faul.

Da sage einer, Faulheit zahle sich nicht aus  :Wink: 

Gruß,

Fibbs

----------

## slick

So kann man's auch sehen. 

Ich bin ja auch faul, deswegen habe ich mir das gebaut, muss ich weniger tippen  :Wink: 

Merke: Ein guter Admin ist immer faul!

----------

## TheSmallOne

-–- gelöscht -–-Last edited by TheSmallOne on Sat Dec 22, 2012 12:20 pm; edited 1 time in total

----------

## slick

Hab es gleich mal in dem genannten Thread kreuzgelinkt  :Wink: 

----------

## 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: 

----------

## COiN3D

Hallo Slick,

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

Grüße coin

----------

## 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  :Wink: 

----------

## 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()

```
#!/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`

}
```

----------

