【2023年7月版】systemd, journalctl メモ

# はじめに

すぐにわすれる systemd 関連のメモ

最新に加筆修正しました。　

　↓

[【2024年1月版】中年エンジニアのための systemd メモ 【systemctl, journalctl すぐ忘れてしまう人向け】](https://qiita.com/nouernet/items/736229ac97b0fae940aa)


# systemd

## 主なデーモンプロセス

systemd ではデーモンプロセスが連携して動作する

| プロセス | 説明 |
|:-:|:-:|
| systemd  | systemdのメインプロセス  |
| systemd-journal  | ジャーナル管理プロセス  |
| systemd-logind  | ログイン処理プロセス  |
| systemd-udevd  | デバイス動的検知プロセス  |

## 主な Unit

systemd では、システムの起動処理は Unit と呼ばれる処理単位に分割される

| Unitの拡張子 | 説明 |
|:-:|:-:|
| service  | 各種サービスの起動  |
| device  | 各種デバイス、udevのデバイス認識で自動作成  |
| mount  | ファイルシステムのマウント、/etc/fstabから自動作成  |
| swap  | スワップ領域、/etc/fstabから自動作成  |
| target  | Unitのグループ  |
| socket  | ソケットの監視〜接続時にサービスの起動  |
| timer  | サービスの起動の予約  |

## ランレベルとターゲットの対応
	
| ランレベル | 説明 |
|:-:|:-:|
| 0  | シャットダウン  |
| 1  | シングルユーザモード  |
| 2  | ネットワーク無しのマルチユーザモード  |
| 3  | 通常のマルチユーザモード（テキストログイン）  |
| 4  | 未使用  |
| 5  | グラフィカルログインによるマルチユーザモード  |
| 6  | 再起動  |

| ランレベル | ターゲット |
|:-:|:-:|
| 0  | poweroff.target  |
| 1  | rescue.target  |
| 2, 3, 4  | multi-user.target  |
| 5  | graphical.target  |
| 6  | reboot.target  |

## 主な systemctl のサブコマンド

| サブコマンド | 説明 |
|:-:|:-:|
| start  | サービスを起動  |
| stop  | サービスを停止  |
| restart  | サービスを再起動  |
| reload  | サービスの設定を再読み込み  |
| status  | サービスの稼働状況の表示  |
| is-active  | サービスが起動しているかどうか確認  |
| enable  | システム起動時にサービスを起動するように設定  |
| disable  | システム起動時にサービスを起動しないように設定  |
| is-enabled | システム起動時にサービスが起動されるかどうか確認、aliasの場合もある |
| mask  | Unitを起動できないように指定  |
| unmask  | Unitのmaskを解除  |
| kill  | Unitへシグナルを送る  |
| daemon-reload  | 設定を再読み込み  |
| cat  | Unitファイルの内容表示  |
| list-units  | 起動しているUnitの表示  |
| list-unit-files  | すべてのUnitの表示  |
| list-dependencies  | Unitの依存関係の表示  |
| reboot  | システムの再起動  |
| poweroff  | システムの停止  |
| rescue  | シングルユーザモード  |
| emergency | 緊急モード   |

## 主なサブコマンドのオプション

| オプション | 説明 |
|:-:|:-:|
| -t, --type=  | 種類を指定  |
| --state=  | 状態を指定  |
| -l, --full  | 省略せずに表示  |
| -a, --all  | Unitすべてを表示  |
| -s, --signal=  | シグナルの指定  |
| --no-pager  | ページャ無しの表示  |

## Unit 設定ファイル

### 主なセクション

| セクション名 | 説明 |
|:-:|:-:|
| Unit  | ユニットの説明、ドキュメンテーションへのリンク、他のユニットに対する依存関係を定義  |
| Service  | サービスユニットに特有で、実行するプロセスの動作を定義  |
| Socket  | ソケットユニットで使用され、ソケットの設定を定義  |
| Install  | ユニットがどのように "enabled" (有効化) や "disabled" (無効化) されるかを定義 |
| Timer  | タイマーユニットで使用され、定期的にまたは特定の時間にユニットを起動するためのタイマーを定義 |
| Mount  | マウントユニットで使用され、特定のファイルシステムのマウントポイントを定義 |
| Path  | パスユニットで使用され、特定のファイルやディレクトリの存在や変更を監視し、それに応じたユニットを定義 |
| Network | ネットワークユニットで使用され、ネットワーク接続を定義 |
| Automount | 自動マウントユニットで使用され、アクセス時に自動マウントを定義 |

### 主なパラメータ

| セクション | パラメータ | 説明 |
| --- | --- | --- |
| `Unit` | `Description` | ユニットの概要を提供するフリーテキストフィールド |
|  | `Documentation` | ユニットに関するドキュメンテーションのURLを指定 |
|  | `After`, `Before` | 他のユニットに対する順序依存性を指定 |
| `Service` | `ExecStart` | サービスを開始するためのコマンド |
|  | `ExecStop` | サービスを停止するためのコマンド |
|  | `Restart` | サービスが失敗したときの再起動ポリシー |
| `Socket` | `ListenStream`, `ListenDatagram` | ソケットが待ち受けるアドレスとポート |
|  | `Accept` | サービスが接続ごとに新しいプロセスを生成するかどうか |
| `Install` | `WantedBy` | ユニットがインストールされたときに起動するターゲット |
|  | `Alias` | ユニットの別名 |
| `Timer` | `OnBootSec` | システム起動後にタイマーが起動するまでの時間 |
|  | `OnUnitActiveSec` | 指定したユニットが最後にアクティブになってからタイマーが起動するまでの時間 |
| `Mount` | `What` | マウントするリソースのパス |
|  | `Where` | マウントポイントのパス |
|  | `Type` | ファイルシステムの種類 |
| `Path` | `PathExists` | 指定したパスが存在する場合にユニットを起動 |
|  | `PathChanged` | 指定したパスが変更された場合にユニットを起動 |
| `Network` | `DHCP` | DHCPを使用するかどうか |
|  | `Address` | 静的IPアドレスの設定 |
| `Automount` | `Where` | マウントポイントのパス |
|  | `TimeoutIdleSec` | アクセスがない場合の自動アンマウントまでの時間 |

## systemd-delta コマンド

`systemd-delta [-t オプション] [ディレクトリ]`

| オプション | 説明 |
| --- | --- |
| `-t`, `--type=` | 差分の種類を指定。可能な値は `extended`, `masked`, `equivalent`, `redirected`, `overridden` |
| `--no-pager` | 出力のページングを無効 |
| `--no-legend` | 凡例を非表示|
| `--system` | システムユニットの差分を表示|
| `--user` | ユーザユニットの差分を表示|
| `--runtime` | ランタイム設定の差分を表示|
| `--global` | グローバル設定の差分を表示|

# journalctl

## 主なオプション
| オプション | 説明 |
| --- | --- |
| `-b`, `--boot` | 現在のブートまたは特定のブートのジャーナルメッセージを表示 |
| `-f`, `--follow` | ログがリアルタイムで更新されると、その更新を表示 |
| `-u`, `--unit=, _SYSTEMD_UNIT` | 特定のシステムユニットのジャーナルメッセージを表示 |
| `-k`, `--dmesg` | カーネルメッセージのみを表示 |
| `-p`, `--priority=` | 指定された優先度またはそれより重要なメッセージを表示 |
| `_PID=` | 指定されたPIDのメッセージを表示 |
| `_UID=` | 指定されたUIDのメッセージを表示 |
| `-r`, `--reverse` | ジャーナルエントリを最新から最初へと逆順に表示 |
| `-S`, `--since=` | 指定した日時以降のジャーナルメッセージを表示 |
| `-U`, `--until=` | 指定した日時までのジャーナルメッセージを表示 |
| `--no-pager` | ページングを無効にし、すべてのログを一度に表示 |
| `--no-hostname` | ログエントリからホスト名を除外 |
| `-x`, `--catalog` | 可能な場合、メッセージカタログから追加情報を取得して表示 |
| `-o`, `--output=` | 指定されたフォーマットでジャーナルメッセージを表示 |
| `-n`, `--lines=` | 末尾から指定された行数を表示、デフォルトは10行 |
| `-e`, `--pager-end` | 末尾から1000行をページャーで表示 |


## よくつかうパターン

### から

```terminal
$ journalctl --since="2023-08-12 22:15:00"
```

### まで

```terminal
$ journalctl --until="2023-08-13 22:15:00"
```

### 日付範囲

```terminal
$ journalctl --since="2023-08-13 22:15:00" --until="2023-08-14 23:15:00"
```

### 現在日付からの差分を指定

```terminal
$ journalctl --since="$(date -d '12 hour ago' '+%Y-%m-%d %H:%M:%S')" --until="$(date -d '11 hour ago' '+%Y-%m-%d %H:%M:%S')"
```

### 降順

```terminal
$ journalctl -r
```

### 最新のログをフォロー表示

```terminal
$ journalctl -f
```

### 今回起動してから

```terminal
$ journalctl -b
```

### 前回起動してから

```terminal
$ journalctl -b -1
```

### 前前回起動してから

```terminal
$ journalctl -b -2
```

### 今回起動してから、エラーのみ

```terminal
$ journalctl -b -p err
```

### カーネルログのみ

```terminal
$ journalctl -k
```

### ページャーを使用しない

```terminal
$ journalctl --no-pager
```

```terminal
$ journalctl -xn | less
```

### エラーログのみ、今回起動してから、追加情報込みで

```terminal
$ journalctl -p 4 -xb
```

### カレントでないjournalログフォルダから読み込んで使う、フォルダごといける

```terminal
$ journalctl -D /var/log/journal/xxxxxxxxx
```

### 古いログファイルから読み込んで使う

```terminal
$ journalctl --file=/var/log/journal/old.log
```

# さいごに

わすれたくない

# 関連資料

[LinuC レベル2 Version 10.0 201試験 出題範囲](
https://linuc.org/linuc2/range/201.html)
[LinuC レベル2 Version 10.0 202試験 出題範囲](
https://linuc.org/linuc2/range/202.html)
[Linux教科書 LinuCレベル2 Version 10.0対応](https://www.amazon.co.jp/dp/B08JX5SV8K)