私たちが知っているように、システムを再起動、シャットダウン、または起動すると、いくつかのメッセージが画面に印刷されます。以下はキャプチャです。
私のシステムはUbuntu 16.04で、上記のログメッセージがsystemdから来ていることを知っています。
私が理解したのは、通常のユーザープロセスでは、システムが3つのファイル記述子(0、1、2)を提供するため、コンテンツを画面に印刷できます。たとえば、次のようになります/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
これは単なるビューであり、他のプロセスについて報告するプロセスにのみ必要です。 - あなたの例では、255のファイル記述子が
ls
ディレクトリに属しています/proc/3467/fd
。ls
ディレクトリを開く必要があるため、追加のファイル記述子が必要です。余分なものがあるので、それはすべてです。 /proc/fd/1
他のデバイスにも同様です。たとえば1 -> /dev/pts/3
。何かを作るls -l /proc/self/fd
- カーネルが起動したら、
init
stdin、stdout、stderrを画面(画面にレンダリングするttyデバイス)または他の場所に接続します。 init
1
(システムの)プロセスですsystemd
。