概要
Linux システムの起動には、様々なコンポーネントや処理が関わっています。ハードウエア
それ自身は BIOS または EFI で初期化され、その後にブートローダからカーネルを読み込み
ます。この処理が終わると、制御はオペレーティングシステム側に移行し、
systemd
での処理が始まります。 systemd
では 「ターゲット」
と呼ばれる仕組みが用意されていて、日々の使用形態に沿った設定とシステムメンテナンス
作業時の設定の両方を、保持しておくことができるようになっています。
Linux の起動処理は、それぞれ異なるコンポーネントで提供される複数のステージから 構成されています。下記の一覧では起動処理の概要と、利用されるコンポーネントのうち よく知られたものについて述べています:
BIOS/UEFI. コンピュータの電源を入れると、 BIOS や UEFI は画面とキーボードを初期化し、メイン メモリのテストを行ないます。この時点では、まだマスストレージメディア (ハード ディスクなど) にはアクセスを行ないません。また、現在の日時や重要な周辺機器に 関する情報を、 CMOS から読み込みます。 1 台目のハードディスクとそのジオメトリ 情報を読み込むと、システム処理は BIOS または UEFI からブートローダに渡されます。 なお、 BIOS/UEFI がネットワーク起動に対応している環境の場合、ブートローダを 提供するブートサーバを設定することもできます。 x86 システムでは PXE ブートを 行なう必要があります。その他のアーキテクチャでは、一般に BOOTP プロトコルを利用 してブートローダを取得します。
ブートローダ. 1 台目のハードディスクにある冒頭の 512 バイトがメインメモリに読み込まれ、 そのセクタの冒頭にある ブートローダ の処理が始まります。 ブートローダで実行するコマンドは、残りの起動処理を行なうための作業になります。 そのため、 1 台目のハードディスクにある冒頭の 512 バイトは、 マスターブートレコード (MBR) と呼ばれます。 ブートローダはその後、実際のオペレーティングシステム (この場合は Linux カーネル) に処理を移します。 Linux のブートローダである GRUB について、 詳しくは 第9章 ブートローダ GRUB をお読みください。 ネットワークからの起動を行なう場合、 BIOS/UEFI がブートローダと して動作します。ブートサーバから起動イメージを読み込み、システムを起動する 動作です。これはローカルのハードディスクとは無関係に、完全に独立した形で 動作します。
カーネルと initramfs
.
システムの制御権を渡す目的で、ブートローダはカーネルと RAM ベースの
初期ファイルシステム (initramfs
) をメモリ内に読み込みます。
initramfs
の内容はカーネルから直接利用できる形式で、
init
と呼ばれる小さな実行ファイルが含まれており、実際の
ルートファイルシステムをマウントするまでの処理を行ないます。
マスストレージ (ハードディスクなど) にアクセスする際に特別なハードウエアドライバが
必要な場合、それらのドライバは initramfs
内に存在していなければ
なりません。 initramfs
について、詳しくは
7.1.1項 「initramfs
」 をお読みください。
お使いのシステムにローカルのハードディスクが接続されていない場合、
initramfs
にはカーネルに対応するルートファイルシステムが
指定されていなければなりません。これは iSCSI や SAN などのネットワークブロック
デバイスでもかまいませんし、 NFS をルートデバイスとして指定することもできます。
init プロセスの名称について | |
---|---|
一般的には、下記の 2 種類を 「init」 と表現します:
本章では、前者を 「 |
initramfs
内の init
.
このプログラムは正しいルートファイルシステムをマウントするために必要な処理を
全て行なうもので、必要なファイルシステム向けのカーネル機能を提供したり、
udev
を利用してマスストレージ
(ハードディスク) コントローラを読み込む機能を提供したりしています。
ルートファイルシステムが検出されると、エラーがないか
どうかをチェックして、マウントを行ないます。マウントが成功すると
initramfs
は解放され、ルートファイルシステム内の
systemd
を実行します。 initramfs
内の
init
について、さらに詳しい情報は
7.1.2項 「initramfs
内の init
」 をお読みください。 また、
udev
について詳しくは
第12章 udev
による動的なカーネルデバイス管理 をお読みください。
systemd
.
systemd
は実際のシステム起動処理と、その他のファイルシステムに関する
マウント処理を行ないます。 systemd
に関する詳しい説明は、
第8章 systemd
デーモン をお読みください。
initramfs
¶
initramfs
は小さな cpio 形式のアーカイブで、カーネルは
このアーカイブを RAM 内に読み込むことができます。このアーカイブは、実際のルート
ファイルシステムがマウントされるまでに必要な、最小限の Linux 環境です。この最小限の
Linux 環境は BIOS や UEFI ルーチンからメモリ内に読み込まれるもので、十分なメモリサイズが
存在すること以外に、ハードウエアに対する要件がありません。また
initramfs
のアーカイブには、ルートファイルシステム内の
systemd
プログラムを呼び出すことのできる、 init
と
呼ばれる実行形式が存在しなればなりません。
ルートファイルシステムがマウントできるようになり、オペレーティングシステムが
起動できる状態になるよりも前の段階で、カーネルはルートファイルシステムが
配置されているデバイスにアクセスするため、必要なドライバを読み込む必要があります。
これらのドライバは、ハードディスクドライブの種類に対応した特別なドライバか、
もしくはネットワークファイルシステムにアクセスするためのネットワークドライバ
の形式になっています。つまり、ルートファイルシステムにアクセスするのに必要な
モジュールは initramfs
内の init
によって読み込まれることになります。モジュールを読み込んだ後は、
udev
が initramfs
とそれに必要なデバイスを提供します。ルートファイルシステムへの変更が完了した後は、
デバイスを再生成する必要があります。この処理は systemd
の
udev.service
が実施するもので、 udevtrigger
のコマンドを実行することで実現しています。
インストール済みのシステムに対してハードウエア (たとえばハードディスク) の
変更を行なう必要があり、カーネルが起動する際に今とは異なるドライバを読み込む
必要がある場合は、 initramfs
を更新しなければなりません。
この作業は、 mkinitrd を呼び出すことで行なうことができます。なにも
パラメータをつけずに mkinitrdを実行すると、
initramfs
を生成します。
mkinitrd -R
と入力すると、
init
という実行ファイルを生成します。 openSUSE® では、
読み出すべきモジュールの一覧を /etc/sysconfig/kernel
ファイル内の INITRD_MODULES
で指定します。
インストールが完了すると、上記の変数は自動的に正しい値に設定されます。
各モジュールは INITRD_MODULES
内に記述した順に
読み込まれます。
initramfs や
init の更新
| |
---|---|
ブートローダは |
initramfs
内の init
¶
initramfs
内にある init
は、
実際のルートファイルシステムをマウントするための準備作業と、実際のルート
ファイルシステムへのアクセス作業を主な目的としています。お使いのシステム設定に
よって、 initramfs
上の init
は
それぞれ下記のような作業を行ないます。
お使いのハードウエア設定によって、お使いのコンピュータのハードウエアに アクセスするためのドライバが必要となります (最も重要なコンポーネントは ハードディスクです) 。また、最終的なルートファイルシステムにアクセスする ため、カーネルでは適切なファイルシステムドライバも必要です。
それぞれ読み込んだカーネルモジュールでは、デバイスイベントを生成します。
udev
はこれらのイベントを処理し、
必要なブロックスペシャルデバイスを
/dev
内にある RAM ファイルシステム内に作成します。
これらのスペシャルファイルが存在しないと、ファイルシステムやその他の
デバイスにアクセスすることができません。
お使いのシステムにおけるルートファイルシステムが 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 インストーラである
インストールシステムを起動します。
最後に init
は YaST を起動し、パッケージの
インストールやシステムの設定を行ないます。