USBメモリでRAID 5を構築(番外編)
サービスの起動順を調整する
ブート時に起動するサービスによっては、RAIDアレイが構成される前に起動してしまっては困るものがあります。また、RAIDアレイ配下にディレクトリやファイルを作成するように設定した、あるいは参照するように設定したことで、RAIDアレイが構成された後でなければ起動に失敗するようになったり、動作に問題が生じたりする場合もあります。
このような問題を解消するには、従来のinit/Upstartであれば"/etc/rc?.d" 配下にある"Snn","Knn" で始まる(nnは00〜99の数字)シンボリックファイル名のnnの値を大きくして起動順序を調整すれば良く、非常に直感的で容易な方法でした。
ところが Raspbian Jessie になって、従来の init/Upstart の代わりに systemd が導入されました。systemd によって、ブート時のサービス起動を並列に行えるようになり、システム起動時間を大幅に短縮できるようになりました。その代償として、systemd は複雑な設定構文が大量にあるシステムになっており、正直理解するのは大変な物になっていると思います。サービスの起動順序を変更したいとき、従来の直感的な方法ではなく、サービスの依存関係や順序関係を定義しなければなりません。新しくサービスを追加したときに、依存関係なんか良く分からんから、一番後の方で起動すればいいや的なぶっちゃけ対処は、もう出来ないってことです。(やだなぁ・・・)
systemd に対する賛否は多いのですが、それでも全体的には systemd を採用していく流れのようですね。
と言うわけで、自分も systemd による起動順序の調整を行ってみました。具体的には Samba でして、RAIDをマウントした場所をファイル共有するように設定した場合には、RAID構成前に Samba サービスが起動してしまっては困るだろうと言うわけです。Samba や mdadm のサービス名は、Raspbian Jessie の場合、
# systemctl list-units | grep samba
samba-ad-dc.service loaded active exited LSB: start Samba daemons for the AD DC
# systemctl list-units | grep " md"
mdadm-raid.service loaded active exited LSB: MD array assembly
mdmonitor.service loaded active running MD array monitor
|
問題の Samba は"samba-ad-dc.service" という名前のようです。一般的には、このファイル名の設定ファイルが"/usr/lib/systemd" 、または"/etc/systemd/system" 配下にあり、そのファイル内に依存するサービス等の設定を追加します。通常、"/usr/lib/systemd" 配下のファイルは変更せず、
"/etc/systemd/system" 配下に設定ファイルを置き、こちらを修正するのが作法だそうです。
しかし、"samba-ad-dc.service" という名前のファイルを探しても何処にもなく、"/etc/init.d/samba-ad-dc" スクリプトから systemd が自動生成したUNIT名だと思われます。このような場合は、以下の方法で設定を追加します。
"/etc/systemd/system" ディレクトリ配下に"サービス名.service.d" という名前のディレクトリを作る
- 作成したディレクトリ配下に
"xxxxx.conf" (xxxxx は任意の名前)というファイルを置く
"xxxxx.conf" ファイルに設定を追加する
systemd は"/etc/systemd/system" 配下の設定を優先的に読み込み、そこに"サービス名.service.d/*.conf" があれば、サービスの設定として追加してくれるとのことです。
具体的には、
# cd /etc/systemd/system
# mkdir samba-ad-dc.service.d
# cd samba-ad-dc.service.d
# vi requires.conf
|
として"requires.conf" を作成、編集します。内容は、
[Unit]
Requires=mdmonitor.service
After=mdmonitor.service
RequiresMountsFor=/media
|
としてみました。"samba-ad-dc"サービスが依存しているサービスは"mdmonitor"で、これとの起動順は"mdmonitor"サービスが起動した後(After)で、かつファイル共有する場所(今回の場合"/media" )がマウントされるのを待ってから起動するという意味です。依存しているサービスの指定に"Requires="を使っているので、"mdmonitor"サービスの起動が失敗したら"samba-ad-dc"サービスは起動されません。(あぁ、この厳格な設定要求ったら、まるで某製品のようだ・・・)
設定を反映させて、再起動。
# systemctl daemon-reload
# reboot
|
今のところ、これで問題はない様子です。
ついでに、monitorix にも設定を追加してみました。monitorix も、Anything-sync-daemon と mdadm に依存しますよね。
# cd /etc/systemd/system
# mkdir monitorix.service.d
# cd monitorix.service.d
# vi requires.conf
|
設定内容は以下のとおり。
[Unit]
Requires=mdmonitor.service asd.service
After=mdmonitor.service asd.service
RequiresMountsFor=/media
|
|