システム起動の流れ
①BIOS/UEFI ⇒ ②ブートローダ ⇒ ③カーネル ⇒ ④init/systemd
起動時のログ確認
dmesg
①BIOS/UEFI
OSの起動やPCと接続機器間の入出力を制御するプログラム
②ブートローダ
HDDなどのストレージからOSを読み込んで起動するプログラム
③カーネル
OSの中核プログラム
④init⇒systemd
・initの仕組み
1./etc/inittab ファイル読み込み
2./etc/rc.sysinit スクリプト読み込み
3./etc/rc スクリプト実行
4./etc/rcスクリプトが「/etc/rc$ランレベル.d」ディレクトリ以下のスクリプトを実行
・initの欠点
- デーモンやアプリケーション数が増えると、管理や制御が複雑になり、
- initから起動される各種デーモンやアプリケーションは、並列処理が行われず、数が増えるとOS起動速度が遅くなる
- 何らかの理由でプロセスの親子関係が崩れた場合に、子プロセスがinitプロセスの直接管理下に置かれるものの、子プロセスの挙動を適切に制御できない
・systemdの仕組み
処理をUnitという単位で管理
Unitとは
1.スクリプトではなく設定ファイルであり、Unitの設定をもとにSystemdが処理実行
2.Unit同士の関係を定義可能(例:AにはBが必要と定義すると、最適な起動順で起動)
3.用途別にいろんな種類がある
- .service プロセスの起動/停止に関する設定
- .mount ファイルシステムのマウント/アンマウントに関する設定
- .target Unitをグループにしてまとめたもの
Unitは「/usr/lib/systemd/system(インストール時の初期設定)」と「/etc/systemd/system(ユーザー個別設定)」にあり、両方に同じファイル名が存在する場合は「/etc/systemd/system」ディレクトリ配下の設定ファイルが優先される
そのため、ユーザー独自のパラメータを指定したい場合は、「/etc/systemd/system/httpd.service/d」ディレクトリを作成し、配下に設定ファイルを作成する
1.systemd起動
2.default.targetの探索
3.Unitの関係を解析
4.プロセスの並列起動
・Systemdのメリット
- アプリケーション側で起動・停止にかかるスクリプトの用意不要
- 各種サービスのプロセス群を並列実行可能
- プロセスをグループ化する「cgroup」という仕組みを使用して、プロセスの親子関係を管理しており、initよりも制御をより適切に行える
<コマンド例>
サービスの状態確認(例:httpd)
systemctl status httpd
サービスの起動(例:httpd)
systemctl start httpd
サービスの停止(例:httpd)
systemctl stop httpd
OS起動時にサービス自動起動設定(例:httpd)
systemctl enable httpd
OS起動時にサービス自動起動設定削除(例:httpd)
systemctl disable httpd
OS起動時にサービス自動起動設定確認(例:httpd)
systemctl -t service is-enable httpd
runlevel⇒target
・runlebel
RHEL系だと0~6まである
0 : 停止
1 : シングルユーザー
2 : 未使用/ユーザー定義可能
3 : マルチユーザー、コンソールログインのみ
4 :未使用/ユーザー定義可能
5 : ランレベル3 + Xディスプレイマネージャ起動
6 : リブート
※シングルユーザーモード ネットワーク機能を起動しなく、rootでのみログイン可能なモード
・target
複数のサービス(デーモン)などの制御対象をグループにし、まとめたもの
例:network.target=ネットワークに関する処理の単位をグループ化したもの
<コマンド例>
デフォルトのtargetの確認
systemctl get-default
利用可能なtargetの確認
systemctl list-units --type=target --all --no-pager
デフォルトのtarget変更(graphical.targetへの変更例)
systemctl set-default graphical.target
従来のrunlebelとtargetとの関係確認
ls -l /lib/systemd/system/runlevel*target
システムブート時のサービス起動設定確認(これでrunlevel1ではNW起動されないのが確認可能)
chkconfig --list
OS再起動無しでtarget切り替え
systemctl isolate multi-user.target
runlevel確認(出力:変更前runlevel 現在runlevel)
runlevel