Xで以下のような投稿を見つけ、技術面接だと思い取り組んでみました。
面接やってたこともあるんで、Linuxできます、の基準についてはそうですね、たとえばこんな感じです。
— 衛星経由で監視されてるハムスター🐹 (@rioriost) December 19, 2023
「PCにLinuxがインストールされてます。電源スイッチを入れてから、例えばApache httpサーバが起動するまでの処理内容をザックリと説明してください。」
説明できたら、技術面接をパスですね。…
すると「Linux起動の流れ」について正確な知識が身についていないことがわかりました。なので、X上に自分用メモツリーを作り調べました。すると思った以上にが多くの方に閲覧されていたためQiitaでも記事にすることにしました。
この記事でわかること
- Linux起動の流れ
電源投入時のCPUの処理
BIOSの役割
MBRとブートローダー
カーネルと初期RAMディスク
systemdとプロセスの起動
Linux起動の流れ全体図
電源投入時のCPUの処理
特に明記がなければ、メモリ=RAM、ROM=ROMで読んでいただければと思います。
また、レガシーBIOSを説明に用います。UEFIを想定していません。
パソコンの電源を投入するとBIOSがまず読みだされることを知っている人は多いはずです。CPUはBIOSを読みだしメモリに展開したいと思うはずです。CPUはプログラムをメモリに展開して実行するからです。しかしメモリの内容は電源を切れば消えているはずですよね。電源をつけたばかりのCPUはどのようにしてBIOSをメモリに展開するのでしょうか。
答えを言うとBIOSはマザーボードのROMにあります。電源投入直後のCPUの命令をROMに向けるようにしておきます。そうすることで、CPUは他のプログラムの力を借りずにBIOSを読みだすことができます。
BIOSの役割
初めにBIOSはPOST(Power On Self Test)と呼ばれる最低限のハードウェアチェックを行い、メモリやグラフィックボードに異常があれピープ音で知らせます。
ハードウェアチェックが正常に終了した場合、外部記憶装置(HDDやSSD)の先頭512バイトをメモリに読みだします。それが決められた2バイトのパターンで終わっていたら、残りの510バイトを起動用プログラムと認識して実行を開始します。
この先頭の512バイトのことをMBRといいます。
MBRとブートローダー
MBR内のGRUB(ブートローダー)が起動し、Linuxカーネルをメモリ上に読み出します。
GRUBはLinuxで一般的に使用されるブートローダーで、Linuxカーネルをストレージから読み出します。
カーネルと初期RAMディスク
Linuxカーネルはメモリに常駐し、ハードウェアの管理やプロセススケジューリングなどを行う役割があります。
Linuxカーネルは初期RAMディスクという一時的なルートディレクトリのマウント後、本来のルートディレクトリのマウントを行います。HDDやSSDへのアクセスにドライバが必要な場合があります。そのために一時的なルートディレクトリにあるドライバを読み出し、最終的にルートディレクトリになるHDDやSSDをマウントするというわけです。
systemdとプロセスの起動
Linuxカーネルは最初のプロセスとしてsytemdを起動します。systemdはその後default.targetを実行し、様々な準備(ディストリビューションによって異なると思われます)を行います。
bash等が立ち上がり、ユーザからのコマンドを受け付ける状態になったさい、systemctl start httpdでApacheを起動させることができます。
自動起動設定(chkconfig)がされていたら起動に伴い自動起動しているはずです。
参考文献
ただしこの記事の内容の誤りがあったとすればこの記事の著者によるものです。
ソフトウェアデザイン2022年6月号
https://amzn.to/3vh8Txm
試して理解Linuxのしくみ
https://amzn.to/41ypHMw
LinuCレベル2
https://amzn.to/47eRClM
作って理解するOS x86系コンピュータを動かす理論と実装
https://amzn.to/3NFCC9Q