web-dev-qa-db-ja.com

LXCゲストマシンにカーネルモジュールをインストールするにはどうすればよいですか?

LXCゲストマシンにOpenStack DevStackをインストールしようとしています。 DevStackのパッケージの1つには新しいカーネルモジュールが必要ですが、LXCゲストでmodprobeを実行しようとするとエラーが発生します。

ubuntu@lxc$ Sudo modprobe scsi_transport_iscsi
FATAL: Could not load /lib/modules/3.2.0-48-generic/modules.dep: No such file or directory

LXCゲストマシンにこのモジュールをインストールするにはどうすればよいですか?

12
mars

簡単な答えは、できません。 LXCコンテナはホストとカーネルを共有し、デフォルトではモジュールをロードできません(これはかなり危険なため)。

標準的な推奨事項は、コンテナを起動する前にホストにモジュールをロードすることです。それは、古き良きinitスクリプトを使用するか、lxcフックを使用して行うことができます(詳細については、最近の私の投稿を参照してください: https://www.stgraber.org/2013/12/23/lxc-1- 0-some-more-advanced-container-usage /

13
stgraber

この答えのために、コンテナの名前が「foo」であると仮定します。

  1. ホストから、/ var/lib/lxc/foo/configのコピーを保存します。これは、私の指示に問題が発生した場合に備えてください。

  2. SYS_MODULE機能を保持するには、コンテナを構成する必要があります。このような構成により、そのコンテナはカーネルを引き継ぐことができ、それによりホストを引き継ぐことができることに注意してください。これを行うには、「lxc.cap.drop」または「lxc.cap.keep」構成行を変更します。 「lxc-create --name foo --template download-...」で作成されたUbuntu 19.04ゲストを実行している場合...

ファイル/ var/lib/lxc/foo/configには「lxc.include = /usr/share/lxc/ubuntu.common.conf」という行が含まれ、ファイル/usr/share/lxc/ubuntu.common.confは「lxc.include = /usr/share/lxc/config/common.conf」という行が含まれ、ファイル/usr/share/lxc/config/common.confには次のような行が含まれます。

lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio

その最後の行を/ var/lib/lxc/foo/config(または "include /usr/share/lxc/ubuntu.common.conf"の後の任意の場所)の最後にコピーしてから、そこから "sys_module"を削除する必要がありますリスト。

  1. コンテナにカーネルモジュールのコピーが必要です。ホストがUbuntuカーネルを実行している場合、ゲストから「Sudo apt install kernel-image-$(uname -r)」などの操作を実行できる場合があります。それ以外の場合、ホストから、次のような操作が必要になる場合があります(コンテナの名前が「foo」であると仮定):

mkdir -p/var/lib/lxc/foo/rootfs/lib/modules cp -apr/lib/modules/$(uname -r)/ var/lib/lxc/foo/rootfs/lib/modules /

  1. その後、ゲストfooが実行中の場合はシャットダウンし、「lxc-start --name foo」などで再起動します。

これで、LXCコンテナはカーネルモジュールをロードおよびアンロードできるはずです。

1
Adam Richter