12-LPIC「level1」

LPIC|level 1【システムアーキテクチャ(4)】

目標

  • Linuxシステムが起動するまでの流れについて理解する

Linuxシステムが起動するまでの流れ

「Linuxシステムが起動した状態」とは、「Linuxのログイン画面やシェルが使える状態」といえます。この状態になるまでには、PCの電源がONされてから、段階的なプロセスがいくつかあります。このプロセスは、ざっくり、次のようになります。

  1. 電源ON
  2. BIOS/UEFIの起動
  3. ブートローダ(GRUB)の起動
  4. カーネル(vmlinuz + initramfs)の起動
  5. init / systemd プロセスの起動
  6. サービス起動 → ログイン画面 or GUI

BIOS/UEFIの起動

PCの電源を入れると、まず「BIOS または UEFI」が起動します。これはマザーボードにあるファームウェア(ハードウェアを制御するために組み込まれたソフトウェア)です。

ここでは、次のような処理を行います。

  1. CPU・メモリ・ディスク・USB などのハードウェアを初期化
  2. POST(Power-On Self Test) によりハードの動作確認
  3. 起動可能なディスク(HDD/SSD/USB)を検出
  4. 起動デバイスのブートセクタ(MBRやEFIパーティション)を読み込む
  5. ブートローダに制御を渡す

POST(Power-On Self Test) とは、コンピュータやその他の電子機器が電源を入れた際に実行される初期テストのことです。主に、コンピュータの起動時にハードウェアの基本的なチェックを行い、正常に動作するかどうかを確認します。このプロセスは、BIOS(またはUEFI)によって制御されます。

ブートセクタ とは、コンピュータのストレージデバイス(ハードディスク、SSD、USBメモリなど)の最初のセクタ(最初の512バイトの領域)に格納されている、オペレーティングシステム(OS)の起動に関わる重要な情報が含まれている領域のことです。簡単に言うと、「コンピュータを起動させるための情報やプログラムが最初に格納されている部分」です。

MBRは、従来のBIOSシステムにおけるブートセクタの形式です。MBRはハードディスクの最初の512バイトに格納され、最初の446バイトにブートストラップコード、次の64バイトにパーティション情報、最後の2バイトに「0x55AA」のシグネチャが含まれています。MBR形式のディスクは最大4つのプライマリパーティションしか作成できません。

EFIパーティション(EFI System Partition, ESP)とは、UEFI(Unified Extensible Firmware Interface)システムにおいて、オペレーティングシステムのブートローダやファームウェア、その他のブート関連のファイルを格納するための特別なパーティションです。GPT(GUID Partition Table)方式のディスクにおいて、UEFIシステムの起動に必要不可欠な役割を果たします。

OSは、HDDやSSD(補助記憶装置)に格納されていいます。このOSを利用するには、PCは電源が入った後、補助記憶装置にあるOSをコンピュータ内に呼び出して使える状態にする必要があります。

これは、牧場に例えると、電源ONが朝日が昇った状態として、そこのオーナーが朝礼を行います(BIOS)。その後、寮住まいの従業員が動き始めます(OS)。そして、倉庫にあるトラクターや、用具を必要な場所へ展開する(ドライバのロード)ようなものと考えると解りやすいです。

ブートローダ(GRUB)の起動

ブートローダは、「Linuxカーネル」をメモリに読み込む起動の中継役です。Linux では主に GRUB / GRUB2 が使われます。

ここでは、次のような処理を行います。

  1. /boot/grub/grub.cfg を読み込んで、起動メニューを表示します。
  2. 選択されたOS(またはデフォルトのカーネル)をロードします。
  3. Linuxカーネル(vmlinuz)初期RAMディスク(initrd/initramfs) をメモリに展開
  4. カーネルに制御を渡す

GRUBは、コンピュータの起動時にオペレーティングシステムを選択して起動するためのプログラムで、特にマルチブートシステムにおいて重要な役割を果たします。たとえば、1台のコンピュータに複数のOS(Linux、Windowsなど)をインストールしている場合、GRUBはどのOSを起動するかを選ぶメニューを提供します。

カーネルの起動

カーネルは、ハードウェアとソフトウェア、特にアプリケーションとハードウェアとの間の仲介役を果たし、コンピュータシステムのリソース(CPU、メモリ、ディスク、デバイスなど)を効率的に管理・制御します。カーネルが果たす主な役割は、ハードウェアとアプリケーションプログラムを直接つなげることで、カーネルがなければ、アプリケーションは直接ハードウェアとやりとりすることができません。

OSには沢山の機能を持ちます。例えば「ファイルシステム」「メモリ管理」「デバイス管理」「ネットワーク管理」…などなど。カーネルはこれらの機能と密接に関わりあっています。

これを牧場で例えると、OSが寮住まいの従業員であれば、カーネルは、器具、用具、文房具、計算機を扱う能力をもつヒトのことです。ファイルシステムは「読み書きできること」、メモリ管理は「整理整頓すること」、デバイス管理は、「顧客との電話やり取り、トラクターを運転すること」など、ネットワーク管理は「地図情報の管理」などです

カーネルのバージョンは「uname -r」コマンドで行えます。

ここでは、次のような処理を行います。

  1. メモリ、CPU、I/Oデバイスの初期化
  2. initramfs をマウントして、最小限の仮想ファイルシステムを作成
  3. 実際のルートファイルシステム(例: /dev/sda2)をマウント
  4. 最初のユーザースペースプロセスである init(PID 1) を起動

init(PID 1)は、LinuxやUNIX系のオペレーティングシステムで最初に起動するプロセスで、システムの初期化やプロセス管理を担う非常に重要な役割を果たします。initはプロセスID(PID)が1であり、システムのブート時に最初に実行されるため、システムが起動するときにこのプロセスが最初に立ち上がります。

プロセスや起動については次の記事も参考にしてください。

Virtual Box & Linux(Part.19)| Linux プロセスの管理(1)| 現役エンジニア&プログラミングスクール講師Linuxの「プロセスの管理」について記事にしています。「プロセス」「プロセスID」「プロセスの親子関係」「子プロセスの生成」「ジョブ」「セッション」「フォアグラウンドジョブ」「バックグラウンドジョブ」について扱っています。...
Virtual Box & Linux(Part.20)| Linux プロセスの管理(2)| 現役エンジニア&プログラミングスクール講師Linuxのプロセス管理ついて記事にしています。「ps -lコマンド」と「topコマンド」(CPU利用状況)「freeコマンド」(メモリ利用状況)「プロセス管理のコマンド(プロセスの監視と終了)」「プロセス管理のコマンド(ジョブの管理)」「プロセスの優先度について扱っています。...

init / systemd プロセスの起動

ユーザースペースで最初に実行されるプロセス(PID 1)のことです。近年は init の代わりに systemd が使われることが主流となっています。

ここでは、次のような処理を行います。

  1. システム設定ファイルを読み込みます(例: /etc/inittab, /etc/systemd/)
  2. サービス(ネットワーク、ログ、ファイアウォールなど)を順に起動します
  3. ターゲット(以前のランレベル)に応じた起動処理
  4. 最終的にログインプロンプトや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 はサービスを停止することを示します。

問題点

サービスの順番による依存性:

  • SysVinitでは、サービスを順番に起動する必要があります。これにより、サービス間に依存関係がある場合、それを手動で設定しない限り、順番に依存しないように起動することができません。
  • 例えば、ネットワーク関連のサービスが遅くて時間がかかる場合、その後に起動するサービスもその遅れを待つことになり、最終的にシステム全体の起動が遅くなる可能性があります。

並行処理の欠如:

  • SysVinitでは、サービスは基本的に順番に起動されるため、並行処理や非同期処理が十分に活用されません。そのため、ひとつのサービスが長時間を要する場合、その後のサービスが全て待機状態になり、起動時間が長くなるという問題が発生します。

解決策としての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

Ubuntu(やその他のsystemdを使用するディストリビューション)では、ランレベルの代わりに「ターゲット」という概念が使われます。

今回は以上になります。

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST