systemd入門

Posted at 06 Aug 2015

なぜsystemdを学ぶのか?

CentOS 6系から7系へ

  • 6系はリリースから既に4年。
  • 他のディストリビューションと比べてもサポートは長い。
  • しかし、遠くない将来、7系へ移行する時が来る。
  • 6.x
    • リリース:2011/07/10
    • サポート:2020/11/30まで
  • 7.x
    • リリース:2014/07/07
    • サポート:2024/06/30まで

https://en.wikipedia.org/wiki/CentOS

それで?

つまり

  • SysV initに依存した運用知識は数年の内に陳腐化する。
    => さよなら sudo service hoge start,chkconfig on,/etc/init.d/~, etc.

systemdの概要

管理ツールが変われば関連する全てが変わる。

サービスの起動

今昔

$ sudo service httpd start
$ sudo /etc/init.d/httpd start


systemd

$ sudo systemdctl start httpd.service

SysV init

サービスのトラッキング => PIDファイルのみ

今昔

$ sudo service httpd start
$ sudo /etc/init.d/httpd start

プロセスのPIDファイルが作られる。

/var/run/httpd/httpd.pid

statusはPIDファイルで確認。

$ sudo service httpd status
httpd (pid  XXXXX) is running...

もしPIDファイルを消したら?

$ sudo rm /var/run/httpd/httpd.pid

起動していても正常にトラッキングできなくなる。

$ sudo service httpd status
httpd dead but subsys locked

停止も出来ない。

$ sudo service httpd stop
Stopping httpd:                                            [FAILED]

もちろんプロセスは変わらずあるのでkillするしかない。

$ sudo pkill -9 httpd

systemd

  • cgroupを使ったプロセスリソース管理。
  • 子プロセスまで全ての状態を監視。
  • プロセス停止時に自動再起動を設定することも可能。
  • syslog代替のjournaldでバイナリログを記録。
  • SysVinitでは/etc/init.d/のシェルスクリプト。
    => 独自定義で何でも実行可能
    => systemdだとstart/stop/restart/reload以外は不可。

cgroup(Control Groups)

  • Linuxのプロセスごとにリソースを管理する機能。
  • 具体的にはCPUコア数、メモリ容量等を制限可能。
  • 参考リンク: [Control Groups (cgroups)](http://enakai00.hatenablog.com/entry/20110605/1307240161/

Unit

  • systemdは起動処理(↓)をUnitという単位で管理する。
    • service: サービス起動
    • target: Unitをグループ化する単位
    • mount: ファイルシステムのマウント
    • swap: swap領域を有効化
    • device: ディスクデバイス
  • Unit間の依存関係も設定することができる。
  • 依存のないものは並行で処理を走らせ起動を高速化。

起動と有効化

サービス起動

以前

$ sudo service httpd start

これから(Unitを表す拡張子をつける)

$ sudo systemctl start httpd.service

サーバ起動時プロセス起動

以前

$ sudo chkconfig httpd on

これから(Unitを表す拡張子をつける)

$ sudo systemctl enable httpd.service

ステータス確認

以前・・・PIDと実行中かどうかのみ

$ sudo service httpd status
httpd (pid  XXXXX) is running...

これから・・・起動日時や子プロセスなどなど

$ sudo systemctl status httpd.service

Unitに関する設定

デフォルトの設定は以下のパスにあります。 Restartオプションを追加すると停止時に自動再起動がかかります。

/usr/lib/systemd/system/httpd.service

ログ

journalctlによるログ確認(デフォルトでは全て出力)

$ sudo journalctl

特定のUnitのログのみを確認する場合には「-u」をつける。

$ sudo journalctl -u httpd.service

タイムゾーンの変更方法

$ timedatectl list-timezones  # timezone一覧
$ sudo timedatectl set-timezone Asia/Tokyo

その他便利機能

cgroup確認

$ systemd-cgls

Unitごとの起動時間表示

$ systemd-analyze blame

Unitごとのリソース利用状況表示

$ systemd-cgtop

Unit間の依存関係確認

$ systemctl list-dependencies httpd.service

結論

  • systemdを使ったOSは同じディストリビューションでももはや違うOSと思った方が良い。
  • systemdは今後アップデートされつつ広がっていく。
  • コンテナ技術(docker)との融合にも要注目。

link

もどる