OSの起動ってどうなってるの?

OSの起動ってどうなってるの? Linux
OSの起動ってどうなってるの?

少し前に、PCがなぜか起動しなくなったことがありました。電源は入るし、マザーボードのランプも点く。でもOSどころか、いつもの起動画面まで進まない。最初は「ストレージ死んだ?」「OS壊れた?」と疑ったんですが、原因はまさかの CPUファンのケーブルが外れていた というオチでした。

この一件をきっかけに、「OSってそもそもどうやって起動してるんだ?」とか、「UEFIとかブートローダーって、実際何をしてるんだ?」という疑問がいろいろ湧いてきて、あれこれ調べたり考えたりしました。この記事は、そのとき調べたことをまとめたものです。

BIOS/UEFIの歴史と仕組みと機能

まずPCの起動に深くかかわっているBIOSについて。いまではUEFIという仕組みになっていますが、慣習的にOSが起動する前に立ち上がるものをBIOSと呼ぶようです。

昔のBIOS画面を思い出してみる

昔のBIOS画面って、青背景に白文字で、キーボード操作しかできない、いかにも「無骨」な見た目でした。

昔のBIOS画面のイメージ(これはAI生成です)

最初は単に古いデザインだったんだと思っていたんですが、調べてみると、あれは当時の技術的制約そのものだったみたいです。

BIOSは16bitリアルモードで動いていて、使えるメモリもごくわずか。高解像度表示やマウス操作なんて前提にすらありません。

なので、CUIっぽい画面になるのは必然だった、というわけです。

ハードウェアというよりもソフトウェア的な制限が強すぎてあまりインタラクティブな操作ができず、初心者には難しい領域だった気がします。

UEFIって結局なに者なのか

最近のマザーボードだと、BIOSというよりUEFIと呼ばれるものが使われています。設定画面は普通にGUIで、マウスも使えるし、最初は「これもうOSじゃない?」と思いました。

UEFI画面のイメージ図。マウスも使えるしGUIでの操作が可能になっている

調べて分かったのは、UEFIはOSではないけど、OSが起動する前に動く、かなり高機能な仕組み だということです。UEFIが起動している段階でUSBやGPUなども認識しているのでGUIを実現できています。

マザーボード上のフラッシュROM(書き換え可能なROMのこと)に入っていて、電源を入れた瞬間にCPUが最初に実行します。ストレージやOSが壊れていても起動するので、完全にハードウェア側の世界の話です。

UEFIはファイルシステムを理解していて、ESP(EFI System Partition)にある .efi ファイルを直接実行します。だから最近のUEFI設定画面がGUIなのも、「余裕があるからそうなっている」だけなんですね。

ブートローダーの仕組みと機能

ブートローダーって何をしてるのか

UEFIの次に出てくるのがブートローダーです。正直、名前はよく聞くけど、何をしているのかはあまり意識していませんでした。

ブートローダーの役割をざっくり言うと、「OSカーネルを動かせる状態を整えて、CPUの制御を渡す」ことです。

CPUの動作モードを切り替えたり、メモリ配置を決めたり、カーネルを読み込んだりと、OSが表に出る前の下準備を全部やっています。

昔のブートローダーのプログラミングめちゃくちゃ難しかった話

「昔のブートローダーのプログラミング地獄だった」と知ったのですが、これも調べてみると納得でした。

MBRの512バイト制限、16bit環境、ファイルシステムなし、デバッグ手段ほぼゼロ。この条件で起動コードを書くのは、今の感覚だとちょっと正気じゃないです。

当時は当時なりの方法で、プログラミングしていたのだと思いますが、かなり限られたリソースで動いて、自分より何倍も大きいOSを読み込ませないといけないので、職人技のようなものだったとか言われていますね。

今はUEFIのおかげで、ブートローダーも普通のファイルとして扱えますし、C言語で書けます。難易度が別次元だった、という話は誇張じゃなさそうです。

OSが起動するまでに行われていること

起動の流れを整理してみる

ここまで調べて分かった起動の流れは、だいたいこんな感じです。電源ON → UEFI起動 → ブートローダー起動 → OSカーネル起動 → ユーザー空間起動。普段は一瞬で終わるので意識しませんが、ちゃんと段階があります。

UEFIはロードされる存在ではなく、CPUが最初に直接実行します。一方で、ブートローダーやOSカーネルはストレージから読み込まれるソフトウェアです。この切れ目を意識すると、起動トラブルの見え方が変わってきました。

「ブートローダーが見つからない」問題

たまに、起動時に「ブートローダーが見つからない」みたいな表示が出てUEFI画面に入るけど、再起動すると普通に起動する、ということがありました。

ブートエラー画面のイメージ

最初は「ストレージが壊れたのかな?」と思ったんですが、調べてみると、これもありがちな話らしいです。

ストレージの初期化が間に合っていなかったり、Fast Bootの影響だったり、USB機器が邪魔していたりと、原因はUEFI側のタイミング問題であることが多いようです。

多いのはOSの起動順がUSBが1番目になっていて、USBメモリを挿したまま電源を入れてしまった場合。USBメモリに起動可能なブートローダーが入ってなければ起動エラーの画面ができます。

CPUファン未接続で起動しなかった体験

冒頭で触れたCPUファンの件も、仕組みを知ると納得がいきました。CPUファンが回っていない状態は、UEFIから見ると「このまま起動したら危険」なので、OS以前の段階で起動を止めます。

CPUファン以外にも、キーボードが繋がっていない、電圧が不安定、メモリに不具合がある、CPUに異常がある、などでOSの起動がストップされるようになっています。

そのままOSを無理やり起動して大事なデータが壊れても大変ですし、このあたりの異常系は結構しっかり機能してくれてるんだなと思いました。

仮想マシンやコンテナは?

仮想マシンを触っていて感じた違和感

仮想マシンを使っていると、物理PCで起きるようなトラブルがほとんど起きません。CPUファンがどうとか、温度がどうとか、そもそもそういう概念がないからです。

調べてみると、仮想マシンはUEFIやBIOSごとソフトウェアで再現していて、起動フロー自体は実機とほぼ同じでした。ただし、壊れるのは物理パーツではなく、仮想ディスクや設定ファイル、という違いがあります。

コンテナはそもそも起動しない

一方、Dockerのようなコンテナはさらに別物です。コンテナはOSを起動しません。すでに起動しているホストOSの上で、隔離されたプロセスを起動しているだけです。

そのため、UEFIもブートローダーも存在せず、起動が一瞬で終わります。「コンテナは軽い」と言われる理由が、ここでやっと腑に落ちました。

SIMなんかもOS?

話の流れでSIMカードのことも気になって調べてみました。SIMってたしかCPUとOSが入った、超小型のコンピュータだと聞いたことがあったからです。

調べたところではSIMのOSは、加入者認証や暗号処理といった役割に特化しているようで、用途が完全に固定されているので、UEFIやブートローダーのような仕組みは不要です。電源が入れば即OSが動く、マイコンの世界です。いわゆる組み込み用とのような感じみたいですね。

まとめ

CPUファン未接続で起動しなかった、という単純な体験から始まって、UEFI、ブートローダー、OS起動の仕組みを調べていくと、PCの起動が一気に立体的に見えるようになりました。

仮想マシンは実機の起動構造をそのまま再現し、コンテナはその一部を大胆に省略しています。SIMのような組み込みの世界では、そもそも別の考え方が使われています。

普段は意識しない部分ですが、こうした仕組みを知っておくと、起動トラブルに遭遇したときの混乱がかなり減るはずです。

コメント

タイトルとURLをコピーしました