2017年12月20日水曜日

systemdの設定ファイルの場所

ココで、「編集したはずのopenvswitchの起動ファイルが元に戻っている」と書いたけど、原因は大したことなかった。

そもそも、 /lib/systemd/system/openvswitch-switch.service というファイルは openvswitch-switch というパッケージに含まれるファイルの1つだ。
裏で openvswitch-switch の自動アップデートが行われ、手作業で更新したファイルがアップデートによって上書きされたに過ぎない。
逆に言うと、どんなに頑張って /lib/systemd/system/openvswitch-switch.service をカスタマイズしても、アップデート一発で元に戻ってしまうわけだ。

となると、定義ファイルをカスタマイズしたい場合はどうすればいいんだろうか?
パッケージに付属しているファイルをカスタマイズするだけでなく、自分でローカルに作成した定義ファイルというのもありうる。
これらは、ユーザ用のディレクトリに置く必要があるわけで、通常ならそういったディレクトリがあるはずだ。

ちょっと調べてみる…。
どうやら、 systemd.unit の man ページにヒントがあるようだぞ。
$ man systemd.unit
システムモード(--system)とユーザモード(--user)ってのがあるようだけど、どうやら通常運用では気にする必要がない(システムモードを見ておけばいい)ようだ。(こちらは systemd の man より)
そして、システムモードでは以下の3つのディレクトリが意味があるようだ。
/etc/systemd/system/*
/run/systemd/system/*
/lib/systemd/system/*

3つ目の /lib/systemd/system/* はこれまでもチェックしていた通りで、パッケージのファイルが配置されるところ。
/run/systemd/system/* はマニュアル上は Runtime units と書かれている。
が、中身を見てみてもちょっと良くわからない。
今見てみたら、ssh でログインしたユーザのセッション毎にディレクトリが有り、その中に conf ファイルが存在している。
どうやら、ダイナミックに動くサービス関連がココに自動的に作成されるようだ。

そして /etc/systemd/system/* だ。
こちらが、ユーザカスタマイズした定義ファイルや、ユーザが独自に作成したサービスの起動定義ファイル等を配置するためのディレクトリのようだ。

そのため、今回のように「パッケージが用意している起動定義ファイルをちょこっとカスタマイズしたい」という場合は、パッケージが用意している /lib/systemd/system/* ファイルを /etc/systemd/system/ にコピーし、こちらをカスタマイズする、というのが正しい姿のようだ。

ちなみに、/lib/systemd/system/ と /etc/systemd/system/ の両方に同じファイル名の定義ファイルがあったら、/etc/systemd/system/ の方にあるファイルを優先して使うため、同一ファイル名で配置しても問題はない。

さっそく試してみよう。
ここまで、blogの通りに作っていた場合、aquarius / sagittarius ペアと、gemini / cancer ペアの合計4台で openvswitch の起動定義をカスタマイズしているはずだ。
それぞれのペア毎に実施して欲しい。
以下の例は、 aquarius で実施している想定で書いているが、他のマシンでも同じだ。

まずは openvswitch-switch のサービスが、どの .service ファイルから起動されているかを確認する。
$ systemctl --no-pager -l status openvswitch-switch
● openvswitch-switch.service - Open vSwitch
Loaded: loaded (/lib/systemd/system/openvswitch-switch.service; enabled; vendor preset: enabled)
Active: active (exited) since 金 2017-12-15 15:07:02 JST; 32min ago
Process: 1432 ExecStartPost=/bin/sleep 6 (code=exited, status=0/SUCCESS)
Process: 1377 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 1377 (code=exited, status=0/SUCCESS)
Tasks: 0
Memory: 0B
CPU: 0
CGroup: /system.slice/openvswitch-switch.service

12月 15 15:06:56 cancer systemd[1]: Starting Open vSwitch...
12月 15 15:07:02 cancer systemd[1]: Started Open vSwitch.
/lib/system/system/openvswitch-switch.service ファイルを使用しているのが分かる。(下線部)

今使っているファイルを、/etc/systemd/system の下に移動しておく。
$ sudo mv -i /lib/systemd/system/openvswitch-switch.service \
/etc/systemd/system/openvswitch-switch.service

そしたら、過去にバックアップしておいたオリジナルファイルを、元の名前に戻しておく。
$ sudo mv -i /lib/systemd/system/openvswitch-switch.service.orig \
/lib/systemd/system/openvswitch-switch.service

オリジナルファイルと、ユーザカスタマイズファイルの存在を確認しておこう。
$ ls -l /lib/systemd/system/openvswitch-switch.service \
/etc/systemd/system/openvswitch-switch.service
(両方ともファイルが存在するはずだ)

オリジナルとユーザカスタマイズファイルの差分をチェックしておく。
$ diff -c /lib/systemd/system/openvswitch-switch.service \
/etc/systemd/system/openvswitch-switch.service
*** /lib/systemd/system/openvswitch-switch.service 2017-03-15 21:34:41.000000000 +0900
--- /etc/systemd/system/openvswitch-switch.service 2017-11-13 10:09:34.965702805 +0900
***************
*** 6,11 ****
--- 6,12 ----
[Service]
Type=oneshot
ExecStart=/bin/true
+ ExecStartPost=/bin/sleep 6
ExecStop=/bin/true
RemainAfterExit=yes
(ExecStartPost=/bin/sleep 6 の行が追加されているのが確認できる。)

設定を反映させて、/etc/systemd/system の方を使用するようになったか確認する。
$ sudo systemctl daemon-reload
$ systemctl --no-pager -l status openvswitch-switch
● openvswitch-switch.service - Open vSwitch
Loaded: loaded (/etc/systemd/system/openvswitch-switch.service; enabled; vendor preset: enabled)
Active: active (exited) since 金 2017-12-15 15:33:54 JST; 54min ago
Main PID: 1589 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/openvswitch-switch.service
(無事に /etc/systemd/system/openvswitch-switch.service の方に切り替わったっぽい。)

これで再起動してみる。(仮想マシンが動いていたら、予め停止しておくこと。)
$ sudo systemctl reboot

もし、dlm / corosync の起動がトラブったら、相方のノード側(aquarius に対して sagittarius等)から fencing されてる状態だと思う。(自分はそうだった)
ので、相方のノードで fencing を解除しておこう。

[sagittariusから]
$ sudo dlm_tool status
cluster nodeid 1084766082 quorate 1 ring seq 516 516 daemon now 402223 fence_pid 0 node 1084766082 M add 22 rem 0 fail 0 fence 0 at 0 0 node 1084766083 X add 23 rem 0 fail 0 fence 0 at 0 0
自分自身(sagittarius)の node id が 1084766082 のようなので、aquarius の node id は 1084766083 だ。
aquarius の node id に対して fencing を解除しておく。

$ sudo dlm_tool fence_ack 1084766083

[aquariusに戻って]
再び再起動して、corosync / dlm が正常に起動してくるのを確認する。
$ sudo systemctl reboot
$ systemctl --no-pager -l status dlm
$ systemctl --no-pager -l status corosync

再起動が終わったら、もう一度確認しておこう。
$ systemctl --no-pager -l status openvswitch-switch
/etc/systemd/system/openvswitch-switch.service の方を利用しているようなら無事に完了だ。
同じ手順を他のマシン上で実行して、openvswitch-switch の起動処理を /etc/systemd/system/ の方に移しておこう。

他にカスタマイズしている部分もあった気がするので、後日確認することにする。

0 件のコメント:

コメントを投稿