openSUSE 12.1 - systemd - problematisches Kernelmodul beim Herunterfahren entladen

Status
Für weitere Antworten geschlossen.

Rain_Maker

Administrator
Teammitglied
Nachdem ich -wie gewohnt- mein System per "Hot-Upgrade" (im laufenden Betrieb mit zypper dup) ohne größeren Ärger von 11.4 auf 12.1 gebracht hatte, war ich vor allem auf das neue Init-System "systemd" gespannt.

Das Ganze liess sich auch recht gut an, Start des Systems geht merkbar flotter von statten aber der große Ärger kam dann beim Herunterfahren, das System blieb einfach hängen und schaltete ums Verrecken nicht ab.

Nachdem ich diverse Wikieinträge (openSUSE/Fedora und Archlinux) zum Thema "wie debugge ich systemd-Probleme überhaupt?" durchforstet und einige Reboots mit diversen Versuchen hinter mich gebracht hatte, wurde -für mich erstaunlicherweise- nicht ein Dienst sondern der Kerneltreiber meiner WLAN-Karte (iwlagn/iwlwifi, je nach Kernelversion) als der potentielle Störenfried identifiziert.

Ein

Code:
/sbin/modprobe -r iwlagn #Distro-Kernel - 3.1
bzw.

Code:
/sbin/modprobe -r iwlwifi #Ab Kernel 3.3 oder 3.4
_vor_ dem Herunterfahren und alles war wieder gut.

Nur stellte sich jetzt die Frage, wie mache ich das automatisch unter Zuhilfenahme des neuen Init-Systems "systemd"?

Bei SysVinit würde man den Befehl in /etc/init.d/halt.local schreiben, aber das wird von systemd wohl ignoriert und vor allem wollte ich eine Lösung, die auch ohne "legacy"-Scripte auskommt.

Meine Erfolge mittels Suchmaschine waren eher übersichtlich, aber zumindest konnte ich für mich herausfinden, wie man ein eigenes ".service"-file für systemd schreibt, wo man es hinpacken sollte und wie man es aktiviert.

Langer Rede kurzer Sinn:

1) Datei /etc/systemd/system/iwlwifi-unload.service

Code:
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

[Unit]
Description=Unload iwlwifi Kernel Module on Shutdown
DefaultDependencies=no
Conflicts=
After=
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/sbin/modprobe -r iwlwifi

[Install]
WantedBy=shutdown.target
2) Aktivieren mittels

Code:
systemctl enable iwlwifi-unload.service
Ausgabe sieht dann so aus:

Code:
# systemctl enable iwlwifi-unload.service
ln -s '/etc/systemd/system/iwlwifi-unload.service' '/etc/systemd/system/shutdown.target.wants/iwlwifi-unload.service'
Und fertig ist die Laube, System fährt sauber herunter.

Wie man den Dateinamen und die Befehle abändern kann/sollte, falls eben ein anderes Modul vor dem/beim Herunterfahren entladen werden soll, dürfte dem geneigten und wachen Leser nach etwas Überlegen sicher einfallen.

Greetz,

RM

P.S:

Wer z.B. das Verhalten seiner "guten, alte" /etc/init.d/halt.local wiederhaben will, dem verbietet sicher niemand, den passenden Befehl bei "ExecStart" einzufügen.
 

Rain_Maker

Administrator
Teammitglied
AW: openSUSE 12.1 - systemd - problematisches Kernelmodul beim Herunterfahren entlade

Eigentlich nur fürs Protokoll, denn ich vermute, daß kaum jemand exakt das selbe Problem haben dürfte; hier der eigentliche Grund für das Problem beim Herunterfahren.

Anhand meiner Beobachtungen beim Versuch dem Problem auf die Spur zu kommen, war schon beim Verfassen meines ersten Beitrags recht klar, daß die Lösung "Modul entladen" den eigentlichen Auslöser nur umgeht und nicht beseitigt.

Der Shutdown blieb an der Stelle hängen, an welcher das WLAN-Interface gestoppt wird (vergleichbar mit einem "/sbin/ifdown wlan0" oder "/sbin/rcnetwork stop"), was aber im laufenden Betrieb problemlos ging.

Trotz allem werden aber bei dieser Aktion noch keine Kernelmodule entladen, also musste zumindest beim Herunterfahren irgendeine Aktion, die im laufenden Betrieb erwartungsgemäß funktioniert aber beim Herunterfahren -wahrscheinlich weil eine benötigte Ressource schon zuvor von systemd abgeknipst wurde- nicht ausgeführt werden kann, der eigentliche Auslöser sein.

Als Folge wartet systemd immer noch auf den sich gerade beendenden Prozess (der sich nicht beenden kann)und bleibt hängen.

Die recht brutale Methode vor dem Shutdown das Kernelmodul der WLAN-Karte aus dem System zu rupfen führt natürlich dazu, daß das Interface wlan0 - da nicht mehr vorhanden - auch nicht mehr gestoppt werden muss und so fällt das Problem nicht mehr auf.

Es war allerdings sehr unwahrscheinlich, daß der problematische Prozessaufruf in den Standardeinstellungen einer mit ifup konfigurierten WLAN-Karte drin steckte, denn sonst wäre das Netz wahrscheinlich voll von ähnlichen Problemberichten.

Da meine ifcfg-Dateien recht "custom" sind, lag es nahe dort mal etwas genauer hinzusehen und recht schnell waren die Hauptverdächtigen gefunden:

Code:
PRE_DOWN_SCRIPT='/etc/sysconfig/network/scripts/WIRELESS_PRE_DOWN.sh'
POST_DOWN_SCRIPT='/etc/sysconfig/network/scripts/WIRELESS_POST_DOWN.sh'
Ein nettes Feature von ifup unter openSUSE (andere Distros machen das ähnlich) ist die Möglichkeit zu bestimmten Zeitpunkten beim Verbindungsaufbau/-abbau eigene Skripte aufzurufen, und da lag der Hase im Pfeffer, denn nach Deaktivieren des Eintrages

Code:
POST_DOWN_SCRIPT='/etc/sysconfig/network/scripts/WIRELESS_POST_DOWN.sh'
ging das Herunterfahren ohne Probleme und ohne die brutale Methode "Weg mit dem Kerneltreiber vor dem Herunterfahren".

Das war natürlich noch keine wirkliche Lösung, das Script hatte ich ja nicht zum Spaß geschrieben, und vor allem wollte ich wissen, welcher der Befehle in meinem Script den Ärger verursacht, also schrittweise durchs Script gegangen und den Schuldigen gefunden.

Code:
/sbin/netconfig -f update
Der Sinn dieses Befehls lag darin, daß netconfig von Hand geänderte Dateien wie z.B. /etc/resolv.conf nicht ohne ausdrückliche Aufforderung ("-f") überschreibt und es so z.B. bei verschiedenen VPN-Lösungen dann zu Problemen kommt, wenn diese ihre vorher gemachten Änderungen an der resolv.conf nicht ordentlich rückgängig machen, nur dummerweise bleibt dieser Befehl beim Herunterfahren mit systemd hängen.

Nach Auskommentieren dieser Zeile fährt das System nun sauber herunter ohne den etwas harten Trick mit dem Kernelmodul aus dem ersten Beitrag. Ab sofort lasse ich den Befehl _vor_ dem Starten des WLAN-Interfaces ausführen (mittels der ifcfg-Variable "PRE_UP_SCRIPT="), was nach ein paar kurzen Tests genau so gut funktioniert und keinen Ärger mehr beim Herunterfahren machen kann.

Und die Moral von der Geschicht ......

1) Den ersten Beitrag lasse ich trotzdem stehen, denn es kann ja durchaus sein, daß jemand wirklich Probleme mit einem Kernelmodul hat und so eine kleine Anleitung findet, die man nur auf seine Bedürfnisse anpassen muss.

2) Ab sofort sollte man sich den Befehl "netconfig -f update" in POST_DOWN-Scripten für ifup verkneifen

Last but not Least

3) "Custom"-Konfigurationen sind nett, können dann aber auch zu "Custom"-Problemen führen und dann sollte man genau DA vielleicht auch zuerst suchen.


BTW:

Rain_Maker schrieb:
Wer z.B. das Verhalten seiner "guten, alten" /etc/init.d/halt.local wiederhaben will, dem verbietet sicher niemand, den passenden Befehl bei "ExecStart" einzufügen.
Auch das dürfte nicht nötig sein, denn

Code:
cat /lib/systemd/system/halt-local.service 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

[Unit]
Description=/etc/init.d/halt.local Compatibility
ConditionFileIsExecutable=/etc/init.d/halt.local
DefaultDependencies=no
After=shutdown.target
Before=final.target

[Service]
Type=oneshot
ExecStart=/etc/init.d/halt.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
daran wurde wohl schon gedacht.

Greetz,

RM
 
Status
Für weitere Antworten geschlossen.
Oben