Bootverzögerung durch bestimmte Mounts in fstab

Dalai

Grand Admiral Special
Mitglied seit
14.06.2004
Beiträge
7.420
Renomée
262
Standort
Meiningen, Thüringen
Hallo Linux-Freaks und solche, die es werden wollen ;D.

gestern bin ich über ein für mich sehr merkwürdiges Verhalten gestolpert. Folgende Situation
  • Debian Squeeze
  • Paket smbfs installiert
  • Netzwerkfreigabe soll beim Booten über die fstab gemountet werden, der Eintrag am Ende der fstab sieht dann so aus:
    Code:
    //192.168.0.xx/Munin$/graphs /var/www/munin cifs credentials=/root/.smbcreds,noexec,dir_mode=0770,file_mode=0660,uid=munin 0 0
    wobei xx natürlich einer existierenden IP entspricht
Problem: Ich bekomme beim Booten die Meldung
Code:
Waiting for /var/www/munin...
die über 90 Sekunden stehenbleibt, bis das System dann ein "failed" dahinter vermerkt und weiterbootet. Interessant dabei ist, dass die Freigabe danach durchaus gemountet ist!

Und jetzt kommt's: verwende ich ein Mountziel außerhalb von /var - also z.B. /mnt oder /media/munin, geht das Mounten komplett ohne Verzögerung *kopfkratz! Bei Debian Lenny hat das noch einwandfrei funktioniert, in /var/www/munin zu mounten und ich bin der Meinung, dass das Mountziel eigentlich völlig egal sein sollte, solange es verfügbar ist (d.h. nicht von anderen Mounts abhängt).

Selbst ein dmesg | tail gibt nichts besonderes aus, an das ich mich halten könnte:
Code:
root@debian:/home/dalai# dmesg | tail
[    3.476282] input: ImPS/2 Generic Wheel Mouse as /devices/platform/i8042/serio1/input/input3
[    3.493645] loop: module loaded
[    4.140003] eth0: link up
[    9.384997] Registering the dns_resolver key type
[    9.385069] Slow work thread pool: Starting up
[    9.385257] Slow work thread pool: Ready
[    9.385443] CIFS: Unknown mount option _netdev
[   14.982281] eth0: no IPv6 routers present
Hier ist zwar eine Verzögerung durch die Suche nach IPv6-Routern zu sehen, aber das sind bei weitem keine 90 Sekunden.

Noch ein Hinweis: Munin ist nicht installiert, nur ein munin-node. Das Verzeichnis /var/www/munin habe ich manuell angelegt. Das heißt, es kommt sich da auch nichts in die Quere.

Kann mir das jemand erklären?

MfG Dalai
 
Ist /var bei Dir auf einer extra Partition, oder mit besonderem Dateisystem?
Nein und nein.
Code:
dalai@debian:~$ sudo fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a29e9

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        1045     8386560   83  Linux


dalai@debian:~$ df -Th
Dateisystem   Typ     Size  Used Avail Use% Eingehängt auf
/dev/sda1     ext3    7,9G  801M  6,7G  11% /
tmpfs        tmpfs    252M     0  252M   0% /lib/init/rw
udev         tmpfs    248M   84K  247M   1% /dev
tmpfs        tmpfs    252M     0  252M   0% /dev/shm


dalai@debian:~$ free
             total       used       free     shared    buffers     cached
Mem:        514644     104116     410528          0       5944      72928
-/+ buffers/cache:      25244     489400
Swap:            0          0          0
Ja, richtig, es gibt keine Swap, aber das braucht die Maschine auch nicht, für das, was sie tut. Und dass es sich um eine VM handelt, sollte ja auch egal sein. Schließlich ist das Problem behebbar, wenn man ein anderes Mountziel verwendet (was für mich momentan völlig gaga wirkt).

MfG Dalai
.
EDIT :
.

Ursache des Problems gefunden: /bin/mountpoint gibt Müll zurück. Wie ich darauf kam? Nun, die Geschichte wird etwas länger ;D.

Ich durchsuchte in /etc alle Dateien nach "waiting for" und fand unter anderem /etc/rcS.d/S14mountnfs.sh. Dieses Skript wird offensichtlich beim Booten automatisch ausgeführt. Der Sinn des Skripts ist ja eindeutig:
Code:
# Description:       Network file systems are mounted by
#                    /etc/network/if-up.d/mountnfs in the background
#                    when interfaces are brought up; this script waits
#                    for them to be mounted before carrying on.
und darin findet sich diese Funktion:
Code:
do_wait_async_mount() {
        [ -f /etc/fstab ] || return
        #
        # Read through fstab line by line. If it is NFS, set the flag
        # for mounting NFS file systems. If any NFS partition is found
        # then wait around for it.
        #

        exec 9<&0 </etc/fstab

        waitnfs=
        while read DEV MTPT FSTYPE OPTS REST
        do
                case "$DEV" in
                  ""|\#*)
                        continue
                        ;;
                esac
                case "$OPTS" in
                  noauto|*,noauto|noauto,*|*,noauto,*)
                        continue
                        ;;
                esac
                case "$FSTYPE" in
                  nfs|nfs4|smbfs|cifs|coda|ncp|ncpfs|ocfs2|gfs)
                        ;;
                  *)
                        continue
                        ;;
                esac
                case "$MTPT" in
                  /usr/local|/usr/local/*)
                        ;;
                  /usr|/usr/*)
                        waitnfs="$waitnfs $MTPT"
                        ;;
                  /var|/var/*)
                        waitnfs="$waitnfs $MTPT"
                        ;;
                esac
        done

        exec 0<&9 9<&-

        # Wait for each path, the timeout is for all of them as that's
        # really the maximum time we have to wait anyway
        [B]TIMEOUT=900[/B]
        for mountpt in $waitnfs; do
                log_action_begin_msg "Waiting for $mountpt"

                [B]while ! mountpoint -q $mountpt; do[/B]
                        sleep 0.1

                        TIMEOUT=$(( $TIMEOUT - 1 ))
                        if [ $TIMEOUT -le 0 ]; then
                                log_action_end_msg 1
                                break
                        fi
                done

                if [ $TIMEOUT -gt 0 ]; then
                        log_action_end_msg 0
                fi
        done
}
Ich hab mal die wichtigen Zeilen fett markiert. Da haben wir zum einen die 90 Sekunden Wartezeit und zum anderen den wichtigen Aufruf von /bin/mountpoint.

Warum ist letzteres nun ein Problem? Deswegen:
Code:
dalai@debian:/etc/rcS.d$ mountpoint /
/ is a mountpoint
dalai@debian:/etc/rcS.d$ mountpoint /home
/home is not a mountpoint
dalai@debian:/etc/rcS.d$ mountpoint /var/www/munin
mountpoint: /var/www/munin: Value too large for defined data type
Und letzteres gibt natürlich auch Errorlevel 1 zurück und damit wartet die Schleife bis zum Timeout und das war's dann.

Debian Lennys /bin/mountpoint gibt übrigens korrekterweise ein "/var/www/munin is a mountpoint" zurück, weswegen es dort auch sauber funktioniert.

Ursache gefunden :D, Problem trotzdem nicht gelöst :-/.
Hat jemand Vorschläge? Ich ahne schon, dass ich wieder einen Bugreport verfassen darf... der x-te in den vergangenen paar Wochen.

MfG Dalai
 
Zuletzt bearbeitet:
Zurück
Oben Unten