カーネルは起動されると、高度にハードウェアを認識・制御し、ルートファイルシステムのマウントなど様々な初期化処理を行います。
ブートローダはカーネルと初期RAMディスク(initramfs)の内容をメモリ上に展開し、カーネルはメモリ上に展開された初期RAMディスク内の、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムをマウントします。その後、initという特別な最初のプロセスをルートファイルシステムから起動します。
「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、initプロセスとして「/sbin/init」が起動されます。なお、カーネルはブートローダの次に起動されます。
カーネルのログが記録されるなど、Linuxでメインで使用されるログファイルは「/var/log/messages」です。
システム起動時には様々なメッセージが出力されます。起動時に出力されたメッセージは後からdmesgコマンドで確認できます。
以下はdmesgコマンドの出力例です。
dmesgコマンドはカーネルが出力するメッセージが格納されるリングバッファの内容を出力します。
リングバッファはマシンの再起動やシャットダウンによってリセットされますが、運用中に一杯になると古い情報から上書きされていきます。手動でリングバッファの内容をクリアするには、rootユーザで「dmesg --clear」を実行します。
UpstartはSysVinitを改善した新しい仕組みです。Red Hat Enterprise Linux(RHEL)やUbuntuに採用されていましたが、現在はsystemdへの置き換えが進められています。
Upstartではバックグラウンドで動作するデーモンプロセス(サービス)や、一度だけ実行させたい処理(タスク)を「ジョブ」と呼び、ジョブ単位で起動処理の管理を行います。
Upstartは各ジョブの実行に必要な前提条件を「イベント」で管理し、前提条件がすべて成立した時点でジョブを実行します。SysVinitのように順次起動していくのと異なり、サービスの起動に必要な条件が成立した時点で起動処理が行われるため不要な待機時間がなくなります。また、各ジョブの実行がパラレル(並列)に行われるため、関連のない独立したサービスは同時に起動させることができます。
イベントはシステム上の変化を検知するだけではなく、initctlコマンドで発行することもできます。
systemdの管理にはsystemctlコマンドを使用します。systemctlコマンドの書式は以下のとおりです。
systemctl サブコマンド [ Unit名 ]
主なサブコマンドの一覧
Linuxが何らかの原因で正常に起動できない場合、CD-ROM/DVDやUSBなどのインストールブートメディアからレスキューモードでシステムを起動することができます。
レスキューモードで起動できた場合は、CPU/メモリといったハードディスク以外の装置には問題がないと考えられますので、レスキューモードで起動したシステムから起動に失敗するハードディスクのファイルシステムをマウントできるかを確認します。
レスキューモードでファイルシステムを正常にマウントできた場合は、「/var/log」配下のログでエラーを確認したり、重要なファイルを取り出せる可能性があります。
一般的なLinuxシステムでは、BIOS/UEFI、ブートローダ、カーネル、initの順にブートプロセスが進行します。
BIOS/UEFI → ブートローダ → カーネル → init
「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、カーネルから起動されるinitプロセスとして「/sbin/init」を起動します。initは起動されると、設定ファイル「/etc/inittab」の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行います。
systemdで扱う処理はUnitという単位で管理します。Unitには各機能ごとに拡張子が割り当てられており、拡張子を見ることでどういった機能のためのUnitかが判別できるようになっています。
各サービスの稼働状況や起動設定を管理するにはsystemctlコマンドを使用します。systemctlコマンドの書式は以下のとおりです。
systemctl サブコマンド [ Unit名 ]
※Unit名に拡張子がない場合、.serviceの拡張子を持つUnitが指定されたものとみなされます
主なサブコマンドの一覧