NSFS 파일 시스템이란 무엇입니까?

NSFS 파일 시스템이란 무엇입니까?

커널에는 파일 시스템 nsfs가 포함되어 있습니다. 마운트된 각 스냅샷에 대해 snapdnsfs 마운트를 생성합니다 /run/snapd/ns/<snapname>.mnt. ls0바이트 파일로 표시합니다.

커널 소스 코드에는 이에 대한 문서나 설명이 포함되어 있지 않은 것 같습니다. 주요 구현은 다음과 같습니다.여기그리고헤더 파일은 여기.

이를 보면 네임스페이스와 관련이 있는 것으로 보인다.

저장소를 검색해도 활성화 또는 비활성화에 대한 Kconfig 항목을 찾지 못했습니다...

이 파일 시스템의 목적과 용도는 무엇입니까?

답변1

에서 언급했듯이커널 커밋 로그위의 jiliagre에 링크된 이 nsfs파일 시스템은 Linux 커널을 만드는 가상 파일 시스템입니다.네임스페이스쓸 수 있는. /proc이는 일부 프로세스 디렉터리 항목이 nsfs파일 시스템의 inode를 참조하여 특정 프로세스(또는 스레드)에서 현재 사용 중인 네임스페이스를 표시하는 "proc" 파일 시스템과 별개입니다 .

nsfs목록 /proc/filesystems에 없으므로 proc명시적으로 설치할 수 없습니다. mount -t nsfs ./namespaces"알 수 없는 파일 시스템 유형"으로 인해 실패했습니다. 파일시스템과 밀접하게 얽혀 있기 nsfs때문 이다 .proc

파일 시스템 유형은 nsfs다음 경우에만 표시됩니다./proc/$PID/mountinfo번들 설치기존(!) 네임스페이스 파일 시스템이 다른 대상에 연결되어 있습니다. Stephen Kitt가 위에서 올바르게 제안한 것처럼 이는 프로세스에서 더 이상 네임스페이스를 사용하지 않더라도 네임스페이스를 활성 상태로 유지하는 것입니다.

예를 들어, 새 네트워크 네임스페이스로 새 사용자 네임스페이스를 생성한 다음 이를 바인드 마운트한 다음 종료합니다. 네임스페이스는 여전히 존재하지만 더 이상 나열되지 않지만 존재 뷰를 바인드(확실히) 마운트하기 lsns때문에 찾을 수 없습니다 ./proc/$PID/ns

# bind mount only needs an inode, not necessarily a directory ;)
touch mynetns
# create new network namespace, show its id and then bind-mount it, so it
# is kept existing after the unshare'd bash has terminated.
# output: net:[##########]
NS=$(sudo unshare -n bash -c "readlink /proc/self/ns/net && mount --bind /proc/self/ns/net mynetns") && echo $NS
# notice how lsns cannot see this namespace anymore: no match!
lsns -t net | grep ${NS:5:-1} || echo "lsns: no match for net:[${NS:5:-1}]"
# however, findmnt does locate it on the nsfs...
findmnt -t nsfs | grep ${NS:5:-1} || echo "no match for net:[${NS:5:-1}]"
# output: /home/.../mynetns nsfs[net:[##########]] nsfs rw
# let the namespace go...
echo "unbinding + releasing network namespace"
sudo umount mynetns
findmnt -t nsfs | grep ${NS:5:-1} || echo "findmnt: no match for net:[${NS:5:-1}]"
# clean up
rm mynetns

출력은 다음과 유사해야 합니다.

net:[4026532992]
lsns: no match for net:[4026532992]
/home/.../mynetns nsfs[net:[4026532992]] nsfs   rw
unbinding + releasing network namespace
findmnt: no match for net:[4026532992]

네임스페이스는 nsfs 파일 시스템을 통해서는 생성될 수 없으며 시스템 호출을 통해서만 생성될 수 있습니다.클론()( CLONE_NEW...) 그리고공유 취소. nsfs네임스페이스의 현재 커널 상태만 반영할 뿐, 생성하거나 삭제할 수는 없습니다 .

네임스페이스는 참조나 프로세스가 없는 한 자동으로 삭제됩니다(따라서 no /proc/$PID/ns/...).그리고위의 예에서 살펴본 것처럼 바인드 마운트도 없습니다.

답변2

이것은 다음에 의해 생성된 "네임스페이스 파일 시스템"입니다.setns소스 코드에 표시된 대로 시스템 호출은ioctl과 관련된 네임스페이스(예를 들어 NS_GET_USERNS, NS_GET_OWNER_UID...)

NSFS/procLinux 3.19 이전에는 파일 시스템에서 의사 파일 항목이 제공되었습니다. 여기있어이 변경 사항을 커밋합니다..

이 파일의 존재에 대한 가능한 설명은 Stephen Kitt의 의견을 참조하세요.

관련 정보