Wie kann ein Protokoll zum Anzeigen beim Herunterfahren, Neustarten oder Starten ausgedruckt werden?

Wie kann ein Protokoll zum Anzeigen beim Herunterfahren, Neustarten oder Starten ausgedruckt werden?

Wie wir alle wissen, wird beim Neustart, Herunterfahren oder Starten eines Systems eine Meldung auf dem Bildschirm angezeigt. Hier ist eine davon:

Bildbeschreibung hier eingeben

Mein System ist Ubuntu 16.04 und ich weiß, dass die oben genannten Protokollmeldungen vom systemd stammen.

Meines Wissens nach kann ein normaler Benutzerprozess Dinge auf dem Bildschirm ausdrucken, da das System ihm drei Dateideskriptoren zuweist: 0, 1 und 2. Wir finden sie unter /proc/<PID>/fd/. Hier ist ein Beispiel:

root@X86-Xenial-6:~# ls /proc/3467/fd
0  1  2  255

Dies 3467ist ein Hallo-Welt-Programm. Ich weiß nicht, was es 225ist, aber ich weiß 0, dass 1es 2Standardeingabe, Standardausgabe und Standardfehler gibt.

Ich habe also eine Frage: Wenn das System heruntergefahren, neu gestartet oder gestartet wird, wurde der Benutzerprozess nicht erstellt oder zerstört, was bedeutet, dass er /proc/nicht mehr existiert, in diesem Fall 0also nicht.12

Warum kann die von systemd kommende Nachricht auf dem Bildschirm gedruckt werden? Der Kernel könnte Dinge drucken, da er den Bildschirm unmittelbar steuert, aber ich glaube nicht, dass systemd zum Kernel gehört. Wie könnte es also auch Dinge auf dem Bildschirm drucken? Welche Art von Funktion oder API wird verwendet?

Antwort1

Das Starten und Herunterfahren erfolgt größtenteils im Benutzerbereich und nicht vom Kernel. Sobald der Kernel mit der Initialisierung fertig ist, sucht initund startet er diesen als regulären Prozess, wobei die Standarddateideskriptoren auf die Konsole zeigen. init(In Ihrem Fall kann also das initramfs-Skript und dann systemd) in seine Standardausgabe schreiben und alles, was es schreibt, wird auf dem Bildschirm angezeigt (oder wo auch immer die Konsolenausgabe angezeigt werden soll). Dies bleibt so lange der Fall, bis der Kernel herunterfährt oder neu startet, was nach dem Herunterfahren des Benutzerbereichs geschieht (und nachdem alle Herunterfahrprotokolle in die Konsole geschrieben wurden).

Beachten Sie nebenbei, dass dies /proclediglich ein Mittel zum Zugriff auf bestimmte vom Kernel verwaltete Informationen ist. Diese Informationen sind unabhängig davon vorhanden, ob der Kernel /procgemountet ist oder nicht.

Beachten Sie auch, dass

Wie wir alle wissen, wird beim Neustart, Herunterfahren oder Starten eines Systems eine Meldung auf dem Bildschirm angezeigt

ist nicht unbedingt wahr – viele Systeme starten und fahren jetzt herunter, ohne Protokolle anzuzeigen, also können wir nicht davon ausgehen, dass „wir es alle wissen“.

Antwort2

Eine kurze Antwort, um einige Missverständnisse auszuräumen.

  • Der Prozess wird im Benutzerbereich ausgeführt: insbesondere initder erste Benutzerprozess.
  • Sie benötigen /proc nicht, damit Dateideskriptoren existieren. Wenn der einzige Weg, auf Dateideskriptoren zuzugreifen, über eine Datei wäre, wie würden Sie dann auf einen Dateideskriptor zugreifen? (Sie würden die Datei öffnen und /proceinen Dateideskriptor zurückbekommen, versuchen, sie in einem Dateideskriptor nachzuschlagen und /proceinen Dateideskriptor zurückbekommen …). /procist nur eine Ansicht, sie wird nur von Prozessen benötigt, die über andere Prozesse berichten.
  • Der 255. Dateideskriptor lsin Ihrem Beispiel ist vom Verzeichnis /proc/3467/fd: lsmuss das Verzeichnis öffnen, also erwarten wir einen zusätzlichen Dateideskriptor. Wir haben einen zusätzlichen, also ist es das hier.
  • /proc/fd/1usw. zeigen auf andere Geräte. zB 1 -> /dev/pts/3. Machen Sie einels -l /proc/self/fd
  • Wenn der Kernel startet, initverbindet er seinen Standarddin, Standardout und Standardderr mit dem Bildschirm (einem TTY-Gerät, das auf dem Bildschirm gerendert wird) oder irgendwo anders.
  • initist ein Prozess 1(auf Ihrem System systemd).

verwandte Informationen