시스템의 모든 물리적 인터페이스가 "물리적"이라는 특정 네트워크 네임스페이스 내에 있기를 원합니다. ip link set enp2s0 netns physical
및 같은 명령을 사용하여 장치를 수동으로 이동하는 것은 매우 쉽지만 iw phy phy0 set netns name physical
시작 시 및 런타임에 연결된 모든 장치에 대해 이 작업이 자동으로 수행되기를 바랍니다.
이를 달성하는 가장 좋은 방법은 udev 규칙이나 일부 시스템 마법을 사용하는 것 같습니다.
내 첫 번째 생각은 적절한 명령을 실행하는 udev 규칙을 작성하는 것이었지만 검색으로는 답변할 수 없는 몇 가지 질문에 부딪혔습니다.
- 물리적 인터페이스와 가상 인터페이스를 어떻게 구별하나요?
iw
명령 대신 명령 을 실행할 수 있도록 WLAN 인터페이스를 어떻게 구별할 수 있습니까ip
?- 명령에 전달할 수 있도록 WLAN phy의 이름을 어떻게 얻습니까
iw
?
위의 내용이 비교적 단순하기를 바라지만, 뚜렷한 차별화 요소는 보이지 않습니다 udevadm info
.
답변1
AB의 답변을 바탕으로 다음 규칙을 생각해 냈습니다.
SUBSYSTEM=="net", ACTION=="add", DEVPATH!="/devices/virtual/*", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"
DEVPATH!="/devices/virtual/*
물리적 장치만 잡는 것이 핵심입니다. 인터페이스를 필수 네임스페이스( ) [email protected]
로 이동하는 일회성 서비스입니다 .physical
[Unit]
Description=Move interface to physical namespace
[email protected]
[email protected]
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/move-netif %I physical
( [email protected]
주어진 이름으로 네트워크 네임스페이스를 생성하면 됩니다.)
마지막으로 move-netif
인터페이스를 이동하는 방법을 파악하는 것은 사용자의 몫입니다.
#!/bin/bash
devpath="$1"
target_ns="$2"
if [[ -e "$devpath/phy80211" ]]; then
phy="$(basename "$(readlink "$devpath/phy80211")")"
iw phy "$phy" set netns name "$target_ns"
else
ifname="$(basename "$devpath")"
ip link set "$ifname" netns "$target_ns"
fi
답변2
이 정보의 대부분은 다음에서 검색할 수 있습니다 /sys
.
1a.: /sys/class/net/
모든 유형을 포함한 네트워크 장치 목록
1b.: /sys/devices/virtual/net/
가상 네트워크 장치 목록: include lo
,tunnel,veth,bridge... 따라서 전자이지만 이것이 아닌 경우 물리적 장치여야 합니다.
장치가 최신 무선 장치(드라이버)인 경우 다음
/sys/class/net/<device>/phy82011/name
과 같은 항목이 있습니다.$ grep -s --with-filename '' /sys/class/net/*/phy80211/name /sys/class/net/wlan0/phy80211/name:phy0 /sys/class/net/wlan1/phy80211/name:phy1 /sys/class/net/wlan2/phy80211/name:phy2
따라서 환경에서 적절한 스크립트를 실행하고 의 udev
해당 디렉터리 및 파일과 비교하면 /sys
이를 수행하는 데 필요한 모든 정보를 얻을 수 있습니다.
그런데, 나중에 이러한 장치에서 작업하려면 다음을 변경하면 됩니다.회로망네임스페이스(예를 들어nsenter --net=/var/run/netns/physical
)를 사용하면 /sys
여전히 호스트의산네임스페이스이며 이러한 장치의 도착을 반영하는 대신 해당 장치가 누락되었음을 표시합니다. 를 사용하는 것이 좋습니다 ip netns exec physical command
. 마운트 네임스페이스를 변경하고 /sys
다시 마운트합니다.