
Wie wir alle wissen, wird beim Neustart, Herunterfahren oder Starten eines Systems eine Meldung auf dem Bildschirm angezeigt. Hier ist eine davon:
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 3467
ist ein Hallo-Welt-Programm. Ich weiß nicht, was es 225
ist, aber ich weiß 0
, dass 1
es 2
Standardeingabe, 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 0
also nicht.1
2
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 init
und 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 /proc
lediglich ein Mittel zum Zugriff auf bestimmte vom Kernel verwaltete Informationen ist. Diese Informationen sind unabhängig davon vorhanden, ob der Kernel /proc
gemountet 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
init
der 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
/proc
einen Dateideskriptor zurückbekommen, versuchen, sie in einem Dateideskriptor nachzuschlagen und/proc
einen Dateideskriptor zurückbekommen …)./proc
ist nur eine Ansicht, sie wird nur von Prozessen benötigt, die über andere Prozesse berichten. - Der 255. Dateideskriptor
ls
in Ihrem Beispiel ist vom Verzeichnis/proc/3467/fd
:ls
muss das Verzeichnis öffnen, also erwarten wir einen zusätzlichen Dateideskriptor. Wir haben einen zusätzlichen, also ist es das hier. /proc/fd/1
usw. zeigen auf andere Geräte. zB1 -> /dev/pts/3
. Machen Sie einels -l /proc/self/fd
- Wenn der Kernel startet,
init
verbindet er seinen Standarddin, Standardout und Standardderr mit dem Bildschirm (einem TTY-Gerät, das auf dem Bildschirm gerendert wird) oder irgendwo anders. init
ist ein Prozess1
(auf Ihrem Systemsystemd
).