LinuC Level1 v10.0 対策コース(パート1)3/39
Linux システムの起動と停止
この記事では、Linuxシステムの起動と停止に関する詳細な解説を行います。Linuxシステムの起動プロセスを正確に理解することは、システム管理者やエンジニアにとって非常に重要です。そのため、まずはLinuxシステムが起動するまでの一連の手順であるブートシーケンスについてしっかりと理解しましょう。
Linuxシステムの起動
Linuxシステムを起動することをboot(ブート)と呼び、 起動するまでの流れをブートシーケンス と呼びます。
ブートシーケンスの概要
システムを起動するプロセスは「 ブート(boot) 」と呼ばれます。ブートシーケンスとは、システムのブートからログイン画面が表示されるまでの一連のプロセスを指します。このプロセスの大まかな流れとしては、まずBIOSまたはUEFIの起動が行われ、次にブートローダへの制御移行、カーネルの実行、ルートファイルシステムのマウント、システムを管理するデーモンプログラムの起動、そしてネットワークの設定と進んでいきます。ブートシーケンスを理解することは、OS全体を理解する上で重要であり、システムエラーが発生した際に適切に対処するためにも必要となります。
BIOS/UEFI
BIOSは、PCの電源が入った時に最初に起動するプログラムで、PCに設定された優先順位に従い、ブートメディアに存在するMBR(Master Boot Record)からブートローダを検索し、最初に見つけたブートローダを起動します。
UEFIは、OS(Operating System)とファームウェア(BIOS)間の仕様を定めて拡張したものです。もとはBIOSのみでしたが、システムの発展に伴いUEFIが誕生しました。これにより大容量ディスクの対応、セキュリティの強化、ネットワークを介したリモート診断といった機能が拡張されました。UEFIからのブート時には、不揮発性メモリ(NVRAM : Non-Volatile RAM)に設定された優先順位に基づき、ディスクのEFIパーテーションに格納されているブートローダが起動します。
ブートローダ
ブートローダは、カーネル(具体的にはvmlinuz)とinitramfsをディスクからメモリにロードし、その後にカーネルを起動するという重要な役割を果たします。
Linuxのディストリビューションにおいては、GRUB2というブートローダが広く採用されています。これはBIOSとUEFIの両方に対応しているため、さまざまなハードウェア環境で利用可能です。
カーネル
カーネルはディレクトリ /boot/vmlinuz
に存在し、システム起動時にブートローダからメモリにロードされ、以降はメモリ内に常駐します。それはCPUやメモリのシステムリソースの管理、デバイスの制御、プロセスのスケジューリング等を担当します。カーネルはOSの根幹となるシステムで、オペレーティングシステムの機能、パフォーマンス、セキュリティの基盤を決定し、OSの性格や特徴そのものを形成します。
カーネルの構成は、核となる部分(プロセス管理、ユーザー管理、時刻管理、メモリ管理を担当)と、コンパイル時に静的に核にリンクされるカーネルモジュール、そして起動後に必要に応じて動的にメモリに読み込まれて利用されるローダブルカーネルモジュール(これらは /lib/modules/version/kernel
に格納されています)によって構成されています。
カーネルの初期化
カーネルは起動時に初期化処理を行います。具体的には、ページング機構、スケジューラー、割り込みベクターテーブル、タイマーなどの初期設定を実施します。
initramfs
initramfsはカーネルと一緒にメモリに読み込まれるファイルで、ルートディレクトリ(/)へのルートファイルシステムのマウントに使用されます。このファイルは、カーネルの解凍と初期化が終わった後に展開され、一時的なルートディレクトリとしてマウントされます。initramfsにはシステムの起動に必要なデバイスドライバが含まれており、これを利用してデバイスにアクセスします。その後、systemd(あるいは他のinitプログラム)が起動し、最終的にディスク内のルートディレクトリがマウントされます。
systemdの再実行
カーネルはメモリの初期化やシステムクロックの設定を行った後、initramfsをマウントし、ディスク内のルートファイルシステムに含まれる /sbin/init
を再実行します。/sbin/init
は /lib/systemd/systemd
のシンボリックリンクであるため、結果的にsystemdが起動します。systemdは設定ファイルを参照し、起動シーケンスを実行して各種のサービスを立ち上げます。
ログイン
systemdが再実行され、ログイン画面が表示された時点で、ブートシーケンスは完了となります。次に、ブートシーケンス完了後のLinuxシステムの再起動と停止について詳しく説明します。
Linuxシステムの再起動・停止
Linuxシステムを再起動あるいは停止する際には、対象となるシステムのターゲットを指定します。ここで言う「ターゲット」とは、ファイルシステムのマウント、ネットワークやPCの起動のシステム管理、サービスの管理など、関連する操作をグループ化して定義したものを指します。
システムのターゲットを変更するには、 systemctl
コマンドを使います。
引数にターゲットとサブコマンドを指定するコマンド、サブコマンドのみを指定するコマンド、そして以前に使用されていたSysVinit互換コマンドがあります。
systemctlを使った再起動と停止
# systemctl を使った再起動と停止
systemctl reboot # 再起動
systemctl halt # 停止
systemctl poweroff # 電源OFF
systemctl
コマンドを使用すると、systemctl
はD-Busを介してsystemdに対して「halt」、「poweroff」、「reboot」のようなメッセージを送信します。systemdは受け取ったメッセージに応じて、対象となるユニットに停止処理を実行します。ここで「ユニット(unit)」とは、systemdによって管理されるシステムの要素のことで、それらは12の異なるタイプに分類され、それぞれがサービスの運用において重要な役割を果たしています。
initを使った再起動と停止
# init を使った再起動と停止
init 6 # 再起動
init 0 # 電源OFF
init
コマンドはsystemdへのシンボリックリンクになっており、D-Busを介すことなく直接systemdを実行します。
SysVinit 互換コマンドを使った再起動と停止
# SysVinit 互換コマンド
reboot # 再起動
halt # 停止
shutdown # マシンの停止 = 電源OFF 再起動
SysVinit互換コマンドはsystemctlコマンドへのシンボリックリンク となっています。このことから、 systemctlは実行されたコマンドに対応した処理を実行 します。その結果として、現在ではSysVinitコマンドはsystemctlと同じような機能を持つようになりました。
まとめ
本記事では、Linuxシステムの起動と停止について詳しく解説しました。ブートシーケンスはブートしてからログイン画面が表示されるまでの一連の流れを指し、この流れを理解することはOSを深く理解する上で重要な要素です。また、OSにトラブルが発生した際の対処能力も向上させるでしょう。
ブートシーケンスの各ステージを理解することで、Linuxシステムの起動や停止に関する知識が豊富になります。本記事では、BIOS/UEFIの役割、ブートローダの機能、カーネルとその初期化、initramfsの使い方、そしてsystemdの再実行について説明しました。これらの要素が組み合わさって、Linuxシステムの起動と停止が行われます。
初学者がLinuxを学ぶ上で、ブートシーケンスの理解は非常に重要です。Linuxシステムの起動と停止に関する知識を習得することで、システム管理やトラブルシューティングのスキルが向上し、より高度なLinux操作が可能となります。
記事の内容は理解できましたか?