network namespaces(7)的Linux手册页说:
Network namespaces provide isolation of the system resources associated with networking: […], the /sys/class/net directory, […].
但是,简单地切换到不同的网络命名空间似乎并没有改变/ sys / class / net的内容(请参阅下面的如何重现).我只是错误地认为setns()进入网络命名空间已经足够了吗?为了获得与当前加入的网络命名空间匹配的正确/ sys / class / net,是否总是需要重新安装/ sys?或者我在这里错过了其他什么?
重现的示例
使用* ubuntu系统,找到rtkit-daemon的PID,进入守护进程的网络命名空间,显示其网络接口,然后检查/ sys / class / net:
$PID=`sudo lsns -t net -n -o PID,COMMAND | grep rtkit-daemon | cut -d ' ' -f 2`
$sudo nsenter -t $PID -n
# ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# ls /sys/class/net
docker0 enp3s0 lo lxcbr0 ...
请注意,虽然ip link show正确显示lo,但/ sys / class / net显示“root”网络命名空间(和“root”mount命名空间)中可见的所有网络接口.
在rtkit-daemon的情况下,也进入它的mount命名空间没有什么区别:sudo nsenter -t $PID -n -m然后ls / sys / class / net仍然显示网络命名空间中不存在的网络接口.
“固定”
许多人赞同@Danila Kiver来解释Linux内核场景背后的真实情况.在正确的网络命名空间加入时重新安装sysfs将在/ sys / class / net中显示正确的条目:
$PID=`sudo lsns -t net -n -o PID,COMMAND | grep rtkit-daemon | cut -d ' ' -f 2`
$sudo nsenter -t $PID -n
# MNT=`mktemp -d`
# mount -t sysfs none $MNT
# ls $MNT/class/net/
lo
# umount $MNT
# rmdir $MNT
# exit
所以这现在在/ sys / class / net中产生了正确的结果.