暗号化ディスクをsystemdでがんばる
有用なユーティリティコード
- TOP
- Old Archives
- 暗号化ディスクをsystemdでがんばる
これまで単純にスクリプトで暗号化ディスクをマウントしていた。 systemdスクリプトにするのは簡単で、実際にSystemdで自動マウントしていた時期もある。
だが、今回は「ちゃんと」Systemdを使うことにした。
スクリプトはGitHubで公開している。
私の場合、btrfsのボリュームとして4つのデバイスを使い、その4つのデバイスはディスク全体をdm-crypt
plainで暗号化したものだ。
つまり、おおまかにはcrpytsetup
のあとmount
する必要があり、かつcryptsetup
は全ディスク分ループしなくてはいけない。
これ自体はスクリプトとして用意してあり、これまでそれを使っていた。 Systemd対応にするのも、単純にSystemd経由にするだけなら、以前のエントリの通り簡単なユニットで良い。
今回はスクリプトは、「後処理」に対応した。
もちろん、スクリプトに後処理を組み込むなら非常に簡単な話だ。
だが、それでは「後処理に失敗するとユニット全体が失敗」してしまう。
そこで、systemdのExecStartPost
を使うことにした。
それに伴って、スクリプトは起動スクリプトらしくなったし、設定ファイルを使うようになったりしている。
elif [[ "$1" == post ]]
then
### StartPost
if whence -f opendisk_after >&2
then
opendisk_after
else
exit 0
fi
fi
これでだいぶ整った。これを呼ぶほうは
ExecStartPost=/usr/local/sbin/opencryptdisk.zsh post /etc/opencryptdisk/%I.conf
%I
については後ほど説明。
しかしここでだいぶ躓いた。ExecStart
の完了を待たずにExecStartPost
してしまうため、ここに処理が入っているとコケるのだ。
これは、Type
を省略しているとsimple
として扱われる。これは、フォアグラウンドで走るデーモンのためのユニットタイプで、「実行と同時に起動完了・実行終了とみなす」というもの。
実際はスクリプトの実行が終わった時に起動完了・実行終了としてほしいため、
Type=oneshot
を追加した。
同じような理由でExecStop
が入っているとこけていたため、スクリプトにはcloseも入っているが、ExecStop
が外されている。
ExecStop
でアンマウントするのであれば、
RemainAfterExit=yes
として、「スクリプト終了時に起動完了・実行は継続とみなす」にする必要がある。 ただ、マウントと暗号化デバイスは、多分終了時に自動的にうまくやってくれるため、必要ないと判断して外してある。
systemdユニットがname@.service
の形になっていると、name@param.service
として起動することができ、@param
をユニット内で%Iとして使うことができる。
複数ボリュームのマウントを可能にするため、この機能を使用している。
Systemdについてだが、非常に高機能だが、一方で複雑でめんどくさい。
例えば、マウントもスクリプト内でやるのではなく、.mount
ユニットにして、そのAfter
で復号化してから実行、という形もとれたが、明らかにmountを書くほうが早い。
やはりかなりの暗黒面だ。