Schnell-Check: Bin ich von dem Kernel-Bug betroffen?
Der Bug kann zuschlagen, wenn Programme einen Systemaufruf der Funktionen
open, stat und einigen anderen mit dem Parameter O_DIRECT ausführen. Um ein Programm zu identifizieren, das unter Verdacht steht, mit diesem Parameter zu arbeiten, kann man es mit dem Tool
strace aus dem gleichnamigen Paket
strace untersuchen. Es protokolliert
jeden Betriebssystemaufruf und ist daher sehr geschwätzig. Mit der Option -o werden die Ergebnisse, die strace liefert, in eine Log-Datei geschoben
Hier mal ein konkreter Versuch mit dem Editor gedit:
Im Editor schreibe ich nun ein paar Buchstaben und erzwinge eine Schreibaktion, indem ich das Dokument abspeichere. Danach beende ich gedit und schaue mir den Log von strace mit less ~/geditprotokoll.txt an. Da der aber viel zu lang ist, kann ich auch gleich nach dem Delinquenten mit grep suchen:
und werde
vermeintlich fündig:
Code: Alles auswählen
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gio/modules", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 9
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gvfs/modules", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/home/lstone/.local/share/gedit/plugins", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gedit/plugins", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gedit/plugins/externaltools", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gedit/plugins/quickopen", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gedit/plugins/snippets", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/gedit/plugins", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/etc/fonts/conf.d", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/usr/share/fontconfig/conf.avail", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/home/lstone/.local/share/gtksourceview-4/language-specs", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/local/share/gtksourceview-4/language-specs", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/gtksourceview-4/language-specs", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/usr/share/icons", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/usr/share/pixmaps", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/home/lstone/.local/share/gtksourceview-4/styles", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/local/share/gtksourceview-4/styles", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/gtksourceview-4/styles", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 10
openat(AT_FDCWD, "/home/lstone/.local/share/gedit/styles", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/enchant-2", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/enchant-2", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/aspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/lib/aspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/home/lstone/.config/enchant/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/local/share/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/share/enchant/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/home/lstone/.config/enchant/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/local/share/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
openat(AT_FDCWD, "/usr/share/enchant/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/hunspell", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 11
Noch mal Glück gehabt: Hier taucht zwar der Parameter O_DIRECTORY
aber nicht einmal O_DIRECT auf.
D.h. gedit ist höchstwahrscheinlich clean und ist nicht von dem Bug betroffen.
Man sollte aufpassen, wenn man komplexere Programm mit strace aufruft. Es können Prozesse vom Hauptprogramm abgekoppelt werden, die dann nicht mehr von strace beobachtet werden. Ich meine zwar, dass sowas generell auch mit strace machbar ist, müsste mich aber erst mal wieder in das Thema einlesen.
NACHTRAG:
Um auch abgespaltene Prozesse unter strace mitzubeobachten, reicht der Parameter
-f, also z.B. zur Beobachtung von Libreoffice Writer:
Der Output ist ziemlich fett; deshalb sollte man die Untersuchung mit grep durchführen, statt sich durch direktes Nachlesen die Augen kaputtzumachen.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams