コンテナにはネットワークインターフェイスがありますが、ホストにはありません。 eth0をコンテナに公開する方法

コンテナにはネットワークインターフェイスがありますが、ホストにはありません。 eth0をコンテナに公開する方法

読み取り専用 rootfs を使用してシステムを構築しています。

このrootfsは、ホストと作成されたコンテナ間で共有されます。

ホストにはネットワーク関連のサービスやファイルを含めることはできません。つまり、ホスト接続をブリッジできません。

現在USBネットワークアダプタを使用しています。

コンテナ内のデバイスとネットワークサービスのみを起動するにはどうすればよいですか?

すべてのコンテナは/ etc / varなどの新しいRWマウントポイントを設定できるため、必要なすべてのファイルは他のパーティションからアクセスできます。ただし、ホストはまだROであり、ファイルは制限されています。

答え1

ネットワークカードをハードウェアの特定の部分として忘れてください。ネットワークインターフェイスがあり、それをコンテナに移動する必要があるとします。これはUSBまたはPCIパススルーではありません。我々はこれをインターフェース転送と呼ぶ。ネットワークネームスペースロジック例えばip link:

ネットワークネットワーク名|PID

名前に関連付けられているネットワーク名前空間にデバイスを移動します。ネットワーク名またはプロセスPID。一部のデバイスでは、ループバック、ブリッジ、ppp、ワイヤレスなどのネットワーク名前空間の変更は許可されていません。これはネットワークネームスペースローカルデバイスです。この場合、ipツールは「無効な引数」エラーを返します。デバイスが単一のネットワーク名前空間に対してローカルであることを確認できます。netns-local出力のフラグethtool:

ethtool -k DEVICE

ワイヤレスデバイスのネットワークネームスペースを変更するにはiwツールを使用できます。ただし、物理デバイスとプロセスのネットワーク名前空間の変更のみが許可されます。PID

インターフェイスは最初にホストシステムに表示されるはずですが、コンテナに移動できます。プラグイン時にコンテナに直接表示するオプションはありませんが(もちろん、コンテナの起動時にコンテナの特定の設定を介してインターフェイスを移動できること、以下を参照)、機能することもできますudev。ホストとコンテナネットワーキングがまったく使用されていなくても、ホストはもちろん必要なすべてのネットワーキングオプションを使用してコンパイルする必要があります。

したがって、最終的にカードがeth0ホストから呼び出され、実際にイーサネット(無線ではない)の場合、このコマンドはカードを宛先名前空間に移動します。

ip link set eth0 netns NETNSNAME

ここで、NETNSNAMEは、上記のように、ターゲットネットワークネームスペース内のプロセスのpid、または「インストール」されて処理されるネットワークネームスペースですip netns add NETNSNAME

2つの一般的なコンテナテクノロジLXCとDockerの場合、NETNSNAMEを次のターゲットコンテナに置き換える方法は次のとおりですcontainername

LXC:

ip link set eth0 netns $(lxc-info -H -p -n containername)

ルーストアバウト:

ip link set eth0 netns $(docker inspect --format '{{.State.Pid}}' containername)

ワイヤレスの場合(よく文書化されていない)コマンドは、次のように明示的に接続されたワイヤレスインターフェイスが1つしかない場合ですphy0

iw phy phy0 set netns $(lxc-info -H -p -n containername)

ただし、これは以下のようにドライバがサポートしている場合にのみ機能します。

# iw phy0 info|grep netns
     * set_wiphy_netns

おそらく手動ではできません上記のコマンドを特定のコンテナ(LXC、Docker...)の設定で使用してください。たとえば、LXC 3.0(LXC 2.xで構文が変更されました)の場合、構成ファイルには次の行が含まれます。

lxc.net.1.type = phys
lxc.net.1.link = eth0

同じ構成でイーサネットまたはワイヤレスを処理します。

そして、コンテナが起動するたびに、インターフェイスはコンテナによって吸収されます。コンテナ(より正確には対応するネットワーク名前空間)が停止すると、インターフェイスはホストに返されます(他のコンテナに直接返すことはできません)。

説明いくつかのユースケース。

答え2

Frost Schutzのコメントについて詳しく説明します。

  • ここで説明されているように、--privilegedモードを有効または無効にすることなく、コンテナがUSBデバイスにアクセスできるようにすることができます。指示する(ただし、ネットワーク機器なのでドライバが必要になる可能性が高い)

  • USBパススルーを使用してコンテナ内のデバイスを表示できる場合は、コンテナ内のデバイスのカーネルモジュールを変更してコンテナを再起動してください。もちろん、ネットワーク設定もあります。

  • 次のページのディスカッションの情報は、お客様のユースケースに適している場合に役立ちます。ページ (最後の説明はまだ設定されていないため、新しい起動時には表示されませんが、ドライバが動作するはずですので、そこからインポートする必要があります。)

関連情報