리눅스 매뉴얼 페이지네트워크 네임스페이스(7)설명하다:
네트워크 네임스페이스는 네트워크 관련 시스템 리소스([...], /sys/class/net 디렉터리, [...])를 격리합니다.
그러나 단순히 다른 네트워크 네임스페이스로 전환한다고 해서 내용이 변경되는 것은 아닌 것 같습니다 /sys/class/net
(재현 방법에 대한 자세한 내용은 아래 참조). 내가 방금 setns()
잘못 생각한 걸까?회로망네임스페이스로 충분합니까? 현재 연결된 네트워크 네임스페이스를 /sys
올바르게 일치시키려면 항상 다시 마운트해야 합니까 ? /sys/class/net
아니면 여기서 다른 것을 놓치고 있습니까?
재현 예
*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: <LOOPBACK,UP,LOWER_UP> 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
모두"루트" 네트워크 네임스페이스(및 "루트" 마운트 네임스페이스)에 표시되는 네트워크 인터페이스입니다.
마운트 네임스페이스도 입력 하면 rtkit-daemon
아무런 차이가 없습니다. sudo nsenter -t $PID -n -m
그러면 ls /sys/class/net
네트워크 네임스페이스에 존재하지 않는 네트워크 인터페이스가 계속 표시됩니다.
"고정시키다"
많은 영예@danilakeeferLinux 커널의 뒤에서 무슨 일이 일어나는지 설명하십시오. 다시 설치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
.
답변1
우리에게 보여줘 man 5 sysfs
:
/sys/class/net
Each of the entries in this directory is a symbolic link representing
one of the real or virtual networking devices that are visible in
the network namespace of the process that is accessing the directory.
따라서 이 맨페이지에 따르면 의 출력은 프로세스의 네트워크 네임스페이스 ls /sys/class/net
에 따라 달라져야 합니다 . ls
하지만... 실제 동작은 이 매뉴얼 페이지에 설명된 것과 같지 않은 것 같습니다.작동 방식에 대한 좋은 커널 문서가 있습니다..
모든 sysfs
마운트에는 하나가 있습니다.네임스페이스 태그와 연관되다. 이 레이블은 sysfs 설치 중에 설정됩니다.호출 프로세스의 네트워크 네임스페이스에 따라 다름. 각 sysfs 항목(예: 의 항목 /sys/class/net
)도네임스페이스 태그가 있을 수 있습니다.와 연관되다.
sysfs 디렉토리를 탐색하면 커널은 다음을 얻습니다.sysfs 마운트 네임스페이스 레이블, 항목을 반복하고,다른 네임스페이스 태그가 있는 항목을 필터링합니다..
따라서 반복 결과는 현재 프로세스 /sys/class/net
의 네트워크 네임스페이스가 아니라 마운트를 시작한 프로세스 의 네트워크 네임스페이스에 따라 달라지므로 항상 현재 네트워크 네임스페이스(모든 프로세스에 속함)에 마운트해야 합니다. 네임스페이스)를 사용하여 올바른 결과를 확인하세요./sys
/sys