IT

システム起動プロセス【LPIC level2】

目次

  • システム起動プロセス
  • ブートからカーネル起動まで
  • SysVinitの概要
  • 起動スクリプトとランレベル
  • サービスの自動起動
  • systemdの概要
  • systemdの起動手順
  • systemctlコマンドによるサービスの管理
  • systemdのログ

システム起動プロセス

ブートからカーネルの起動まで

電源を入れるとBIOS/UEFIが起動し、次にブートローダが起動します。

BIOS(Basic Input Output System)

BIOSは、最も基本的な制御プログラムであり、基本的な入出力の管理を行います。

電源が投入されると不揮発性メモリに格納されているBIOSが実行され以下の作業を行います。

  • メモリのチェック
  • ハードウェア設定の読み込み
  • 起動デバイスのチェック
  • 起動デバイスのマスターブートレコード内に格納されたブートローダを実行します。

UEFI

UEFIとは、従来のシステムBIOSの代替となる規格です。

UEFIでは、一部OSにおける起動ドライブの容量制限がなくなったり、GUIベースのセットアップ画面が利用できる製品もあるなど様々な拡張が行われています。

MBR/GPT

BIOSでは、起動デバイスの最初のセクタであるMBR(マスターブートレコード)でパーティションを管理します。

MBRには、OSを起動するプログラムであるブートローダの一部と、基本パーティションの情報を収めたパーティションテーブルが含まれています。

UEFIでは、GPTでパーティションを管理します。

GPTパーティションでは起動ドライブに2TB以上を割り当てることが出来ます。

ブートローダはUEFIシステムパーティションに格納されます。

EFIシステムパーティションはFATでフォーマットされ、/boot/efiディレクトリにマウントされます。

ブートローダ

ブートローダは基本的に、マスターブートレコードに格納される部分とそこから呼び出される部分に呼び出される部分に分かれています。

これは、マスターブートレコードの中に格納されるブートローダのサイズが制限されているために、ブートローダ全体の格納することが出来ないからです。

第一段階のブートローダは第二段階のブートローダをロードし、第二段階のブートローダを起動します。

第二段階のブートローダは指定されたパーティションからカーネルをロードし、カーネルへ制御を渡します。

Linuxでよく利用されるブートローダには、GRUB Legacyや後継のGRUB2があります。

カーネル

カーネルは、組み込まれているハードウェアの検出、メモリの初期化、システムクロックの設定、IRQの設定、ルートパーティションのマウントなどを行い、最後にinitプログラムを実行します。

なお、カーネル起動中に表示される様々なメッセージは、起動後にdmesgコマンドで確認することが出来ます。

SysVinitの概要

サービスが起動する仕組みは、この数年で大きく変わりました。

これまでは、UNIX系OS全般で広く使われてきたSysVinitが主流でした。しかし現在では、systemdという新しい起動の仕組みが主流になっています。

SysVinitでは、Linuxシステムで最初に実行されるプロセスであるinitが、/etc/inittabファイルの設定に従い、システムに必要なサービスを順次起動していきます。

initは最初のプロセスであり、PIDは1です。init以後に開始されるすべてのプロセスはinitの子/孫プロセスです。

一般的な流れは、以下の通りです。

  1. initが/etc/inittabファイルを読み込む
  2. initが/etc/rc.sysinitスクリプトを読み込む
  3. initが/etc/rcスクリプトを実行する。
  4. /etc/rcスクリプトが「/etc/rcランレベル.d」ディレクトリ以下のスクリプトを実行します。

起動スクリプトとランレベル

通常、起動されるサービスはランレベルごとに異なります。

ランレベルごとにどのようなサービスが用意されているかは、/etc/rc[0-6].dディレクトリを見ると分かります。

書式:/etc/init.d サービス名 コマンド

以下、起動スクリプトの主なコマンドです。

コマンド説明
startサービス開始
stopサービスの終了
restartサービスの再起動
condrestartサービスが起動している場合のみ再起動する
status状態を表示する。

サービスの自動起動

ランレベルごとにどのサービスをデフォルトで起動するかは、いくつかの方法で設定できます。

手動でリンクを作成

/etc/rc[0-6].dディレクトリ以下に、自動的に起動させたいサービスの起動スクリプトのシンボリックリンクを作成することが出来ます。

chkconfigコマンド

RedHat系ディストリビューションでは、サービスの自動起動を設定するツールとしてchkconfigコマンドが用意されています。

オプション説明
–listサービスの自動起動設定をランレベルごとに表示する
–level レベルランレベルを指定する
–addサービスを追加登録する
–delサービスを削除する

update-rc.dコマンド

Debian系ディストリビューションでは、update-rc.dコマンドを利用することが出来ます。

systemdの概要

systemdを採用したシステムでは、initプロセスの代わりにsystemdプロセスが起動し、各種サービスを管理します。

systemdでは、以下のように複数のデーモンプロセス(常駐プロセス)が連携して動作します。

プロセス説明
systemdsystemdのメインプロセス
systemd-journalジャーナル(ログ)管理プロセス
systemd-logindログイン処理プロセス
systemd-udevdデバイス動的検知プロセス

systemdでは、システムの起動処理は多数のUnitと呼ばれる処理単位に分かれています。

Unitには、あるサービスを起動するUnitや、ファイルシステムをマウントするUnitなどがあります。

以下、主なUnitの種類です

拡張子説明
service各種サービスを起動する
device各種デバイスを表す(udevのデバイス認識により自動作成)
mountファイルシステムをマウントする(/etc/fstabより自動作成)
swapスワップ領域を有効にする(/etc/fstabより自動作成)
target複数のUnitをグループ化する

systemdの起動手順

システムが起動すると、まずdefault.targetというUnitが処理されます。

ランレベルターゲット
0poweroff.target
1rescue.target
2、3、4multi-user.target
5graphical.target
6reboot.target

systemctlコマンドによるサービス管理

systemdでサービスを管理するには、systemctlコマンドを使います。

サブコマンド説明
startサーニスを起動する
stopサービスを終了する
restartサービスを再起動する
reloadサービスの設定を再読み込みする
statusサービスの稼働状況を表示する
is-activeサービスが起動しているかどうかを確認する
enableシステム起動時にサービスを自動起動する。
disableシステム起動時にサービスを自動起動しない
list-units起動しているUnitを表示する
list-unit-filesすべてのUnitを表示する
list-dependencies指定したサービスが必要とするUnitを表示する

systemdのログ

systemdを採用したシステムでは、journalctlコマンドを使ってsystemdのログを閲覧できます。

オプション説明
-fログの末尾を表示し続ける
-n 行数指定した行数だけログの末尾を表示する
-p priorityメッセージのプライオリティがpriorityのものだけを表示する
-rログを新しい順に表示する(デフォルトは古いものから)
-u Unit名指定したUnitのログを出力する
–fullエスケープ文字を除いてプレーンテキストで出力する
–no-pager1ページごとに表示せずすべてのログを出力する

最後まで読んで頂き、ありがとうございました。

他の分野へ移動できる全体ページへは以下リンクからお願いします。