目次
- システム起動プロセス
- ブートからカーネル起動まで
- 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の子/孫プロセスです。
一般的な流れは、以下の通りです。
- initが/etc/inittabファイルを読み込む
- initが/etc/rc.sysinitスクリプトを読み込む
- initが/etc/rcスクリプトを実行する。
- /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では、以下のように複数のデーモンプロセス(常駐プロセス)が連携して動作します。
プロセス | 説明 |
systemd | systemdのメインプロセス |
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が処理されます。
ランレベル | ターゲット |
0 | poweroff.target |
1 | rescue.target |
2、3、4 | multi-user.target |
5 | graphical.target |
6 | reboot.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-pager | 1ページごとに表示せずすべてのログを出力する |
最後まで読んで頂き、ありがとうございました。
他の分野へ移動できる全体ページへは以下リンクからお願いします。