나는 주위를 둘러보았고 /proc/*/ns
네임스페이스 파일이 이상해 보이는 것을 발견했습니다.
# example from `man namespaces`
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]
그럼 네임스페이스 파일은...무엇에 대한 심볼릭 링크인가요? 10자리 식별자가 있는 "무언가"? 내 말은, "모든 것이 파일이다"라는 것을 알고 있지만 이전에는 이와 같은 파일 경로를 본 적이 없습니다. 어디에 있습니까?
그리고 사악한 증오자들이여, 내가 지금 내 일반 파일이나 현재 파일을 가리킨다면 touch "/proc/$$/ns/cgroup:[4026531835]"
어떻게 될까요 cgroup
?
답변1
이것이 새로운 유형의 사물을 표현하기 위해 기존 추상화를 사용하는 핵심입니다. 이러한 파일은 실제로 전통적인 기호 링크 의미에서 어떤 것도 "지정"하지 않습니다. 이 값은 네임스페이스에 대한 유효한 핸들입니다. 커널은 이 정보를 내부적으로 사용하여 내부 데이터 구조에서 적절한 네임스페이스를 찾습니다.
/proc/<pid>/fd
프로세스에 소켓이 있으면 다음과 같은 내용이 표시됩니다.
lrwx------ 1 user group 64 Jun 28 14:35 3 -> 'socket:[17257]'
커널은 이러한 내용을 쓰려는 시도를 거부합니다. 예를 들어:
# echo hi > /proc/self/ns/ipc
bash: /proc/self/ns/ipc: Operation not permitted
또한 해당 디렉토리에 이름이 지정된 파일을 생성할 수 없습니다 ipc:[4026531839]
. 이는 proc 파일 시스템에 있으므로 파일/디렉터리는 커널 상태를 추상화한 것일 뿐이며 커널에서는 해당 디렉토리에 새 파일/디렉터리를 생성할 수 없습니다. 디렉토리 .
답변2
이러한 파일은 기호 링크로 표시됩니다. 이는 의사 파일 시스템에 속하는 의사 파일을 가리킵니다 nsfs
. 특수한 네임스페이스 작업은 포함하지 않습니다(클론 (2),설정(2),공유 취소(2),ioctl_ns(2)등), 내가 아는 한 이러한 파일에 대해 허용되는 유일한 작업은 파일을 열고 닫거나, 이름 페이지를 조작할 때 참조를 얻거나, 파일이 없어도 네임스페이스에 대한 참조가 유지되도록 마운트하는 것입니다. 프로세스가 이미 사용 중입니다. 수행 중인 작업과 같은 더 이상 존재하지 않습니다 ip netns add mynetnamespace
.
쉽게 사용할 수 있는 유일한 유용한 정보는 의사 심볼릭 링크로 표시되는 inode입니다(그리고 스크립트를 사용하여 검색할 수 있습니다 stat -L -c %i
). 이는 전역적으로 고유하므로(모든 다른 유형의 네임스페이스에 걸쳐 포함됨) 전문 도구 없이 다른 유사한 값과 비교할 수 있습니다. 같음은 동일한 의사 파일이므로 동일한 네임스페이스를 의미합니다.
$ ls -l /proc/$$/ns/net
lrwxrwxrwx. 1 user user 0 Jun 29 17:37 /proc/23615/ns/net -> net:[4026531992]
$ stat -c %F /proc/$$/ns/net
symbolic link
$ stat --file-system -L -c %T /proc/$$/ns/net
nsfs
$ stat -L -c %i /proc/$$/ns/net
4026531992
반품:
$ ip netns show
test
$ grep test /proc/mounts
nsfs /run/netns/test nsfs rw 0 0
내 답변 중 하나에서 네트워크 네임스페이스 사례에 대한 쉘 스크립트 사용 예:컨테이너의 인터페이스를 포함하여 Linux에 구성된 모든 인터페이스를 찾는 방법은 무엇입니까?