2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LXC上の仮想マシンがIPv4アドレスを取得できない問題

Last updated at Posted at 2020-02-28

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オーバーライドファイルを含めて配信することを検討しているそうです。

以上、取り急ぎですが参考になれば幸いです。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?