
~/mynamespace
次の場所にLinuxネットワークネームスペースバインディングがインストールされています。
unshare -mrn;
touch ~/mynamespace; # executed in the console opened by the first command
unshare --net=~/mynamespace true; # executed in the console opened by the first command
コマンド#1で生成された匿名ネットワークネームスペースのインタフェースをマウントされたネームスペースバインディングに移動するにはどうすればよいですか~/mynamespace
?
私の場合、内部ネームスペースまたはそのコピーをバインドマウントすることはまだ/var/run/netns
オプションではありません。関連コマンドは、ip ... netns
より標準的なディレクトリにバインドマウントされた/var/run/netns/
ネットワーク名前空間のみを許可すると思います。だからip
、この場合、コマンドは機能しないようです。
また、上記のすべてのコマンドは、rootなしで権限のないユーザーとして実行されることに注意してください。
答え1
unshare -mrn # which implies -U
特に明記しない限り、以下のすべての項目は上記の名前空間で実行されます。
使用しないでくださいip netns
touch $HOME/mynamespace
unshare --net=$HOME/mynamespace true
このtrue
時点ですべてのPID参照は失われますが、マウント参照は維持されるため、名前空間は存在し続けることができます。
これip link set ... netns
このコマンドはマウントポイントを取得できますまたは参照用のプロセスID:
ネットワークネットワーク名|PID
NETNSNAME名に関連付けられているネットワーク名前空間にデバイスを移動します。またはプロセスPID。
ip link add veth0 type veth peer name veth1
使用しない場合は、一時コマンドを使用してip netns
PIDを生成し、sleep
PID参照を取得してip link
使用できます。
nsenter --net=$HOME/mynamespace sleep 99 & pid=$!
ip link set veth1 netns $pid
得る:
# ip -br link
lo DOWN 00:00:00:00:00:00 <LOOPBACK>
veth0@if2 DOWN 86:c2:bc:ba:1a:01 <BROADCAST,MULTICAST>
# nsenter --net=$HOME/mynamespace ip -br link
lo DOWN 00:00:00:00:00:00 <LOOPBACK>
veth1@if3 DOWN 86:e3:a1:ce:48:4e <BROADCAST,MULTICAST>
使用ip netns
ip netns
機能するには共有インストールが必要ですが/run/netns
、まだインストールされていない場合(最初の使用時に)共有インストールが作成され、インストールされます。すでにインストールされていると検出された場合は、それを作成せずに後で失敗します(Cannot create namespace file "/run/netns/foo": Permission denied
)。これは、実際の初期ユーザーの名前空間のルートに属しているため、書き込めないためです。作成しないと、/run
実際の初期ユーザーネームスペースルートに属するコンテンツを書き込めないため、生成できません。など、さまざまな場合にip netns
権限なしでユーザーの名前空間で実行すると失敗します。
以前のバージョンの代わりに手動でインストールするとip netns
満足です。
存在し、何らかの理由で
/run/netns
現在の状態を維持したい場合:/run
mount -t tmpfs --make-rshared tmpfs /run/netns
ifが
/run/netns
存在しないか存在していても、全体をオーバーライドします/run
。ディレクトリは現在のディレクトリに作成できないため、
/run
マウントする必要があります。これにより、他の有用な情報へのアクセス権が失われますが、失敗した他のツール(iptables-legacy -w
他のツールと同様Fatal: can't open lock file /run/xtables.lock: Permission denied
)へのアクセス権が得られます。mount -t tmpfs tmpfs /run
これで、すべての標準ip netns
またはip link
コマンドがip -n foo ...
ユーザーの名前空間で通常どおりに機能します。
ip netns add mynamespace
ip link add name veth0 type veth peer netns mynamespace name veth1
得る:
# ip -br link
lo DOWN 00:00:00:00:00:00 <LOOPBACK>
veth0@if2 DOWN 2a:98:7f:83:bf:9e <BROADCAST,MULTICAST>
# ip -n mynamespace -br link
lo DOWN 00:00:00:00:00:00 <LOOPBACK>
veth1@if2 DOWN 96:3c:5e:a6:a4:4a <BROADCAST,MULTICAST>