[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