LXC(Linux Containers)という技術があります。Linux上でアプリケーションレベルの仮想化環境を提供するものですが、最近そのマシン上でうまくIPv4アドレスが取得できない問題が発生しました。本記事では、その原因および対処について紹介します。注)記事中LXCとLXDを混同して使っています。
TL; DR
仮想マシン上で、
systemctl edit systemd-networkd.service
を実行して、起動したエディタに
[Service]
BindReadOnlyPaths=/sys
を入力して保存する。
続いてsystemctl restart systemd-networkd.service
を実行してサービスを再起動する。
問題の識別
この問題は、主に以下の条件を満たす環境で発生することがわかっています。
- DHCPクライアントにsystemd-networkdを採用している
- systemdのバージョンが244.1以上である
現在、この環境を満たすのは、ArchLinux、Fedora など先端を行くディストリビューションに限られますが、ディストリビューションに依存する問題ではないため、今後問題の影響を受けるシステムは拡大しそうです。
原因
LXC側では問題の原因を把握しており、現在対処中です。
https://discuss.linuxcontainers.org/t/no-ipv4-on-arch-linux-containers/6395/23
によると、このリグレッションはsystemd-224.1のバグ修正によるもので、/sysディレクトリがコンテナ内でリードオンリーになっていないことに起因するそうです。
コンテナ内ではudevやネットワーク操作など様々な理由から/sysへの書き込み権限が必須ですが、systemd側はこの問題に対するLXC側の修正提案を拒否したようです。
そのため、対処は可能ですが、LXC側の軽微な修正では済まなくなり、カーネルレベルまでエスカレーションしての修正になるそうです。
いずれは修正されますが、パッチの適用された新しいカーネルが提供されるまで、この問題に暫定的に対処する必要があります。
対処
ユーザー側でできる暫定的対処策としては以下が提案されています。
- コンテナで/sysをリードオンリーでマウント
- systemd-networkdユニットファイルをオーバーライドして/sysをリードオンリーでマウントする(冒頭の方法)
現在、LXCではディストリビューションイメージにsystemd-networkdオーバーライドファイルを含めて配信することを検討しているそうです。
以上、取り急ぎですが参考になれば幸いです。