LPIC201対策 - システムの起動のカスタマイズ

# この記事について

Linux Level 2 取得を目標としている筆者です。
先日 Level 1 を取得しましたが、短期詰め込みの暗記がしんどかったので、Level2はじっくり時間をかけていいから、ちゃんと理解してやっていきたい。

一方で、暗記も暗記で重要。

ということで、理解を深めるためにと、暗記しやすいように、両方の目的で、覚えたことを Qiita に整理してまとめながら受験対策することにしました。

# この分野で覚えること

## 大前提の知識

init プログラムと呼ばれるプログラムの中に、以下の3つの種類がある。

| 名前 | 説明 |
|:-|:-|
|SysVinit |古いinitプログラム<br>`/etc/inittab`の設定にしたがって起動する|
|systemd |最近のLinuxの主流|
|Upstart |初期処理が高速化されている|

SysVinitにおける「ランレベル」に相当する概念が、systemdでは「ターゲット」と呼ばれていて、この対応づけがけっこう試験に出る。

| SysVinitにおける<br>ランレベル | systemdにおける<br>ターゲット |補足|
|:-|:-|:-|
|0 |poweroff.target||
|1|rescue.target|いわゆるシングルユーザーモード。基本的には、何か障害があったときの調査などで使われるモードなので rescue.target|
|2〜4|multi-user.target|サーバーとして普通に動かす場合のモードはこれ|
|5|graphical.target|GUI|
|6|reboot.target|再起動用|

## コマンド

## inittab

初期システムとしては、最近のLinux では systemd が主流になっているが、それ以前は inittab が使われていた。

inittab が使われているシステムだと、 `/etc/inittab` ファイルが存在する。

### `/etc/inittab` の設定書式と例

`id:ランレベル:アクション:実行するコマンド`

idは必須で、プロセスのジョブ名として認識される。

ランレベルは、アクションが `boot`, `bootwait`, `sysinit` のいずれかの場合は省略されることが多い（書いてあっても無視される）。

```
# /etc/inittab

id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

# Script to run when going single user.
su:S:wait:/etc/rc.d/rc.single

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
```

### `/etc/inittab` のアクションの種別

| アクション指定子 | 意味 |
|:-|:-|
|initdefault|デフォルトランレベルの指定|
|once|指定ランレベルになった際に、一度だけ処理を実行|
|wait|onceと同様だが、プロセスの終了を待つ|
|boot★|ブート時に実行する|
|bootwait★|bootと同様だが、プロセスの終了を待つ|
|sysinit★|bootと同様だが、より先に実行する（ブート時に最優先で実行）|
|respawn|プロセスが終了しても自動的に再起動|

★ ... `/etc/inittab` の設定のランレベルの指定不要（空欄にしておく）

## systemd

Linuxシステムの初期化およびシステム管理プロセスを担当するためのシステムおよびサービスマネージャ。

### ユニット

systemdでは、Unit（ユニット）という単位で各種処理が進められる。
ユニットには、以下がある。

| ユニット名 | 説明 |
|:-|:-|
|device|udevによって認識されたデバイス|
|mount|ファイルシステムをマウントする(/etc/fstab から自動生成)|
|service|各種のサービスを起動・停止する|
|target|ユニットをグループ化するユニット|

### systemd の設定ファイルを置くディレクトリ

| ディレクトリ | 中身(格納しているもの) |優先度|
|:-|:-|:-|
|/usr/lib/systemd/system または<br>/lib/systemd/system<br>(ディストリビューションによる) |永続的なユニット・ターゲットの定義ファイルが置かれる（パッケージのインストールなどで格納先となる）|低|
|/run/systemd/system|再起動すると削除されるディレクトリ|中|
|/etc/systemd/system|カスタム用<br>起動時に開始するターゲットを定める`default.target`はここに置く（通常はシンボリックリンク）|高|

:::note warn
usr/lib/systemd/system が永続的な定義ファイルなので、なんとなく起動時の開始ターゲットもここにあると思ってしまいがちだが、実際は /etc/systemd/system である。
:::


上記のディレクトリを ls すると、以下のようなファイルが入っている

```shell
ubuntu@ip-10-0-0-20:/etc/systemd/system$ ls
 chronyd.service                           snap-core20-2015.mount
 cloud-final.service.wants                 snap-core20-2105.mount
 cloud-init.target.wants                   snap-lxd-24322.mount
 dbus-org.freedesktop.resolve1.service     snap-snapd-20290.mount
 dbus-org.freedesktop.timesync1.service    snap-snapd-20671.mount
 emergency.target.wants                    snap.amazon-ssm-agent.amazon-ssm-agent.service
 final.target.wants                        snap.lxd.activate.service
 getty.target.wants                        snap.lxd.daemon.service
 iscsi.service                             snap.lxd.daemon.unix.socket
 mdmonitor.service.wants                   snap.lxd.user-daemon.service
 multi-user.target.wants                   snap.lxd.user-daemon.unix.socket
```

xxx.target
xxx.service
xxx.wants
xxx.timer
xxx.mount
xxx.socket

## 起動スクリプト（init）

### ファイルの実体

起動スクリプトのファイルの実体は、 `/etc/init.d/` 配下に置かれている

### ランレベルに応じた起動スクリプトのシンボリックリンク

`/etc/rc[0-6].d` ディレクトリ配下に、 `/etc/init.d/` へのシンボリックリンクが配置されている。

こんな感じ。

```shell
ubuntu@ip-10-0-0-20:/etc/rcS.d$ ls
K01iscsid      S01cryptdisks         S01kmod          S01procps          S01ufw
K01open-iscsi  S01cryptdisks-early   S01lvm2          S01screen-cleanup
S01apparmor    S01keyboard-setup.sh  S01plymouth-log  S01udev
```

例えば上記の K01iscsid の場合、実体は `/etc/init.d/iscsid` である。

スクリプトの先頭のKは Kill, S は Start を意味する。

スクリプトは K　->　S の順で実行され、各アルファベットの後に続く2桁の数字が少ない順に実行される。

数字も同じ場合は、そのあとに続くアルファベット順に実行される。

## update-rc.d コマンド

バージョン6.0より前のDebian系ディストリビューションで、各種サービスを自動起動するかどうかの設定を行う。

### コマンド例

```shell:文法
update-rc.d [オプション] サービス 操作 [優先度] [ランレベル - 複数の場合はスペース区切りで、最後に.(ドット)]
```

```shell
# S25crond を /etc/rc{3,5} に作ってね
update-rc.d crond start 25 3 5 .
```

### 操作の選択肢

|操作|説明|
|:-|:-|
|start|Sで始まるリンクを作る|
|stop|Kで始まるリンクを作る|
|defaults|ランレベルに応じて、SかKで始まるリンクを作る|
|remove [-f]|リンクを削除する<br>(-fをつけると強制)|

:::note warn
「自動起動しないように設定」する場合は stop の操作では足りない（ランレベルを抜けたときに kill するだけだから）
-> この場合は、 remove -f によってSで始まるリンクを削除する対応が必要。
:::

## chkconfig コマンド

RedHat系の6.xまでのディストリビューションで、各種サービスを自動起動するかどうかの設定を行う。

### 設定コマンド
`chkconfig [--level ランレベル] サービス　on|of|reset`

ランレベル は `--level 234` のように複数指定することも可能、省略も可能。

## 確認コマンド
`chkconfig --list [サービス]`

## 自動起動するかどうかを設定するコマンド

### insserv

SUSE 系やバージョン 6.0 以降の Debian 系ディストリビューションで利用される。

使い方↓

https://qiita.com/pocket8137/items/9df9ef5ad93e7b220c42


## その他の暗記事項




# 以上！

勉強が進んだら適宜追記・修正などしていきます。