はじめに
なんでか分からないけど、Hyper-V上のCentOS7のWindowsServerバックアップが失敗する。しかもDockerを動かしているクライアントだけが。
構成
ホストOS:WindowsServer2012R2
クライアントOS:CentOS7(kernel-3.10.0-510.10.2.el7.x86_64) on Docker(version17.3)
症状
- ライターで一時的でないエラーが発生しました。バックアップ処理を再試行しても、 おそらくエラーは再発します。
- 仮想マシン 'XXX' のバックアップ チェックポイントを作成できません: エラーを特定できません (0x80004005)。
などと申しており、バックアップに失敗します。Dockerを入れていない同じカーネルのCentOSは失敗していません。
原因
最初はホスト側に問題があるんじゃないかと思ったりもしたんですが、WindowsUpdateに該当しそうなパッチも無いし、メモリが足りんとかって訳でもなさそう。
じゃあクライアント側かってことで、ログを漁ってみると…。audit.logにこんな奴がおりました。
type=AVC msg=audit(...): avc: denied { search } form pid=000 comm="hypervvssd" name="docker"...
type=AVC msg=audit(...): avc: denied { read } form pid=000 comm="hypervvssd" name="docker"...
hypervvssdって明らかにHyper-V関係ですよね。調べてみると初期インストール時に含まれている「hyperv-daemons」ってパッケージの一部で、シャドウコピー作成時に動作するサービスのようです。(参考:https://docs.oracle.com/cd/E39368_01/e59456/section_dzn_tz2_kp.html)
systemctlからステータスを見てみますとHyper-V VSS: FREEZE of /var/lib/docker/overlay failed; err:13 Permission denied
ってエラーで止まってました。
以上のことからhypervvssdサービスがdocker関係(/var/lib/docker/overlay)のシャドウコピー作成時にselinuxに拒否られて止まってしまうのが原因ではないかと思われるといったとこでしょうか?
解決策
- setroubleshootなるものを入れてもう1日放置(
yum install setroubleshoot
)。 - setroubleshootが/var/log/messagesに吐き出したsuggestsを確認。
*** Plugin catchall (100. confidence) suggests ***
って解決方法のヒントが見つかるはず。今回は、selinuxにポリシーを追加せよと仰せでした。 - ポリシーを追加するためにまずはpolicycoreutils-pythonをインストール(
yum install policycoreutils-python
)し、audit2allowコマンドが実行できるようにする。 - 次にsuggestsの言う通りに
ausearch -c 'hypervvssd' --raw | audit2allow -M my-hypervssd
でaudit.logからポリシーファイルを生成。 -
semodule -i my-hypervssd.pp
でselinuxにポリシーを追加。
以上で、翌日以降のバックアップは無事正常終了するようになりましたとさ。
まとめ
- Hyper-V上のLinuxのシャドウコピーはクライアント側のhypervvssdサービスが関わってるよ。
- Dockerを入れている場合、hypervvssdがselinuxに引っかかるよ。
- WindowsServer側のログを見ただけじゃ、エラーの原因はさっぱりだよ(見当違いの原因を探しまくったよ)。