ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

systemdにやられる

お疲れ様です。伊藤です。

ブログの更新が遅れてしまい申し訳ございません。プライベートで色々とありまして・・・

と言い訳はこの辺にして今回はsystemdについてです。
全然自動化じゃねーじゃん、という方もいらっしゃるかと思いますが、今回自動化の仕組み作りをするにあたり、RHEL6とRHEL7の違いに悩まされておりますのでそのあたりで調べた内容をこちらに少しでも書いておきたいと、そういった趣旨になります。


というわけでsystemd
こちらはサービス起動デーモンです。簡単に言うとOSを起動するときに一緒に立ち上げるサービスを管理してて必要なサービスを自動で起動してくれるものです。今まではinitdというデーモンが担当していましたがRHEL7以降はsystemdに切り替わりました。
それによりコマンドも大きく様変わりし、RHEL6に慣れ親しんだ方はRHEL7に触ることで悲鳴を上げることになります(私がそう)
例えば今までサービス起動の設定を見る場合は

# chkconfig --list

だけでOKでした。これですべてのランレベルの起動サービスが一覧で表示されていたんです。

[root@RHEL6 ~]# chkconfig --list
abrt-ccpp       0:off   1:off   2:off   3:on    4:off   5:on    6:off
abrtd           0:off   1:off   2:off   3:on    4:off   5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
autofs          0:off   1:off   2:off   3:on    4:on    5:on    6:off
blk-availability        0:off   1:on    2:on    3:on    4:on    5:on    6:off
・
・
・

ところがRHEL7で同じコマンドを実行すると

[root@RHEL7 system]# chkconfig --list

注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
      systemd services. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。
      systemd サービスを一覧表示するには 'systemctl list-unit-files' を使用してください。
      特定のターゲットにおいて有効化されているサービスを確認するには、
      'systemctl list-dependencies [target]' 。

netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
rhnsd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@RHEL7 system]#

となります。これじゃ全部表示できないからsystemctl使ってね、と。では使ってみましょう。

[root@RHEL7 system]# systemctl list-unit-files
UNIT FILE                                   STATE
proc-sys-fs-binfmt_misc.automount           static
dev-hugepages.mount                         static
dev-mqueue.mount                            static
proc-sys-fs-binfmt_misc.mount               static
sys-fs-fuse-connections.mount               static
sys-kernel-config.mount                     static
sys-kernel-debug.mount                      static
tmp.mount                                   disabled
brandbot.path                               disabled
systemd-ask-password-console.path           static
systemd-ask-password-plymouth.path          static
systemd-ask-password-wall.path              static
session-1.scope                             static
session-2.scope                             static
auditd.service                              enabled
autovt@.service                             enabled
blk-availability.service                    disabled
・
・
・

確かに表示されました。が、ランレベルはどこいったんじゃいと、思って調べたところRHEL7からランレベルという概念がなくなっている、ということがわかりました。。。(今更。。)
じゃあそれに代わるものは何かというと、こちらになります。
/usr/lib/systemd/system/辺りを見てみると

lrwxrwxrwx.  1 root root    15  6月 21 17:12 runlevel0.target -> poweroff.target
lrwxrwxrwx.  1 root root    13  6月 21 17:12 runlevel1.target -> rescue.target
drwxr-xr-x.  2 root root    50  6月 21 17:12 runlevel1.target.wants
lrwxrwxrwx.  1 root root    17  6月 21 17:12 runlevel2.target -> multi-user.target
drwxr-xr-x.  2 root root    50  6月 21 17:12 runlevel2.target.wants
lrwxrwxrwx.  1 root root    17  6月 21 17:12 runlevel3.target -> multi-user.target
drwxr-xr-x.  2 root root    50  6月 21 17:12 runlevel3.target.wants
lrwxrwxrwx.  1 root root    17  6月 21 17:12 runlevel4.target -> multi-user.target
drwxr-xr-x.  2 root root    50  6月 21 17:12 runlevel4.target.wants
lrwxrwxrwx.  1 root root    16  6月 21 17:12 runlevel5.target -> graphical.target
drwxr-xr-x.  2 root root    50  6月 21 17:12 runlevel5.target.wants
lrwxrwxrwx.  1 root root    13  6月 21 17:12 runlevel6.target -> reboot.target

こんな感じになっています。この.targetというのがランレベルに代わるものでそれぞれに対応するものがあります。今までのサービスは.serviceというファイルで管理されており、これらをUnitと呼ぶそうです(なかなかついていけませんが。。。)
表にするとこんな感じです。

RHEL6の表記 RHEL7の表記
runlevel0 poweroff.target
runlevel1 rescue.target
runlevel3 multi-user.target
runlevel5 graphical.target
runlevel6 reboot.target

そしてtargetファイルの中身ですが、こちらを見ると起動するサービスの一覧がある、、、かというとそうでもなく他のtargetファイルを読み込んでいるだけ。。。で追っても追ってもサービス名の一覧なんて見当たりません。
結局はサービス起動する一覧を見るにはsystemctl list-unit-filesが一番有効なようです。
で、ランレベル(実際はtargetですが)毎のサービス起動一覧は。。。今のところランレベルを切り替えてsystemctl list-unit-filesするしかなさそうですね。。。ほんまかいな。。。

すいません、中途半端な記事になってしまいましたがとりあえずここまでです。
その後の調査でさらにわかったことがあれば追記します。

お疲れ様でした。