我希望我系统上的所有物理接口都存在于称为“物理”的特定网络命名空间中。ip link set enp2s0 netns physical
使用和之类的命令手动移动设备很容易iw phy phy0 set netns name physical
,但我希望这在启动时和运行时连接的任何设备上都自动发生。
似乎实现这一点的最佳方法是通过 udev 规则,或者可能是一些 systemd 魔法。
我的第一个想法只是编写一个运行适当命令的 udev 规则,但我遇到了几个我无法通过搜索回答的问题:
- 如何区分物理接口和虚拟接口?
- 如何区分 WLAN 接口以便发出
iw
命令而不是ip
命令? - 如何获取 WLAN phy 的名称以便将其传递给
iw
命令?
我希望上述内容相对简单,但我在udevadm info
.
根据 AB 的回答,我想出了以下规则:
DEVPATH!="/devices/virtual/*
是只抓物理设备的关键。[email protected]
是将接口移动到所需命名空间 (physical
) 的一次性服务:(
[email protected]
只需创建给定名称的网络命名空间。)最后,
move-netif
负责弄清楚如何移动界面:这些信息中的大部分都可以从以下位置检索
/sys
:1a。
/sys/class/net/
:网络设备列表,包括所有类型1b。
/sys/devices/virtual/net/
:虚拟网络设备列表:包括lo
,隧道,veth,网桥......所以如果它在前者但不是这个,它应该是物理的。如果设备是现代无线设备(驱动程序),它将具有条目
/sys/class/net/<device>/phy82011/name
,例如:因此,通过从环境中运行适当的脚本
udev
并与来自 的那些目录和文件进行比较/sys
,您应该拥有执行此操作所需的所有信息。顺便说一句,如果以后要在这些设备上工作,您只需更改网络命名空间(例如using
nsenter --net=/var/run/netns/physical
),/sys
仍将位于主机的挂载命名空间中,并且不会反映这些设备的到来,而是会显示它们失踪。使用ip netns exec physical command
很好,它确实会更改挂载命名空间并/sys
为您重新挂载。