GDM crasht im Endlosloop

Heute morgen der Schreck des Tages: Ein Login in Cinnamon war nicht möglich.

Der Versuch endete einem erneuten Loginscreen. Auch Gnome war nicht zur Kooperation zu bewegen. Nachdem ich die Xorg Logs gelesen hatte, stach mir die Datei „gnome-settings-daemon.desktop“ ins Auge, weil diese nicht „formal korrekt parsebar“ war, also der Inhalt einen Fehler hatte. Nachdem diese Desktopdatei aus /etc/xdg/autostart entfernt wurde, startete zumindest Cinnamon wieder und ich dachte, daß das Problem damit behoben sein.

Wie man sich irren kann..

Nach einem kleinen Ausflug wurde der Rechner abends neugestartet und hier kam der Schock: GDM restartete in einem Endlosloop alle paar Sekunden neu!

Nach einigen Reinstalls von GLIB -> mesa -> lightdm und glib2, die alle ohne Wirkung waren, fiel meine Aufmerksamkeit auf:

Jun  3 22:38:52 eve gnome-session: gnome-session-binary[15330]: WARNING: Unable to find required component ‚gnome-settings-daemon‘
Jun  3 22:38:52 eve gnome-session-binary[15330]: WARNING: Unable to find required component ‚gnome-settings-daemon‘
Jun  3 22:38:52 eve gnome-session-binary: Entering running state
Jun  3 22:38:52 eve gnome-session: Unable to init server: Could not connect: Connection refused
Jun  3 22:38:52 eve kernel: gnome-session-f[15337]: segfault at 0 ip 00007f94983fa4b9 sp 00007fff41c22bf0 error 4 in libgtk-3.so.0.2200.15[7f949811b000+6f9000]
Jun  3 22:38:52 eve abrt-hook-ccpp: Process 15337 (gnome-session-failed) of user 42 killed by SIGSEGV – ignoring (repeated crash)
Jun  3 22:38:54 eve dbus-daemon[15374]: [session uid=42 pid=15374] Activating via systemd: service name=’org.a11y.Bus‘ unit=’at-spi-dbus-bus.service‘ requested by ‚:1.2‘ (uid=42 pid=15380 comm=“/usr/libexec/gnome-session-check-accelerated “ label=“system_u:system_r:xdm_t:s0-s0:c0.c1023″)
Jun  3 22:44:23 eve gdm: GLib: g_hash_table_find: assertion ‚version == hash_table->version‘ failed

„Unable to find required component ‚gnome-settings-daemon'“ und das, obwohl ich die Autostartdatei wieder zurück geschrieben hatte. Hmm.. zu welchem Paket gehört die doch gleich ? Ah.. gnome-settings-daemon, klar oder ? 🙂 Während  GDM noch im Endlessloop war, reinstallierte ich dieses Paket und oh Wunder… plötzlich war alles wieder normal. Wie konnte das passieren ?  Tja, keine Ahnung .. Die Datei wurde nicht aktualisiert. Sie muß im laufenden Betrieb eine Macke abgekommen haben. Ein Hoch auf „dnf reinstall“ 😀

Beim nächsten derartigen Problem suche nicht stundenlang nach dem Fehler, dann kommt „dnf reinstall *“ zum Einsatz 😀

 

 

QMMP & MP3 & Fedora 24

Na, auf Fedora 24 aktualisiert und der MP3 Sound ist weg ?

Kein Problem. Alles was wir brauchen sind Nerven aus Stahl und eine Rootkonsole 😀

Zunächst mal ladet Ihr Euch alle Pakete zu Eurer Prozessorversion von dieser Seite runter :

http://koji.fedoraproject.org/koji/buildinfo?buildID=710733

Debug und Infomodule braucht man nicht und Ja, das sind die Pakete für Fedora 23.. das macht nichts.

Dann ladet Ihr die alten QMMP Packs von RPMFusion runter, die beim Update gelöscht wurden:

http://download1.rpmfusion.org/free/fedora/releases/23/Everything/x86_64/os/Packages/q/


dnf erase qmmp*

cd ~/Downloads
rpm -i -nodeps qmmp*

VORHER prüfen, ob auch nur die RPMs in dem Verzeichnis sind, die man installieren will, ansonsten installiert rpm nämlich alles durcheinander.

Das wars schon. MP3 Wiedergabe geht wieder.

Probleme mit SELinux reparieren

SELinux mal wieder mal um die Ohren geflogen? Vielleicht kann dieser Artikel helfen.

Es war einmal eine neue SSD …

Vor einigen Tagen habe ich meine Systemfestplatte durch eine SSD ersetzt. Da die ganze Platte verschlüsselt war, folgte ein ziemlich aufwändiger Prozess um die Inhalte zu kopieren. Dabei wurde SELinux allerdings vergessen, was dazu geführt hat, daß Linux danach nicht mehr ganz störungsfrei lief.

Alles in allem häuften sich Meldungen wie diese :

Mar 22 23:10:48 eve python: SELinux is preventing /usr/lib64/firefox/plugin-container from open access on the file .

Da stellt sich einem Admin erstmal die Frage, welches File er da nicht öffnen konnte und wieso nicht. Leider bleibt diese Frage unbeantwortet, da das Audit von SELinux dazu schweigt. Dummerweise weiss man nicht welche Datei gemeint ist und was falsch sein könnte. Solange mein Bugreport nicht zu einer Änderung führt, werden wir das auch nie erfahren, da nicht mal strace herausfindet, welche Datei gemeint ist.

Wie Anfangs schon erwäht, wurden Daten von einer Platte auf eine andere kopiert und letztlich war das das Problem.

Was macht SELinux ?

SELinux (ab jetzt nur SEL ) kennt für fast jede Datei einen Zugriffscontext, fcontext genannt. Mit einem ls sieht man diesen Context nicht gleich, dazu muß man die -Z Option benutzen :

# ls -lad /home/
drwxr-xr-x. 4 root root 4096 20. Mär 07:03 /home/

# ls -ladZ /home/
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 /home/

Das Verzeichnis /home/ hat also als Defaultcontext „home_root_t“ ( die enden fast alle auf _t, nicht fragen ). Alle Dateien in /home/ bekommen auch erstmal diesen Context. Programm die in einem Context gestartet wurden, können erstmal nicht auf Dateien in einem anderen Context zugreifen. Das verhindert, daß man durch den Hack z.b. des Apache Webservers auf systemrelevante Dateien zugreifen kann, auch wenn man durch den Hack Rootuser geworden ist. An sich eine Supersache was Security angeht.

Damit das klappt gibt es unter „/etc/selinux/targeted/contexts/files“ eine Liste mit Contexten, die Dateien zugeordnet sind. Wenn man jetzt TAR benutzt um den Inhalt einer Platte von A-> B zu kopieren, geht der Context verloren, aber SELinux findet beim Start seine Configdateien und handelt danach.

Jetzt wurden aus Platzgründen auf der SSD diese Dateien beim Kopieren beschädigt, weswegen der Rechner überhaupt gebootet hat, weil damit der Regelsatz gelöscht war. Da aber andere Dateien mit Contexten versehen wurden, was automatisch beim Anlegen einer Datei passiert (z.b. mit cp a b/) , gab es einige Contexte und andere nicht. Besonders das Home-Verzeichnis strotzt nur so vor Contexten.

Jede Fehlermeldung von SELinux wird dem User präsentiert. Dazu poppt auf dem Desktop eine Warnung auf. In dieser Warnung steht auch, was man dem System zu sagen hat, damit es diesen Zugriff zuläßt. Diese Ausnahmen muß es geben, damit Programme über verschiedene Contexte hinweg Daten austauschen können, z.b. Dateien per SSH ins Webverzeichnis spielen, per Samba Dateien kopieren usw.

Heute morgen hat das Chaos dann komplett zugeschlagen. Systemd konnte nicht mehr booten, da erneut SEL-rechte geändert wurden. Das führte zum komischsten Bootbug bisher. „failure to access /dev/initctl“, wo Systemd auf den „initctl“ Socket nicht mehr zugreifen konnte, also auf den eigentlichen Initprozess.

Wie man es behebt

In meinem Fall habe ich von der „alten“ Platte gebootet und systemd neu installiert, damit waren die komischen Bootprobleme behoben, aber die Gnomeshell startete trotzdem nicht. Was im Einzelnen nicht lief, lies sich nicht feststellen, damit man nicht mal mehr im Debugmodus ins System kam.

Abhilfe schaffte das Abschalten von SEL in /etc/selinux/config :

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.
SELINUX=permissive
#SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#     targeted – Targeted processes are protected,
#     minimum – Modification of targeted policy. Only selected processes are protected.
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted

Der Permissive Modus ist eine Art Debugmode, SEL meckert zwar über die Sicherheitsprobleme, verhindert Sie aber nicht. Damit kann das System wieder booten und man kann die SEL Einstellungen und Probleme reparieren.

Ursachenbeseitigung

Wie sich nach nun umfassender Analyse der SEL Konfigurationen gezeigt hat, war der Policyordner defekt. Dateien mit 0 Bytegröße waren die Regel ( weil die Platte zwischenzeitlich voll war ) .

Das Verzeichnis /etc/selinux/targeted stellt den Regelsatz dar, den SEL befolgen soll, so stehts in der config (siehe oben). Diesen Ordner löscht man und ersetzt ihn anschliessend mit einer alten Kopie. In meinem Fall, von der alten Festplatte. Die Verzeichnisstruktur hat sich nicht geändert, also paßt der Regelsatz, da er „Laufwerke“ nicht beachtet, sondern nur „Pfade“ enthält. Der Name des Bootdevices spielt also keine Rolle.

Nun gibt man noch ein :

# restorecond -R -v /*

Das dauert eine Weile, weil alle Files auf der Platte auf den im Regelsatz enthaltenen Wert zurück gesetzt werden. Mit einer SSD ist man in Minuten durch, mit einer SATA dauert es eine halbe Ewigkeit. Vor den vielen Ausgaben nicht erschrecken, es werden fast alle Dateien auf der Platte gerichtet!

Nun stellt man noch SEL in der /etc/selinux/config auf enforcing um :

# SELINUX=permissive
SELINUX=enforcing

Nun kann man rebooten und der Rechner läuft wieder.

Kleiner Tip an die Gemeinde: Kauft gleich eine TB große SSD, wenn Ihr Videos auf der Platte habt. Spart euch das Linken auf die alte Platte, damit spart Ihr euch eine Menge zusätzlichen Ärgers. Das Musik-  und Videos-Verzeichnis hat genauso Contexte wie alles andere und die müssen passen.

So habe ich das gemacht :

# ls -ladZ /home/marius/Videos
lrwxrwxrwx. marius marius unconfined_u:object_r:user_home_t:s0 /home/marius/Videos -> /sata_home/marius/Videos

]$ ls -ladZ /sata_home /sata_home/marius/
drwxr-xr-x. root root system_u:object_r:user_home_dir_t:s0 /sata_home/
drwx——. marius marius unconfined_u:object_r:user_home_dir_t:s0 /sata_home/marius/

In der /etc/fstab dann noch :

/dev/mapper/luks-53246778-9093-123d-235b-4f35522234211 /sata_home ext4 defaults,x-systemd.device-timeout=0 1 2

Eingetragen um die alte Home Partition als /sata_home zu mounten. Da die Passwörter für die Platten gleich sind ( beim Einrichten & Partitionieren der neuen Platte einfach so eintippen ) , wird diese Lukspartition auch automatisch beim Booten entschlüsselt und kann dann gemountet werden.