systemdまで調べてみたよ

## 勉強前イメージ

SysVinitの後継の後継
systemdのことを知りたくてSysVinit→Upstartまで調べてたどり着いた

## 調査

### systemdとは

#### systemdの概略

OS起動の仕組みで、Upstartと同様に各プロセスを並列起動する
Upstartより高速になっており、システム管理の共通化なども行っている
主なOSでいくと、CentOS7はsystemdを採用している

#### systemdの特徴

- 高速なシステム起動

Upstartよりも高い並列度で処理するため、起動がより早くなっている

- システム管理の共通化

今まで使用していたシェルスクリプトが廃止され、ユニットファイルになった

`SysVinit`

```text:CentOS5_/etc/init.d/sshd
[root@localhost ~]# head /etc/init.d/sshd 
#!/bin/bash
#
# Init file for OpenSSH server daemon
#
# chkconfig: 2345 55 25
# description: OpenSSH server daemon
#
# processname: sshd
# config: /etc/ssh/ssh_host_key
# config: /etc/ssh/ssh_host_key.pub
```

`systemd`

```text:CentOS7_/usr/lib/systemd/system/sshd.service 
[root@localhost ~]# head /usr/lib/systemd/system/sshd.service 
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
```

- プロセスの起動が柔軟

Unit単位での管理。
タイマー(cronの代替)や、socketへの通信検出によるプロセス起動などが出来る

- pidではなくcgroupがプロセスを管理する

SysVinitはpidでサービスを管理していましたが、systemdでは `cgroup` で管理しています。

- SysVinitからの互換性がある

Upstartは互換性がなく、移行するのが大変でしたが、
SysVinitは互換性があり、楽にsystemdに移行することが出来ます。


### systemdの起動順序

- 1. systemdプロセス開始

Upstartまでは initプロセスでしたが、 systemdからはsystemdプロセスが起動してサービスの管理を行います。

```text:CentOS5_SysVinit_initプロセス
[root@localhost ~]# pstree
init─┬─acpid
     ├─anacron
     ├─atd
     ├─auditd─┬─audispd───{audispd}
     │        └─{auditd}
     ├─automount───4*[{automount}]
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─...
     ├─...
```

```text:CentOS7_systemd_systemdプロセス
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VBoxService───8*[{VBoxService}]
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─...
        ├─...
```

- 2. default.targetを処理

systemd は default.target に記述されているものを各ユニットとしてを立ちあげます。
以下のように実際には `/lib/systemd/system/multi-user.target` へのシンボリックリンクになっています。

```
[root@localhost system]# ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37  8月 28 16:48 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
```

- 3. リンク先のtargetを確認

上記のようにdefault.targetは実際にはこのサーバでは `/lib/systemd/system/multi-user.target` へのシンボリックリンクになっているので、
このファイルを解析する

```
[root@localhost system]# cat /lib/systemd/system/multi-user.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
```

- 4. 解析結果により、必要なサービスを起動する（依存関係順に従いながら並列に）


### サービス管理について

SysVinitではプロセスで管理していたが、systemdではUnit単位での管理になっている
`systemctl` コマンドを使用し、以下の様に使う

```text:コマンド
systemctl コマンド ユニット
```

以下、主なコマンドやユニットの拡張子を記載

| コマンド | 詳細 |
|:-:|:-:|
| list-units  | 全てのユニットとその状態を表示  |
| start  | 指定のユニットを起動する  |
| restart  | 指定のユニットを再起動する  |
| stop  | 指定のユニットを停止する  |
| reload  | 指定のユニットを再読み込みする  |
| status  | 指定のユニットの実行状況を確認する  |

| ユニットの拡張子 | 詳細 |
|:-:|:-:|
| .service  | サービスの起動,停止などの設定に関するもの   |
| .mount  | ファイルシステムのマウント,アンマウントの設定に関するもの  |
| .target | 複数のUnitをとりまとめるUnit  |


- (例)httpd.serviceユニットの実行状況の確認

```
systemctl status httpd.service
```

- (例)sshd.serviceを再起動

```
systemctl restart sshd.service
```

## 勉強後イメージ

長かったsystemd。
最初systemdってsystemctlのイメージしかなかったけど、
それは上辺だけだった....いろいろ進化されてるんだな
頑張ってserviceコマンド卒業する...いつもどっちがどっちかわからなくなっちゃう
まだまだ理解できてないけど、頑張る

## 参考

- [【初級者向け】Linuxシステムの起動 ～ SysVinit、Upstart、systemd ～](https://tech.pjin.jp/blog/2020/11/11/linux-system-boot-2/#hosoku-9)
- [initまとめ(ざっくり)](https://qiita.com/h_tyokinuhata/items/26b7dd3526e7061596b9)
- [Linuxシステム起動スクリプト(inittab、rc.sysinit、rc)を読んでいく](http://www.osssme.com/doc/funto76.html)
- [これからSystemd入門する](https://qiita.com/bluesDD/items/eaf14408d635ffd55a18)
- [Linux女子部　systemd徹底入門](https://www.slideshare.net/enakai/linux-27872553)
- [systemd超入門](https://dev.classmethod.jp/articles/systemd-getting-started/)
- [「Systemd」を理解する ーシステム起動編ー](http://equj65.net/tech/systemd-boot/)
- [Cent7での起動プロセスの違いについてまとめてみた](https://qiita.com/hot_study_man/items/4ce06e657e94a51c8153)
- [第10章 SYSTEMD によるサービス管理](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/chap-managing_services_with_systemd)
- [systemdによるCentOS 7の管理](https://thinkit.co.jp/story/2014/12/11/5388?page=0%2C1)
- [OS起動時にsystemdで行われていること](https://qiita.com/ledmonster/items/5f2e1633d4124cb978fe)