3.システムの起動と管理

Linuxシステムの起動/動作に関する詳細

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すべてのログを表示する

3.2. システムのリカバリ

システムがハードディスクから起動できなくなった場合は、インストールCD/DVD ROM内臓のレスキューモードで起動してシステムを修復する。 レスキューモードで起動すると、ハードディスクのルートファイルシステムは/mnt/sysimageにマウントされる。

この場合、一部コマンドが正常に動作しなくなるため、実行させるにはルートディレクトリを指定する必要がある。 なおレスキューモードの終了はexitで可能。

rpm -qf --root /mnt/sysimage

3.2.1. chrootコマンド

chrootコマンドはルートディレクトリを指定してコマンドを実行できたり、ルートディレクトリを変更できたりするコマンド。

chroot [ディレクトリ] [コマンド [引数]]

3.2.1. 壊れたGRUBを再インストールする例

# ルートディレクトリを指定する
chroot /mnt/sysimage

# 

3.3. ブートローダ

ブートローダはカーネルをディスク上から読み取りシステムを起動するためのプログラムのこと。 ブートローダでは以下のことが実現できる。

  • OSの切り替え
  • 複数バージョンのカーネルの使い分け

代表的なブートローダにはGRUBLILOがある。

3.3.1. GRUB

GRUB(GRand Unified Bootloader)は多くのディストリビューションで標準利用されているブートローダ。 以下のような特徴がある。

  • 多数のファイルシステムを認識可能
  • シェル機能を搭載しコマンドにより高度管理が可能

GRUBには昔から使われているGRUB Legacyと新たに設計し直されたGRUB 2がある。

3.3.2. Grub Legacy

Grub Legacyは昔から使われている古いタイプのGRUB。 Grub Legacyは3つのステージで構成される。

ステージ説明
1MBR内に配置されたステージ1,5または2をロードするプログラム
1.5ステージ2を見つけてロードするためのプログラム
2/boot/grubディレクトリ以下にあるGRUB本体

ブートローダとしてGRUBをインストールするにはgrub-install(grub2-install)コマンドを実行する。 またGRUB Legacyの設定ファイルは/boot/grub/menu.lstとなる。

/boot/grub/menu.lst

menu.lstの設定パラメータは以下の通り。

パラメータ説明
timeメニューを表示している時間(秒)
defaultデフォルトで起動するエントリ番号
splashimageメニュー表示時の背景画面
titleメニューに表示されるエントリ名
rootカーネルイメージ/OSが格納されたパーティションの指定
kernelカーネルイメージとカーネルオプションの指定
initrd初期RAMディスクファイルの指定
makeactiveルートパーティションをアクティブ化
chainloader指定されたセクタの読み込みと実行
hiddenmenu起動時の選択メニューを表示しない

grubコマンド

grubコマンドはGRUBシェルと呼ばれる対話型コマンド。

grub

grubシェルで利用できるコマンドは以下の通り。

3.3.3. GRUB2

GRUB2は最近のディストリビューションで採用されているGRUB。 設定ファイルの配置は以下の通り。

  • BIOS機 … /boot/grub/grub.cfg
  • UEFI搭載機 … /boot/efi/EFI/[ID]/crub.cfg

設定はファイルは直接変更せずに/etc/default/grubファイルでを用いて操作する。 grub-mkconfigコマンド(grub2-mkconfigコマンド)を使用してgrub.cfgを作成できる。

なお/etc/default/grubファイルの設定パラメータは以下の通り。

パラメータ説明
GRUB_DEFAULTデフォルトで起動するOS番号/タイトル
GRUB_HIDDEN_TIMEOUTメニューを表示せず待機する時間
GRUB_HIDDEN_TIMEOUT_QUIETtrueでメニュー表示なし、falseであり
GRUB_TIMEOUTデフォルトOS起動までの秒数
GRUB_CMDLINE_LINUX_DEFAULTブートオプション
GRUB_CMDLINE_LINUXカーネルに渡すオプション

3.3.4. 起動オプションの指定

ブートローダは起動時にカーネル/ブートローダのinitプログラムに渡すオプションパラメータを指定可能。 GRUBの場合はメニュー画面で「e」キーを押すとオプションパラメータを編集可能。

指定できるパラメータは以下の通り。

パラメータ説明
init=パス指定したパスのコマンドを初期プログラムとして指定
mem=nM物理メモリの指定
nosmpSMPマシンをシングルプロセッサとして動作させる
nohtHyperThreading機構の無効化
maxcpus=数利用するCPUの数を指定した数に制限
root=デバイスルートファイルシステムを指定する
read-only, roルートファイルシステムを読み取り専用でマウントする
single, sシングルユーザモードで起動する
数値指定したランレベルで起動する

GRUB Legacyの起動オプションの指定方法

GRUB Legacyの場合以下のようになる。

grub> kernel [カーネルイメージ] [オプション]

GRUB2の起動オプションの指定方法

GRUB2の場合以下のようになる。

grub> linux [カーネルイメージ] [オプション]

3.4. その他のブートローダ

3.4.1. SYSLINUX

SYSLINUXやISOLINUXはFATファイルシステムが一般的なUSBメモリやCD-ROMから直接起動指定利用するLiveCDに使用されるブートローダ。

SYSLINUXは起動ディスクやレスキューディスクのブートローダに使われている。 またSYSLINUXはいくつかのコンポーネントで構成される。

コンポーネント説明
SYSLINUXFATファイルシステムからカーネルを起動するプログラム
ISOLINUXISO9660ファイルシステムからカーネルを起動するプログラム
EXTLINUXext2/ext3/ext4ファイルシステムからカーネルを起動するプログラム
PXELINUXPXEを使ってネットワークブートするプログラム

Isohybrid

Isohybridと呼ばれるシステムはUSBスティックなどでISOLINUXイメージのMBRコードを使ったブートを可能にし、ブロックデバイスの動作を提供するもの。 MBRコードとしてSYSLINUXのMBRコードであるisohdpfx.binが使用される。

UEFIのツール

ツール名説明
efiboot.imgUEFIでISOLINUXを使ってブートする際に使われるイメージ。FAT16で作成されている
/EFI/BOOT/bootx64.efiUEFIのブートマネージャー。標準ではUEFI起動時に読み込まれる
Secure Boot署名の確認を行い、起動を制限する機能
shim.efiセキュアブート時に最初に読み込まれるUEFIアプリケーション
grubx64.efigrubを起動するUEFIアプリケーション

3.4.2. PXEブート

PXEはIntel社に策定されたネットワークブートの規格。 DHCPやBOOTPを使ってネットワーク情報を取得し、TFTPでブートプログラムをダウンロードして起動する。 特徴としては以下の通り。

  • インストールメディアなしでネットワークインストールを開始できる
  • ディスクレスクライアントを起動できる

PXEクライアントにはPXE準拠のネットワークインターフェイスが必要となる。 PXEブートサーバではDHCP、TFTPサーバが稼働している必要がある。

3.4.3. systemd-boot

systemd-bootはsystemdに組み込まれているブートローダ。 UEFIのみに対応している。

3.4.4. U-Boot

U-Bootは組み込み系で利用されるブートローダ。 PowerPC、ARM、MIPSなどのアーキテクチャに対応している。

最終更新 2025.01.19: Added ss command (683d062)