コンテンツにスキップ

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

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をどこからどのようにロードするか)を管理するプログラム
efibootmgr UEFIブートマネージャーの起動エントリを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 システム起動時に一度実行され、プロセスが終了するまで次の処理を行わない
ctrlaltdel Ctrl,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)を作成する
NN 0~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
ランレベル ターゲット
0 poweroff.target
1 rescue.target
2,3,4 multi-user.target
5 graphical.target
6 reboot.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設定ファイルのパラメータは以下の通り。

パラメータ 説明
Description Unitの説明
Documentation ドキュメントの場所
After ここに書かれたUnit以降に起動する
Before ここに書かれたUnit以前に起動する
Wants ここに書かれたUnitが必要
Type サービスのタイプ(simple, forking, oneshot, notify, dbus)
ExecStartPre startでの実行前に実行するコマンド
ExecStart startで実行するコマンド
ExecReload reloadで実行するコマンド
ExecStop stopで実行するコマンド
WantedBy systemctl enable~時に~.wants以下にシンボリックリンクを作成
RequiredBy systemctl 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つのステージで構成される。

ステージ 説明
1 MBR内に配置されたステージ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_QUIET trueでメニュー表示なし、falseであり
GRUB_TIMEOUT デフォルトOS起動までの秒数
GRUB_CMDLINE_LINUX_DEFAULT ブートオプション
GRUB_CMDLINE_LINUX カーネルに渡すオプション

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

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

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

パラメータ 説明
init=パス 指定したパスのコマンドを初期プログラムとして指定
mem=nM 物理メモリの指定
nosmp SMPマシンをシングルプロセッサとして動作させる
noht HyperThreading機構の無効化
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はいくつかのコンポーネントで構成される。

コンポーネント 説明
SYSLINUX FATファイルシステムからカーネルを起動するプログラム
ISOLINUX ISO9660ファイルシステムからカーネルを起動するプログラム
EXTLINUX ext2/ext3/ext4ファイルシステムからカーネルを起動するプログラム
PXELINUX PXEを使ってネットワークブートするプログラム

Isohybrid

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

UEFIのツール

ツール名 説明
efiboot.img UEFIでISOLINUXを使ってブートする際に使われるイメージ。FAT16で作成されている
/EFI/BOOT/bootx64.efi UEFIのブートマネージャー。標準ではUEFI起動時に読み込まれる
Secure Boot 署名の確認を行い、起動を制限する機能
shim.efi セキュアブート時に最初に読み込まれるUEFIアプリケーション
grubx64.efi grubを起動する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などのアーキテクチャに対応している。