目標
- Linuxシステムが起動するまでの流れについて理解する
Linuxシステムが起動するまでの流れ
「Linuxシステムが起動した状態」とは、「Linuxのログイン画面やシェルが使える状態」といえます。この状態になるまでには、PCの電源がONされてから、段階的なプロセスがいくつかあります。このプロセスは、ざっくり、次のようになります。
- 電源ON
- BIOS/UEFIの起動
- ブートローダ(GRUB)の起動
- カーネル(vmlinuz + initramfs)の起動
- init / systemd プロセスの起動
- サービス起動 → ログイン画面 or GUI
BIOS/UEFIの起動
PCの電源を入れると、まず「BIOS または UEFI」が起動します。これはマザーボードにあるファームウェア(ハードウェアを制御するために組み込まれたソフトウェア)です。
ここでは、次のような処理を行います。
- CPU・メモリ・ディスク・USB などのハードウェアを初期化
- POST(Power-On Self Test) によりハードの動作確認
- 起動可能なディスク(HDD/SSD/USB)を検出
- 起動デバイスのブートセクタ(MBRやEFIパーティション)を読み込む
- ブートローダに制御を渡す
OSは、HDDやSSD(補助記憶装置)に格納されていいます。このOSを利用するには、PCは電源が入った後、補助記憶装置にあるOSをコンピュータ内に呼び出して使える状態にする必要があります。
これは、牧場に例えると、電源ONが朝日が昇った状態として、そこのオーナーが朝礼を行います(BIOS)。その後、寮住まいの従業員が動き始めます(OS)。そして、倉庫にあるトラクターや、用具を必要な場所へ展開する(ドライバのロード)ようなものと考えると解りやすいです。
ブートローダ(GRUB)の起動
ブートローダは、「Linuxカーネル」をメモリに読み込む起動の中継役です。Linux では主に GRUB / GRUB2 が使われます。
ここでは、次のような処理を行います。
- /boot/grub/grub.cfg を読み込んで、起動メニューを表示します。
- 選択されたOS(またはデフォルトのカーネル)をロードします。
- Linuxカーネル(vmlinuz) と 初期RAMディスク(initrd/initramfs) をメモリに展開
- カーネルに制御を渡す
カーネルの起動
カーネルは、ハードウェアとソフトウェア、特にアプリケーションとハードウェアとの間の仲介役を果たし、コンピュータシステムのリソース(CPU、メモリ、ディスク、デバイスなど)を効率的に管理・制御します。カーネルが果たす主な役割は、ハードウェアとアプリケーションプログラムを直接つなげることで、カーネルがなければ、アプリケーションは直接ハードウェアとやりとりすることができません。
OSには沢山の機能を持ちます。例えば「ファイルシステム」「メモリ管理」「デバイス管理」「ネットワーク管理」…などなど。カーネルはこれらの機能と密接に関わりあっています。
これを牧場で例えると、OSが寮住まいの従業員であれば、カーネルは、器具、用具、文房具、計算機を扱う能力をもつヒトのことです。ファイルシステムは「読み書きできること」、メモリ管理は「整理整頓すること」、デバイス管理は、「顧客との電話やり取り、トラクターを運転すること」など、ネットワーク管理は「地図情報の管理」などです
ここでは、次のような処理を行います。
- メモリ、CPU、I/Oデバイスの初期化
- initramfs をマウントして、最小限の仮想ファイルシステムを作成
- 実際のルートファイルシステム(例: /dev/sda2)をマウント
- 最初のユーザースペースプロセスである init(PID 1) を起動
プロセスや起動については次の記事も参考にしてください。
-320x180.jpg)
-320x180.jpg)
init / systemd プロセスの起動
ユーザースペースで最初に実行されるプロセス(PID 1)のことです。近年は init の代わりに systemd が使われることが主流となっています。
ここでは、次のような処理を行います。
- システム設定ファイルを読み込みます(例: /etc/inittab, /etc/systemd/)
- サービス(ネットワーク、ログ、ファイアウォールなど)を順に起動します
- ターゲット(以前のランレベル)に応じた起動処理
- 最終的にログインプロンプトやGUI画面が表示されます
SysVinit
SysVinitは、従来のLinuxやUNIX系システムで使用されていた初期のinitシステムです。SysVinitでは、システムが起動する際に必要なサービス(デーモンなど)を順番に起動します。具体的には、/etc/init.d/に格納されたスクリプトが、システム起動時に指定されたランレベル(例えばランレベル3や5)に基づいて実行され、必要なサービスを順番に立ち上げます。
ランレベルとは、システムの起動時にどの程度の機能やサービスが立ち上がるかを制御し、システムの動作モードを定義するものす。
ランレベル番号 | 説明 |
---|---|
0 | シャットダウン |
1 | シングルユーザーモード(メンテナンスモード) |
2 | マルチユーザーモード(ネットワークなし) |
3 | マルチユーザーモード(ネットワークあり、テキストモード) |
4 | ユーザー定義モード(カスタム設定用) |
5 | マルチユーザーモード(ネットワークあり、GUIあり) |
6 | 再起動 |
SysVinit は、Linux システムの起動時に /etc/inittab ファイルを参照してシステムのランレベルや起動シーケンスを決定し、その後に必要なサービスを順番に起動します。以下の流れが一般的です。
1. /etc/inittab ファイルを読み込む
SysVinit は、システム起動時に最初に /etc/inittab ファイルを読み込みます。このファイルは、システムの初期設定や、どのランレベルで起動するか、どのプロセスを最初に起動するかを指定します。init プロセスが /etc/inittab の設定を読み込むことで、次のステップへ進む準備を整えます。
2. /etc/rc.sysinit スクリプトを実行する
/etc/rc.sysinit はシステムの初期化スクリプトです。このスクリプトはシステムの起動時に最初に実行され、ファイルシステムのチェック、必要なカーネルモジュールのロード、システムのロギングサービスの設定など、システムの初期設定を行います。
3. /etc/rc スクリプトを実行する
次に、/etc/rc スクリプトが実行されます。このスクリプトは、システムのランレベルに応じた適切なサービスを開始するための準備をします。ランレベル(例えば、レベル3やレベル5など)に従って、特定のサービスを起動するための処理が行われます。
4. /etc/rc.d または /etc/init.d ディレクトリ配下のスクリプトを実行する
/etc/rc.d または /etc/init.d ディレクトリ配下には、システム起動時に実行されるサービスやデーモンを制御するスクリプトが配置されています。それぞれのランレベルに対応したディレクトリ(例えば、/etc/rc.d/rc3.d/)に配置されているスクリプトを実行し、サービスの起動・停止を制御します。
具体的には、/etc/rc.d/rc{ランレベル}.d に格納されているスクリプトを実行し、各サービスを順番に起動します。例えば、ランレベル3の場合、/etc/rc.d/rc3.d/ 配下のスクリプトを実行します。これらのスクリプトは、実行する順番が S
または K
で始まり、S
はサービスを起動すること、K
はサービスを停止することを示します。
解決策としてのsystemd
この問題を解決するために登場したのが、systemdです。systemdは、サービスの並行起動をサポートし、依存関係を自動的に管理することで、システムの起動時間を短縮します。具体的には、systemdは以下のような機能を提供します。
並行処理:
- systemdはサービスの並行起動をサポートしており、サービス間で依存関係がない場合は、順番に関係なく並列に起動することができます。これにより、全体の起動時間が大幅に短縮されます。
依存関係の自動管理:
- systemdはサービスの依存関係を管理し、適切な順番でサービスを起動します。たとえば、ネットワークサービスが必要なサービスは、ネットワークサービスが立ち上がるまで待機しますが、それ以外のサービスは並行して起動されるため、効率的に起動が進みます。
依存関係の設定:
- systemdでは、サービス間の依存関係をunitファイルに明記することができます。これにより、必要なサービスが事前に立ち上がり、その後のサービスがスムーズに起動できるようになります。
ランレベル番号 | 説明 | 対応するsystemdターゲット |
---|---|---|
0 | シャットダウン | poweroff.target |
1 | シングルユーザーモード(メンテナンスモード) | rescue.target |
2 | マルチユーザーモード(ネットワークなし) | multi-user.target(ネットワークなし) |
3 | マルチユーザーモード(ネットワークあり、テキストモード) | multi-user.target |
4 | ユーザー定義モード(カスタム設定用) | multi-user.target(カスタム設定) |
5 | マルチユーザーモード(ネットワークあり、GUIあり) | graphical.target |
6 | 再起動 | reboot.target |
今回は以上になります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

