第7章 Linux システムの起動

目次

7.1. Linux の起動処理

概要

Linux システムの起動には、様々なコンポーネントや処理が関わっています。ハードウエア それ自身は BIOS または EFI で初期化され、その後にブートローダからカーネルを読み込み ます。この処理が終わると、制御はオペレーティングシステム側に移行し、 systemd での処理が始まります。 systemd では ターゲット と呼ばれる仕組みが用意されていて、日々の使用形態に沿った設定とシステムメンテナンス 作業時の設定の両方を、保持しておくことができるようになっています。

7.1. Linux の起動処理

Linux の起動処理は、それぞれ異なるコンポーネントで提供される複数のステージから 構成されています。下記の一覧では起動処理の概要と、利用されるコンポーネントのうち よく知られたものについて述べています:

  1. BIOS/UEFI.  コンピュータの電源を入れると、 BIOS や UEFI は画面とキーボードを初期化し、メイン メモリのテストを行ないます。この時点では、まだマスストレージメディア (ハード ディスクなど) にはアクセスを行ないません。また、現在の日時や重要な周辺機器に 関する情報を、 CMOS から読み込みます。 1 台目のハードディスクとそのジオメトリ 情報を読み込むと、システム処理は BIOS または UEFI からブートローダに渡されます。 なお、 BIOS/UEFI がネットワーク起動に対応している環境の場合、ブートローダを 提供するブートサーバを設定することもできます。 x86 システムでは PXE ブートを 行なう必要があります。その他のアーキテクチャでは、一般に BOOTP プロトコルを利用 してブートローダを取得します。

  2. ブートローダ.  1 台目のハードディスクにある冒頭の 512 バイトがメインメモリに読み込まれ、 そのセクタの冒頭にある ブートローダ の処理が始まります。 ブートローダで実行するコマンドは、残りの起動処理を行なうための作業になります。 そのため、 1 台目のハードディスクにある冒頭の 512 バイトは、 マスターブートレコード (MBR) と呼ばれます。 ブートローダはその後、実際のオペレーティングシステム (この場合は Linux カーネル) に処理を移します。 Linux のブートローダである GRUB について、 詳しくは 第9章 ブートローダ GRUB をお読みください。 ネットワークからの起動を行なう場合、 BIOS/UEFI がブートローダと して動作します。ブートサーバから起動イメージを読み込み、システムを起動する 動作です。これはローカルのハードディスクとは無関係に、完全に独立した形で 動作します。

  3. カーネルと initramfs システムの制御権を渡す目的で、ブートローダはカーネルと RAM ベースの 初期ファイルシステム (initramfs) をメモリ内に読み込みます。 initramfs の内容はカーネルから直接利用できる形式で、 init と呼ばれる小さな実行ファイルが含まれており、実際の ルートファイルシステムをマウントするまでの処理を行ないます。 マスストレージ (ハードディスクなど) にアクセスする際に特別なハードウエアドライバが 必要な場合、それらのドライバは initramfs 内に存在していなければ なりません。 initramfs について、詳しくは 7.1.1項 「initramfs をお読みください。 お使いのシステムにローカルのハードディスクが接続されていない場合、 initramfs にはカーネルに対応するルートファイルシステムが 指定されていなければなりません。これは iSCSI や SAN などのネットワークブロック デバイスでもかまいませんし、 NFS をルートデバイスとして指定することもできます。

    [Note]init プロセスの名称について

    一般的には、下記の 2 種類を init と表現します:

    1. ルートファイルシステムをマウントするための、 initramfs プロセス

    2. システム自身を設定するための、オペレーティングシステムのプログラム

    本章では、前者を initramfs 内の init と表現し、後者を systemd と表現しています。

  4. initramfs 内の init このプログラムは正しいルートファイルシステムをマウントするために必要な処理を 全て行なうもので、必要なファイルシステム向けのカーネル機能を提供したり、 udev を利用してマスストレージ (ハードディスク) コントローラを読み込む機能を提供したりしています。 ルートファイルシステムが検出されると、エラーがないか どうかをチェックして、マウントを行ないます。マウントが成功すると initramfs は解放され、ルートファイルシステム内の systemd を実行します。 initramfs 内の init について、さらに詳しい情報は 7.1.2項 「initramfs 内の init をお読みください。 また、 udev について詳しくは 第12章 udev による動的なカーネルデバイス管理 をお読みください。

  5. systemd systemd は実際のシステム起動処理と、その他のファイルシステムに関する マウント処理を行ないます。 systemd に関する詳しい説明は、 第8章 systemd デーモン をお読みください。

7.1.1. initramfs

initramfs は小さな cpio 形式のアーカイブで、カーネルは このアーカイブを RAM 内に読み込むことができます。このアーカイブは、実際のルート ファイルシステムがマウントされるまでに必要な、最小限の Linux 環境です。この最小限の Linux 環境は BIOS や UEFI ルーチンからメモリ内に読み込まれるもので、十分なメモリサイズが 存在すること以外に、ハードウエアに対する要件がありません。また initramfs のアーカイブには、ルートファイルシステム内の systemd プログラムを呼び出すことのできる、 init と 呼ばれる実行形式が存在しなればなりません。

ルートファイルシステムがマウントできるようになり、オペレーティングシステムが 起動できる状態になるよりも前の段階で、カーネルはルートファイルシステムが 配置されているデバイスにアクセスするため、必要なドライバを読み込む必要があります。 これらのドライバは、ハードディスクドライブの種類に対応した特別なドライバか、 もしくはネットワークファイルシステムにアクセスするためのネットワークドライバ の形式になっています。つまり、ルートファイルシステムにアクセスするのに必要な モジュールは initramfs 内の init によって読み込まれることになります。モジュールを読み込んだ後は、 udevinitramfs とそれに必要なデバイスを提供します。ルートファイルシステムへの変更が完了した後は、 デバイスを再生成する必要があります。この処理は systemdudev.service が実施するもので、 udevtrigger のコマンドを実行することで実現しています。

インストール済みのシステムに対してハードウエア (たとえばハードディスク) の 変更を行なう必要があり、カーネルが起動する際に今とは異なるドライバを読み込む 必要がある場合は、 initramfs を更新しなければなりません。 この作業は、 mkinitrd を呼び出すことで行なうことができます。なにも パラメータをつけずに mkinitrdを実行すると、 initramfs を生成します。 mkinitrd -R と入力すると、 init という実行ファイルを生成します。 openSUSE® では、 読み出すべきモジュールの一覧を /etc/sysconfig/kernel ファイル内の INITRD_MODULES で指定します。 インストールが完了すると、上記の変数は自動的に正しい値に設定されます。 各モジュールは INITRD_MODULES 内に記述した順に 読み込まれます。

[Important] initramfsinit の更新

ブートローダは initramfsinit を、 カーネルと同じ方法で読み込みます。 initramfsinit を更新した場合でも、 GRUB を再インストールする必要は ありません。これは GRUB が起動する際に正しいファイルを検索する仕組みを 備えているためです。

7.1.2. initramfs 内の init

initramfs 内にある init は、 実際のルートファイルシステムをマウントするための準備作業と、実際のルート ファイルシステムへのアクセス作業を主な目的としています。お使いのシステム設定に よって、 initramfs 上の init は それぞれ下記のような作業を行ないます。

カーネルモジュールの読み込み

お使いのハードウエア設定によって、お使いのコンピュータのハードウエアに アクセスするためのドライバが必要となります (最も重要なコンポーネントは ハードディスクです) 。また、最終的なルートファイルシステムにアクセスする ため、カーネルでは適切なファイルシステムドライバも必要です。

ブロックスペシャルファイルの提供

それぞれ読み込んだカーネルモジュールでは、デバイスイベントを生成します。 udev はこれらのイベントを処理し、 必要なブロックスペシャルデバイスを /dev 内にある RAM ファイルシステム内に作成します。 これらのスペシャルファイルが存在しないと、ファイルシステムやその他の デバイスにアクセスすることができません。

RAID と LVM の設定管理

お使いのシステムにおけるルートファイルシステムが RAID や LVM の管理下に ある場合、 initramfs 内の init は LVM や RAID を設定し、後にアクセスすることになるルートファイル システムを読み込むことができるようにします。 RAID や LVM について、詳しくは 第3章 高度なディスク設定 をお読みください。

ネットワーク設定の管理

お使いのシステムでネットワークマウント型のルートファイルシステム (NFS を 介したマウント) を利用している場合、 initramfs 内の init は適切なネットワークドライバを読み込み、ルート ファイルシステムへのアクセス手段を準備しなければなりません。

ファイルシステムが iSCSI や SAN のようなネットワークブロックデバイス上に 存在する場合は、 initramfs 内の init でストレージサーバへの接続も設定する必要があります。

インストール作業の初期段階で initramfs 内の init が呼び出された場合は、上述の手順とは異なる 下記の手順が行なわれます:

インストールメディアの検出

インストール処理を開始する際、お使いのマシンはインストールメディア上にある インストール用のカーネルと、 YaST インストーラの存在する init を読み込みます。YaST インストーラは RAM ファイル システム内で動作するもので、インストールメディアにアクセスしてインストール作業を 行ないます。そのため、その場所に関する情報を事前に知っておく必要があります。

ハードウエアの検出と適切なカーネルモジュールの読み込み

7.1.1項 「initramfs に示しているとおり、起動処理は多くの ハードウエア環境で動作するドライバを含んだ最低限のドライバセットで行なわれます。 init はお使いのハードウエア環境での適切なドライバを 判断するため、初期の ハードウエア検出処理を行ないます。起動処理に必要であると判断したモジュール 名は、 /etc/sysconfig/kernel 内の INITRD_MODULES に書き込まれます。モジュール名の 一覧は、システムを起動する際に使用するカスタムな initramfs の作成に利用します。起動時には必要がないものの、あとから読み出す必要があるモジュール については、 /etc/sysconfig/hardware/hwconfig-* 内に書き込まれます。このディレクトリ内の設定ファイル内に記述された 全てのデバイスは、起動処理で初期化されます。

インストールシステムの読み込み

ハードウエアを正しく検出して適切なドライバが読み込まれると、 udev はスペシャルデバイスファイルを 作成し、 init は実際の YaST インストーラである インストールシステムを起動します。

YaST の起動

最後に init は YaST を起動し、パッケージの インストールやシステムの設定を行ないます。


openSUSE リファレンス 13.1