
ご存知のとおり、システムを再起動、シャットダウン、または起動すると、何らかのメッセージが画面に表示されます。以下はそのキャプチャです。
私のシステムは Ubuntu 16.04 ですが、上記のようなログ メッセージは systemd からのものであることはわかっています。
私の理解では、通常のユーザープロセスは、システムが 0、1、2 の 3 つのファイル記述子を割り当てるため、画面に何かを印刷できます。これらは にあります/proc/<PID>/fd/
。次に例を示します。
root@X86-Xenial-6:~# ls /proc/3467/fd
0 1 2 255
は3467
hello-world プログラムです。225
が何であるかはわかりませんが、0
、1
、 は2
標準入力、標準出力、および標準エラーであることはわかります。
そこで質問があります。システムがシャットダウン、再起動、または起動を開始すると、ユーザー プロセスが作成されていないか、破棄されています。つまり、 は/proc/
もう存在せず、この場合は と0
は1
存在2
しません。
では、なぜ systemd からのメッセージを画面に表示できるのでしょうか? カーネルは画面を即座に制御するため、画面に表示できますが、systemd はカーネルに属していないと思うので、画面に表示できるのでしょうか? どのような関数や API が使用されているのでしょうか?
答え1
起動とシャットダウンは、カーネルではなく、主にユーザー空間で行われます。カーネルは初期化を完了するとすぐに、init
標準ファイル記述子がコンソールを指している通常のプロセスとしてそれを探して起動します。そのためinit
(この場合は、initramfs スクリプト、次に systemd)、標準出力に書き込むことができ、書き込んだ内容はすべて画面 (またはコンソール出力が表示されるように設定されている場所) に表示されます。この状態は、ユーザー空間がシャットダウンした後 (およびすべてのシャットダウン ログがコンソールに書き込まれた後)、カーネルがシャットダウンまたは再起動するまで続きます。
余談ですが、 は/proc
カーネルによって維持される特定の情報にアクセスするための手段に過ぎず、それらの情報は/proc
マウントされているかどうかに関係なく存在することに注意してください。
また、
ご存知のとおり、システムを再起動、シャットダウン、または起動すると、画面に何らかのメッセージが表示されます。
必ずしも真実ではありません。現在では多くのシステムがログを表示せずに起動およびシャットダウンするため、「私たち全員が知っている」と想定することはできません。
答え2
いくつかの誤解を解くための短い回答です。
- プロセスはユーザー空間、具体的には
init
最初のユーザー プロセスで実行されます。 - ファイル記述子が存在するために /proc は必要ありません。ファイル記述子にアクセスする唯一の方法がファイル経由である場合、ファイル記述子にどのようにアクセスするのでしょうか? (ファイル記述子が返されるファイルを開き、ファイル記述子が返されるファイル
/proc
を検索して...)。これは単なるビューであり、他のプロセスを報告するプロセスによってのみ必要です。/proc
/proc
ls
例の 255 のファイル記述子はディレクトリのものです/proc/3467/fd
。ls
ディレクトリを開く必要があるため、追加のファイル記述子が 1 つ必要になります。余分なファイル記述子が 1 つあるので、これがそのファイル記述子になります。/proc/fd/1
など他のデバイスを指します。例1 -> /dev/pts/3
:ls -l /proc/self/fd
- カーネルが起動すると、
init
stdin、stdout、stderr が画面 (画面に表示される tty デバイス) または他の場所に接続されます。 init
プロセスです1
(システム上systemd
)。