ip netns exec
이전에 netns 인터페이스를 수정하기 위해 명령을 사용한 적이 있습니다 . 그러나 netns와 연관된 이름(예: docker)이 없는 경우 명령 nsid
결과를 사용하여 ip netns list-id
netns 인터페이스를 수정하려면 어떻게 해야 합니까?
답변1
모든 nsid의 상위 프로세스 ID를 찾아야 합니다. 제가 아는 유일한 방법은 /proc/[0-9]*/ns/net
여기에 언급된 모든 것을 확인하는 것입니다.https://serverfault.com/a/900972/205043
# Create netns directory if not exist
mkdir -p /var/run/netns
# Add all process namespaces to netns
for i in /proc/[0-9]*/ns/net; do
ln -s $i /var/run/netns/proc$(echo $i | cut -d/ -f3)
done
# Remove unassociated network namespaces
for i in $(ip netns | grep ^proc | grep -v id); do
rm -f /var/run/netns/${i}
done
# Remove children processes
for i in $(ip netns | grep ^proc | awk 'a[$3]++ {print $1}'); do
rm -f /var/run/netns/${i}
done
# Do some action for each ns (eg. check if there is 1.2.3.4 address exists)
for i in $(ip netns | grep ^proc | awk '{print $1}'); do
echo -n "$i "
ip netns exec $i ip addr | grep -c '1.2.3.4'
done
# Remove added namespaces
rm -f /var/run/netns/proc*
내 경우 새로 추가된 nsid는 다음과 같습니다.
ip netns list-id
nsid 0 (iproute2 netns name: proc26847)
nsid 1 (iproute2 netns name: proc29068)
nsid 2 (iproute2 netns name: proc27483)
nsid 3 (iproute2 netns name: proc27644)
nsid 7 (iproute2 netns name: proc30377)
nsid 9 (iproute2 netns name: proc9606)
nsid 10 (iproute2 netns name: proc15587)
nsid 11 (iproute2 netns name: proc28395)
nsid 12 (iproute2 netns name: proc30729)
nsid 13 (iproute2 netns name: proc29702)
nsid 14 (iproute2 netns name: proc30060)
nsid 15 (iproute2 netns name: proc31698)
nsid 16 (iproute2 netns name: proc3309)
nsid 17 (iproute2 netns name: proc28934)
nsid 18 (iproute2 netns name: proc21272)
nsid 19 (iproute2 netns name: proc921)
nsid 21 (iproute2 netns name: proc32718)
nsid 26 (iproute2 netns name: proc5864)