解決策

解決策

ネットワーク名前空間で実行されているアプリケーションがあります。これは素晴らしい作品です。

別の名前空間でアプリケーションを複数回実行したいと思います。便宜上、アプリケーションの作業ディレクトリを名前空間内の/ 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/netnsip 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 -mip 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 インスタンスを動的に作成して実行できます。

関連情報