3.1. システムの起動のプロセスとカスタマイズ

3.1. システムの起動のプロセスとカスタマイズ

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

電源起動からシステム化起動するまで以下のようなフローとなる。

BIOS/UEFI => ブートローダ => カーネル

BIOS/UEFI

BIOS/UEFIはマザーボードに焼き付けられた基本的な制御プログラムで、基本的な入出力管理を行う。
重要な動作としては起動デバイスのマスターブートレコードに格納されたブートローダを実行することがある。

  • BIOSのブートプロセス … BIOS → MBRのブートローダ → カーネル → init
  • UEFIのブートプロセス … UEFI → ESP(のブートローダ) → カーネル → init

UEFI

UEFIは以下の要素から構成される。

要素説明
EFI System Partition (ESP)UEFIシステムにおける物理的なマシンを起動、ファームウエアが読み込まれた後の起動シーケンスで最初にアクセスされる領域/boot/efiにマウントされFAT16またはFAT32でフォーマットされている必要がある
UEFIブートマネージャ起動情報(OSをどこからどのようにロードするか)を管理するプログラム
efibootmgrUEFIブートマネージャーの起動エントリをOS上から操作するコマンド

MBR/GPT

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

GPTでは起動ドライブに2TB以上割り当てることができる特徴があり、またブートローダはESPに格納される。 UEFIシステムパーティションではFATまたはVFATでフォーマットされる。

ブートローダ

ブートローダはマスターブートレコードに格納されて部分(第1部分)とそこから呼び出される部分(第2部分)に分かれている。
動作としては第1部分が第2部分のブートローダをロードしそれを起動する。また第2部分のブートローダは指定したパーティションからカーネルをロードし制御を移す。

Linuxで使用されるブートローダにはGRUB LegacyGRUB2がある。

カーネル

カーネルはinit(/sbin/init)を起動するもので、その過程で以下処理を行う。

  • 組み込まれたハードウェアの検出
  • メモリの初期化
  • システムクロックの設定
  • IRQの設定
  • ルートパーティションのマウント

またカーネル起動中のメッセージはdmesgコマンドで確認可能。

3.1.2. SysVinitの概要

サービスが起動する仕組みはこれまでSysVinitが主流であったが、現在ではSystemdという仕組みが主流となっている。

SysVinit

SysVinitではLinuxシステムで最初に実行されるinit/etc/inittabに従いシステムに必要なサービスを順次起動するものであった。
initのPIDは1番となりすべてのプロセスはinitの子プロセス/孫プロセスとなる。 起動のプロセスは以下の通り。

  1. initが/etc/inittabを読み込む
  2. initが/etc/rc.sysinitを読み込む
  3. initが/etc/rcを実行する
  4. /etc/rc/etc/rcN.d(Nはランレベル)ディレクトリ以下のスクリプトを実行する

なお/etc/inittabの書式は以下の通り。

1:1245:respawn:/sbin/mingetty tty2
  • 1 … ID
  • 1245 … ランレベル
  • respawn … アクション指示子
  • /sbin/migetty tty2 … 処理

アクション指示子は以下の通り。

アクション指示子意味
bootシステム起動時に実行され、プロセスの終了を待たずに次の処理を実行
bootwaitシステム起動時に一度実行され、プロセスが終了するまで次の処理を行わない
ctrlaltdelCtrl,Alt,Deleteキーが同時に押されるSIGINTがinitに送られた場合に実行する
initdefaultデフォルトのランレベルを指定する
once指定したランレベルになったときに一度だけ実行され、プロセスの終了を待たずに次の処理を行う
respawnプロセスが終了すれば再起動させる
sysinitシステム起動時にbootやbootwaitより先に実行
wait指定したランレベルになった時に1度のみ実行し、プロセス終了まで次の処理はしない

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

起動されるスクリプトはランレベルごとに異なる。
ランレベルごとに用意されているサービスは/etc/rc[0-6].dで確認できる。

サービスの起動は以下の書式の通り。

/etc/init.d/[サービス名] [コマンド]

起動スクリプトの主なコマンドは以下の通り。

コマンド説明
startサービスの開始
stopサービスの停止
restartサービスの再起動
condrestartサービスが起動している場合のみ再起動
status情報を表示する

なお各ランレベルに応じたスクリプトは/etc/rc[0-6].dに入っており、以下のようなファイル名となる。

S55sshd
K15httpd

Sは起動、Kは終了を意味する。
数字は実行順序、残りはサービス名を表す。

なおK→Sの順で実行される。

デフォルトのランレベル

SysVinitを採用したシステムでは以下の方法でデフォルトランレベルの指定ができる。

  • /etc/inittab
  • ブートローダの設定ファイルでのカーネル起動時に渡すコマンドラインパラメータ

serviceコマンド

RedHat系OSやUbuntuでは/etc/init.d/の代わりにserviceコマンドを使用できる場合がある。
具体的にはRed Hat(6.xまで)系ディストリビューションで使用できる

service [サービス名] [コマンド]

LSB

LSB(Linux Standard Base)はLinuxの内部構造を標準化するプロジェクト。
LSBでは以下仕様が決められている。

  • コマンド/標準ライブラリ
  • ファイルシステム階層構造
  • 印刷システム
  • X Window System

確認は以下コマンドで可能。

lsb_release -a

3.1.4. サービスの自動起動

ランレベルごとにサービスをデフォルトで起動させるもしくはさせないようにするには以下のような手法がある。

  • 手動でリンクを作成する
  • chconfigコマンドでの設定
  • update-rc.dコマンドでの設定

手動でリンクを作成

手動でリンクを作成するには/etc/rc[0-6].d以下に、自動に起動させたいサービスのシンボリックリンクの作成することで設定ができる。

chkconfigコマンド

chkconfigコマンドはRed Hat系(6.xまで)ディストリビューションで使用できるコマンド。
サービスの自動起動を設定することができる。

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

update-rc.dコマンド

update-rc.dコマンドはDebian系ディストリビューションで使用できるコマンド。
サービスの自動起動を設定することができる。

  • 自動起動設定を追加・削除できる
  • 優先順位を指定することができる

具体的にはランレベルごとにシンボリックリンクの作成/削除を行うことで実現する。

update-rc.d [オプション] [サービス名] remove
update-rc.d [オプション] [サービス名] [defaults] [NW | SNN kNN]
update-rc.d [オプション] [サービス名] start | stop NN ランレベル
オプション説明
-n表示するだけ何もしない
-f/etc/init.dにスクリプトがあっても強制的にシンボリックリンクを削除する
remove起動スクリプトのシンボリックリンクを削除する
defaultsデフォルトのスクリプトを作成する
start起動用のスクリプト(S)を作成する
stop停止用のスクリプト(K)を作成する
NN0~99の数字

intsservコマンド

intsservコマンドはSUSE系やVer6.0以降のDebian系のディストリビューションで使用できるコマンド。
サービスの自動起動を設定することができる。

insserv [オプション] [サービス名] # 自動起動設定
insserv -r [オプション] [サービス名] # 指定したサービスの自動起動を止める

3.1.5. systemdの概要

systemdの採用システムではinitプロセスの代わりにsystemdプロセスが起動しサービスを管理する。
systemdでは以下デーモンが連携して動作する。

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

systemdではシステムの処理は多数のUnitという処理単位で別れる。 Unitはいくつか種類があり、以下のような種類がある。

種類説明
service各種サービスの起動
device各種デバイスを表す
mountファイルシステムをマウントする
swapスワップ領域を有効にする
target複数のUnitをグループ化する

systemdの特徴は起動順序関係やサービスの依存関係を処理できることがある。 そのためシステム起動速度もSysVinitより速くなる。

systemdの起動順序

systemdではシステムが起動するとdefault.targetというUnitが処理される。
これは/etc/systemd/system/以下にある。

デフォルトのターゲットにシンボリックリンクを作成することで、デフォルトの起動方法を設定できる。

# グラフィカルログインの起動構成の例
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
ランレベルターゲット
0poweroff.target
1rescue.target
2,3,4multi-user.target
5graphical.target
6reboot.target

systemdのディレクトリ

ディレクトリ説明優先順位
/usr/lib/systemd/system永続的なユニット・ターゲットの定義ファイルが置かれるディレクトリ-
/etc/systemd/systemカスタム用のディレクトリ優先度が高い
/run/systemd/system再起動されると削除される/usr/lib/systemd/systemより高い

systemctlコマンド

systemdでサービスを管理するコマンドがsystemctlコマンドとなる。

systemctl [サブコマンド] [Unit名] [-t 種類]
サブコマンド説明
startサービスを起動する
stopサービスを終了する
restartサービスを再起動する
reloadサービス設定の再読み込みをする
statusサービス稼働状況の確認
is-activeサービスが稼働状態か確認する
enableシステム起動時にサービスを自動起動する
disableシステム起動時にサービスを自動起動しない
list-units起動しているUnitを表示する
list-unit-filesすべてのUnitを表示する
list-dependencies指定したサービスが必要とするUnitを表示する
get-defaultデフォルトターゲットを確認
set-defaultデフォルトターゲットを設定する
isolate他のUnitを停止して対象のUnitを起動

systemd-deltaコマンド

systemd-deltaコマンドはデフォルトの定義ファイルを上書きしている場合などにどのファイルがどのように影響を受けているか確認できるコマンド。
同じファイル名のユニット、ターゲットの定義ファイルが複数あり、上図のディレクトリの優先度に基づいてファイルを上書きした場合などに使用する。

systemd-delta

Unit設定ファイル

Unit設定ファイルは/etc/systemd/systemディレクトリ以下に配置される。
Unit設定ファイルはUnitServiceInstallのセクションに分かれる。 ファイルの構成は以下例のようになる。

[Unit]
Descriptions=HogeHoge
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
:

[Install]
WantedBy=multi-user.target

主なUnit設定ファイルのパラメータは以下の通り。

パラメータ説明
DescriptionUnitの説明
Documentationドキュメントの場所
Afterここに書かれたUnit以降に起動する
Beforeここに書かれたUnit以前に起動する
Wantsここに書かれたUnitが必要
Typeサービスのタイプ(simple, forking, oneshot, notify, dbus)
ExecStartPrestartでの実行前に実行するコマンド
ExecStartstartで実行するコマンド
ExecReloadreloadで実行するコマンド
ExecStopstopで実行するコマンド
WantedBysystemctl enable時に.wants以下にシンボリックリンクを作成
RequiredBysystemctl enable時に.required以下にシンボリックリンクを作成

systemdのログ

systemdを採用したシステム下ではjournalctlコマンドによりsystemdのログが確認可能。

journalctl [オプション]
オプション説明
-f末尾のログを表示し続ける
-n 行数指定した行数だけログの末尾を表示
-p [priolity]メッセージがpriority以上のものだけ表示
-rログを新しい順に表示
-u Unit名指定したUnitを表示
-fullプレーンテキストで表示
–no-pagerすべてのログを表示する