[Eisfair] rpc.mountd 100% CPU

Thomas Bork tom at eisfair.org
So Dez 18 17:51:27 CET 2016


Am 18.12.2016 um 14:49 schrieb Thomas Zweifel:

> Ganz klar ist mir die "Panne" auch nicht, aber ich vermute, dass der
> init-prozess ohne Ein-/Ausgabemöglichkeit die Daemons teilweise nicht
> richtig an den Start bringen kann... :-(
> @Tom
> Liesse sich da eventuell ein Test in die Initrd mit einbauen, der
> gegebenenfalls fehlende Konsolen-Devices neu erstellt?

Ganz klar ist mir das nicht:

In der initramfs spielt udev keine Rolle. Hier wird mit mdev der busybox 
gearbeitet. Das Verzeichnis /dev in der initramfs ist komplett leer. 
Nach dem Start von mdev wird es mit den nötigen Devicenodes gefüllt:

if [ -z "$DEVSTATIC" ]
then
     # Mount tmpfs on /dev and set up /dev/pts
     echo "Mounting tmpfs on /dev ..."
     $MOUNT -t tmpfs dev /dev
     # Run mdev and populate /dev with device nodes
     echo "$MDEV" > /proc/sys/kernel/hotplug
     $MDEV -s
     # give mdev 1 second
     /bin/sleep 1
fi

Wenn dann alle weiteren Vorbereitungen abgeschlossen sind und das 
Rootdevice readonly gemountet werden kann sowie ein gültiges init 
gefunden wird, gibt die initramfs die Kontrolle an das System ab:

# Mount the root partition
# Ensure that the directory we mount exist
SUCCESS=0
[ -d "$NEWROOT" ] || $MKDIR "$NEWROOT"
while [ $SUCCESS -ne 1 ]
do
     ROOTDEV="$($CAT /rootdev)"
     if ! $MOUNT -o ro "$ROOTDEV" "$NEWROOT"
     then
         echo ""
         echo "Cannot mount root $ROOTDEV read only!"
         shell
     else
         SUCCESS=1
     fi
done

if [ ! -e "$NEWROOT/$INIT" ]
then
     echo ""
     echo "$ROOTDEV successfully mounted but no $INIT found!"
     shell
fi

if [ -z "$DEVSTATIC" ]
then
     # Debug /dev, if dynamic
     #$MOUNT -o remount,rw "$ROOTDEV" "$NEWROOT"
     #ls -lR /dev >"$NEWROOT"/dev.txt
     #$MOUNT -o remount,ro "$ROOTDEV" "$NEWROOT"
     # Reset kernel hotplugging to /sbin/hotplug
     echo "Resetting kernel hotplugging to /sbin/hotplug ..."
     echo "/sbin/hotplug" > /proc/sys/kernel/hotplug
fi

Dabei werden die Mounts (darunter auch von /dev) ausgehängt und die 
Kontrolle an das init des Rootdevices abgegeben:

# Umount /sys
echo "Umounting /sys ..."
$UMOUNT /sys

# Umount /dev/pts
echo "Umounting /dev/pts ..."
$UMOUNT /dev/pts

if [ -z "$DEVSTATIC" ]
then
     # Umount /dev tree
     echo "Umounting /dev ..."
     $UMOUNT /dev
fi

# Umount /proc
echo "Umounting /proc ..."
$UMOUNT /proc

#sleep 25

# Change to the new root partition and execute /sbin/init
echo "Executing switch_root and spawning init ..."
if ! exec $SWITCH "$NEWROOT" "$INIT" $INIT_ARGS
then
     echo ""
     echo "Cannot execute switch_root!"
     $MOUNT -t proc proc /proc
     exec $SHELL
fi

Was mir nicht klar ist:

1.
Wenn das System auf ein Raid umgezogen wird, wird u.a. auch /dev des 
laufenden Systems kopiert. Es sollte also nicht leer sein können.

2.
Per init des Systems werden Dienste erst gestartet, nachdem 
/etc/rc2.d/S03udev durch ist - alle notwendigen Devices sollten zu dem 
Zeitpunkt doch schon da sein.


Um in der initramfs sicher zu stellen, dass die notwendigen Devices 
existieren, müsste man das Rootdevice schreibbar mounten und fehlende 
Devices nach /dev des Systems kopieren. Nur welche fehlen da genau und 
warum (siehe oben)?

-- 
der tom
[eisfair-team]


Mehr Informationen über die Mailingliste Eisfair