gentoo: System hängt beim Runterfahren nach Wechsel von shutdown auf reboot durch VDR-Init-Script

  • Hallo Leute!


    Die kurze Version:

    • Wenn mein Rechner beim Runterfahren wegen nvram-wakeup von Shutdown (runlevel 0) zu Reboot (runlevel 6) wechselt, dann bleibt der Rechner beim Beenden des Netzwerkdienstes (/etc/init.d/net.eth0 stop) hängen.
    • Früher ging's, aber seit einigen Wochen hab ich das Problem nachvollziehbar. Muss sich mit irgendeinem Update eingeschlichen haben.
    • Untersuchung hat ergeben: Hängt mit einem Deadlock in den Init-Scripts zusammen, wo Dateien in /var/lib/init.d/exclusive als Semaphore benutzt werden. Die ist vom VDR-Script, das den "shutdown -r now" ausführt noch blockiert.
    • So gesehen ist der Hänger nachvollziehbar, aber warum hat dann nicht jeder Gentoo VDR Nutzer das Problem? Oder gibt's noch jemanden?


    Die ausführliche Version:

    • Ich benutze mein Gentoo-System als Arbeitsplatz-Rechner und nebenbei als VDR. Rechner wird deshalb meist von Hand runtergefahren (nicht von VDR initiiert).
    • Für's Wakeup brauche ich nvram-wakeup mit Reboot. Nicht immer, wenn ein neuer Timer programmiert wurde, wechseln die VDR Shutdown-Scripts von runlevel 0 auf 6 (reboot), aber darum geht's momentan nicht. Folgendes passiert:
    • Wenn init in den Runlevel 0 (halt, shutdown) wechselt, führt es nacheinander die init-Scripts mit Parameter stop aus und beendet damit die Dienste.
    • Beim VDR-Initscript angekommen stellt der VDR ggf. die neue Wakeup-Zeit und ruft dann "shutdown -r now" auf (/usr/share/vdr/shutdown/shutdown-reboot.sh). Dadurch wird der laufende Wechsel in runlevel 0 verbogen in einen Wechsel in runlevel 6 (reboot).
    • init bringt eine Meldung ("entering runlevel 0" oder so ähnlich) und stoppt nun weiter die Dienste, die vorher noch nicht beendet wurden.
    • Das funktioniert bis net.eth0, dann bleibt der shutdown hängen, es hilft nur noch Stecker ziehen.
    • Ursache: net ist beim VDR-Initscript als dependency eingetragen ("needs net"), deshalb muss es eigentlich vor net.eth0 beendet werden.
    • Genaugenommen ist das VDR-Initscript noch nicht beendet, denn es wartet noch auf die Rückkehr vom shutdown-Befehl. Deshalb ist VDR auch nicht als beendet eingestuft und das VDR-init-Script wird nochmal aufgerufen.
    • Damit greift ein Mechanismus der (gentoo-)Initscripts, der bestimmte Abschnitte der Scripts durch critical sections schützt. Dabei werden Pipes (FIFOs) als Semaphore benutzt (pfiffige Idee, wäre ich nie drauf gekommen). Nachzulesen in /lib/rcscripts/sh/rc-services.sh in den Funktionen begin_service(), end_service(), wait_service()
    • Vom ursprünglichen Aufruf des VDR-Scripts ist noch die Semaphore-Pipe /var/lib/init.d/exclusive/vdr übrig, und damit bleibt das VDR-Initscript beim erneuten Aufruf auf immer und ewig in wait_service() hängen.


    Soweit hab ich's untersucht, und es ist klar, warum der Rechner hängen bleibt. Unklar ist mir aber, warum es anderen nicht genauso ergeht. Oder doch? Habt Ihr Abhilfe parat?


    Ach ja, meine Konfiguration:

    • gentoo-sources 2.6.22-r9
    • baselayout 1.12.9-r2 (enthält u. a. die rcscripts mit wait_service() etc.)
    • VDR 1.4.7-r6
    • gentoo-vdr-scripts 0.4.2
    • eine Handvoll Plugins, die für das Problem hier wohl nicht relevant sind


    Vielen Dank schon mal für Eure Hilfe!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!