我有一个 Linux 网络命名空间绑定,安装位置~/mynamespace
如下:
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>