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 Legacy、GRUB2がある。
カーネル
カーネルはinit(/sbin/init)を起動するもので、その過程で以下処理を行う。
- 組み込まれたハードウェアの検出
- メモリの初期化
- システムクロックの設定
- IRQの設定
- ルートパーティションのマウント
またカーネル起動中のメッセージはdmesgコマンドで確認可能。
3.1.2. SysVinitの概要
サービスが起動する仕組みはこれまでSysVinitが主流であったが、現在ではSystemdという仕組みが主流となっている。
SysVinit
SysVinitではLinuxシステムで最初に実行されるinitが/etc/inittab
に従いシステムに必要なサービスを順次起動するものであった。
initのPIDは1番となりすべてのプロセスはinitの子プロセス/孫プロセスとなる。
起動のプロセスは以下の通り。
- initが
/etc/inittab
を読み込む - initが
/etc/rc.sysinit
を読み込む - initが
/etc/rc
を実行する /etc/rc
が/etc/rcN.d
(Nはランレベル)ディレクトリ以下のスクリプトを実行する
なお/etc/inittab
の書式は以下の通り。
- 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
で確認できる。
サービスの起動は以下の書式の通り。
起動スクリプトの主なコマンドは以下の通り。
コマンド | 説明 |
---|---|
start | サービスの開始 |
stop | サービスの停止 |
restart | サービスの再起動 |
condrestart | サービスが起動している場合のみ再起動 |
status | 情報を表示する |
なお各ランレベルに応じたスクリプトは/etc/rc[0-6].d
に入っており、以下のようなファイル名となる。
Sは起動、Kは終了を意味する。 数字は実行順序、残りはサービス名を表す。
なおK→Sの順で実行される。
デフォルトのランレベル
SysVinitを採用したシステムでは以下の方法でデフォルトランレベルの指定ができる。
/etc/inittab
- ブートローダの設定ファイルでのカーネル起動時に渡すコマンドラインパラメータ
serviceコマンド
RedHat系OSやUbuntuでは/etc/init.d/
の代わりにservice
コマンドを使用できる場合がある。
具体的にはRed Hat(6.xまで)系ディストリビューションで使用できる。
LSB
LSB(Linux Standard Base)はLinuxの内部構造を標準化するプロジェクト。 LSBでは以下仕様が決められている。
- コマンド/標準ライブラリ
- ファイルシステム階層構造
- 印刷システム
- X Window System
確認は以下コマンドで可能。
3.1.4. サービスの自動起動
ランレベルごとにサービスをデフォルトで起動させるもしくはさせないようにするには以下のような手法がある。
- 手動でリンクを作成する
- chconfigコマンドでの設定
- update-rc.dコマンドでの設定
手動でリンクを作成
手動でリンクを作成するには/etc/rc[0-6].d
以下に、自動に起動させたいサービスのシンボリックリンクの作成することで設定ができる。
chkconfigコマンド
chkconfigコマンドはRed Hat系(6.xまで)ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。
オプション | 説明 |
---|---|
--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系のディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。
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/
以下にある。
デフォルトのターゲットにシンボリックリンクを作成することで、デフォルトの起動方法を設定できる。
ランレベル | ターゲット |
---|---|
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
コマンドとなる。
サブコマンド | 説明 |
---|---|
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コマンドはデフォルトの定義ファイルを上書きしている場合などにどのファイルがどのように影響を受けているか確認できるコマンド。 同じファイル名のユニット、ターゲットの定義ファイルが複数あり、上図のディレクトリの優先度に基づいてファイルを上書きした場合などに使用する。
Unit設定ファイル
Unit設定ファイルは/etc/systemd/system
ディレクトリ以下に配置される。
Unit設定ファイルはUnit、Service、Installのセクションに分かれる。
ファイルの構成は以下例のようになる。
[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のログが確認可能。
オプション | 説明 |
---|---|
-f | 末尾のログを表示し続ける |
-n 行数 | 指定した行数だけログの末尾を表示 |
-p [priolity] | メッセージがpriority以上のものだけ表示 |
-r | ログを新しい順に表示 |
-u Unit名 | 指定したUnitを表示 |
-full | プレーンテキストで表示 |
--no-pager | すべてのログを表示する |
3.2. システムのリカバリ
システムがハードディスクから起動できなくなった場合は、インストールCD/DVD ROM内臓のレスキューモードで起動してシステムを修復する。
レスキューモードで起動すると、ハードディスクのルートファイルシステムは/mnt/sysimage
にマウントされる。
この場合、一部コマンドが正常に動作しなくなるため、実行させるにはルートディレクトリを指定する必要がある。
なおレスキューモードの終了はexit
で可能。
3.2.1. chrootコマンド
chroot
コマンドはルートディレクトリを指定してコマンドを実行できたり、ルートディレクトリを変更できたりするコマンド。
3.2.1. 壊れたGRUBを再インストールする例
3.3. ブートローダ
ブートローダはカーネルをディスク上から読み取りシステムを起動するためのプログラムのこと。 ブートローダでは以下のことが実現できる。
- OSの切り替え
- 複数バージョンのカーネルの使い分け
代表的なブートローダにはGRUBやLILOがある。
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シェルで利用できるコマンドは以下の通り。
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の場合以下のようになる。
GRUB2の起動オプションの指定方法
GRUB2の場合以下のようになる。
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などのアーキテクチャに対応している。