ネットワーク名前空間で実行されているアプリケーションがあります。これは素晴らしい作品です。
別の名前空間でアプリケーションを複数回実行したいと思います。便宜上、アプリケーションの作業ディレクトリを名前空間内の/ tmp / nsXなどのディレクトリにバインドしたいと思います。
名前空間でこれを行うと、mount --bind /tmp/nsX /var/lib/my-app
名前空間を終了するとマウントが消えます。
名前空間に入るか出てくるかip netns exec bash
見ているのにunshare
どうすればnsenter
いいかわかりません。
私が欲しい:
- 名前空間のネットワーク構成
- 名前空間に、自分のアプリケーションの作業ディレクトリのバインドマウントを作成します。
- 名前空間から自分のアプリケーションを作成します。役に立つ場合は、「フォーク」オプションもあります。
- 何も消えたり消えたりせずにネームスペースを離れて入る能力。
他の名前空間タイプを使用する必要がある場合でも問題はありません。
答え1
なぜこれが起こるのですか?
ㅏネットワークネームスペースインストール設定を変更しません。ネットワーキングを処理します。
ただし、前のリンクで述べたように、最も顕著なネットワークネームスペースに関連するいくつかのインストール設定はネットワークネームスペースに依存します
/sys/class/net
。/proc/sys/net
これには動作に既に違いがあります。
/proc/sys/net
すでにインストールされている場合は、新しい名前空間に入ると動的に変更されますが、すでにインストールされている/sys/class/net
場合は変更されません。これは実際のコマンドを使用するときを意味します。ただネットワーク名前空間を変更します。unshare -n -- sh -c 'ls -1d /proc/sys/net/*/conf/* /sys/class/net/*'
以前のネットワークインターフェイスは消えましたが
/proc/sys/net/
(インターフェイスの新しいインスタンスのみが残っていますlo
)、次はまだ表示されます/sys/class/net/
。新しいネットワーク名前空間のインターフェイスとのやり取りを防ぎ、以前のネットワーク名前空間のインターフェイスとのやり取りを許可します。相互作用、これはおそらく良い考えではないでしょう。このネットワーク関連の問題を解決するには、
/sys
新しいネットワーク名前空間に(再)インストールする必要があります。以前の(初期)ネットワーク名前空間専用の環境に影響を与えたくない場合は、最新のネットワーク名前空間でこれを行う必要があります。山名前空間。その理由は次のとおりですip netns exec
。どちらも可能なアプリケーション用に一貫したネットワーク環境を準備します。入力する既存のネットワーク名前空間(バインドマウントを介して作成および維持されているip netns add
)と共有をキャンセル新しいマウントネームスペース。マウントネームスペースは、プロセスがそれを参照している間だけ持続します。残りのプロセスがないと、マウント名前空間とその中で実行されたすべてのマウントが消えます(そのプロセスでのみ表示されます)。
したがって、(マウントを最初に処理しようとせずに)または単独
unshare -m
で使用すると、呼び出し間のバインドされたマウントは維持されません。ip netns exec
解決策
インストールはこれを行う必要があります使用前ip netns exec ...
にワンクリックで完了、名前空間を作成して削除(インストール)する別の手順ではありません
/etc/netns
実際にip netns exec
これらのバインドマウントはすでに独自の呼び出しで管理されていますが、特定の場所では次のようになります。/etc/netns
。ip netns exec foo
呼び出されるたびに、ディレクトリおよび/またはファイルが存在し、一致する場合は、マウントされたアイテムを一致するアイテムに/etc/netns/foo/*
自動的にバインドします/etc/*
。この機能は、別の名前空間でサービスの複数のインスタンスを簡単に実行できるようにするためであるため、この機能を優先する必要があります。解決策として。
/etc/
たとえば、アプリケーションは特定の場所で設定を検索し、/etc/my-app/
そこにはnetnsごとに異なるファイルがある必要があり、その内容はアプリケーションがどこにあっても作業ディレクトリを指す必要があります/var/lib/my-app/nsX
(例/tmp/nsX
:)。
このディレクトリには/etc/my-app/
存在する必要があり、スクリプトが実行されているインスタンスを準備するために使用するテンプレートファイルの種類を含めることができますが、その内容はバインドマウントの対象となるため、他の名前空間に隠されます。
mkdir -p /etc/netns # it is usually not provided by the distribution
for instance in foo bar baz; do
mkdir "/etc/netns/$instance"
cp -a /etc/my-app /etc/netns/$instance/
done
その後、スクリプトを使用するか、手動で各インスタンス(データの場所、pidファイルの場所など)をカスタマイズし、他の場所(/var/
または/run
いくつかの起動ツール/設定の助けを借りて)に関連するディレクトリを追加する必要があります。TMPファイル.d)。
これが正しく実行されたら、次のようにさまざまなネットワーク上でアプリケーションの複数のインスタンスを実行できます。
ip netns exec foo my-app
ip netns exec bar my-app
ip netns exec baz my-app
互いに衝突しません。つまり、これまでより多くの作業を行う必要があることを意味します。
unshare -m
ip netns exec
加える
アプリケーションがラッパーからパラメータを受け取ることができない場合、またはラッパーにこれを実行させ、次/etc
のバインドマウントのみを使用するように要求する場合は、次の/var/lib/my-app
バインドマウントもip netns exec
機能します。
ipnetns名前空間を作成します。
ip netns add foo
ip netns add bar
ip netns add baz
ネットワーク構成の準備:
ip -n foo link ....
アプリケーションを実行します。
unshare -m sh -c 'mount --bind /tmp/foo /var/lib/my-app; exec ip netns exec foo my-app'
unshare -m sh -c 'mount --bind /tmp/bar /var/lib/my-app; exec ip netns exec bar my-app'
unshare -m sh -c 'mount --bind /tmp/baz /var/lib/my-app; exec ip netns exec baz my-app'
これらのバインドマウントは後で消えますが、今はインスタンス化されていますmy-app
。
ip netns exec
追加の中間マウントネームスペースを使用して、すでに組み込まれている機能をある程度再現します。
包装紙
また、マウントに追加のパラメータを必要とするラッパースクリプトを使用して、これらの追加のマウントネームスペースを回避することもできます。
my-app.wrapper
(確認せず):
#!/bin/sh
mount --bind /tmp/"$1" /var/lib/my-app
shift
exec my-app "$@"
そして、以下を実行してください:
ip netns exec foo my-app.wrapper foo
完成
どの方法を選択しても、いくつかの起動スクリプトに統合する必要があります。いくつかのsystemd
例を見てくださいインスタンス化された属性(ここに私の例があります。) は、上記のいずれかの方法で使用して、同じアプリケーションの新しい netns インスタンスを動的に作成して実行できます。