나는 컨테이너를 이해하려고 노력하고 있는데 LXC 개발자가 발견한 것으로 보이는 트릭을 우연히 발견했습니다.이것은 PR을 실행합니다pivot_root(".", ".")
: 이전 루트를 디렉터리에 넣을 필요가 없도록 이를 호출할 수 있습니다 . 그러나 이로 인해 마운트 네임스페이스가 이상하게 작동하게 됩니다.
unshare --user --map-root-user --mount bash -c "
mount --bind containerfs bindmountpoint
cd bindmountpoint
pivot_root . .
# this is fine:
ls -l /
# this is not fine:
ls -l /..
"
루트 마운트 네임스페이스의 루트를 가리키거나 이를 통해 액세스되는 부모 .
(아직 중첩을 시도하지 않았습니다)! 이는 nor의 상위를 가리키지 않고 외부 마운트 네임스페이스의 루트/루트를 가리킵니다../..
/..
/proc/<any>/cwd/..
containerfs
bindmountpoint
다시 한 번 이것을 시도했을 때 nsenter --user --preserve-credentials --mount --target=<pid>
이 새로운 프로세스는 CWD를 루트 설치 네임스페이스의 루트에 배치했습니다.
내가 있었을 때는 이런 일이 일어나지 않았을 것입니다 pivot_root(".", "oldroot")
. 이 동작은 파일 설명자 또는 .unmount 를 통해 umount -l /
이전 루트를 마운트 해제할 때도 사라집니다 umount -l /proc/1/cwd
.
pivot_root
또한 현재 프로세스에 대한 보장만 제공되므로 사용자 정의 C 프로그램에서 일련의 시스템 호출을 시도했습니다. 따라서 모든 작업을 동일한 프로세스에서 수행합니다. 동작은 CLI 도구를 사용하여 위에 표시된 다중 프로세스 단계와 동일합니다.
5.3 커널에서 테스트되었습니다.
달리면 어떻게 되나요 pivot_root(".", ".")
?
답변1
pivot_root(new_root, put_old)
호출 프로세스의 이전 루트 디렉터리(마운트의 루트여야 함) 를 해당 위치 로 이동 put_old
하고 배치합니다 . new_root
그런 다음 현재 디렉터리와 각 프로세스의 루트를 이전 루트 디렉터리로 설정합니다 new_root
.
따라서 pivot_root(".", ".")
새 루트 다음에는 이전 루트가 그 위에 설치됩니다.
다른 디렉토리가 마운트된 디렉토리로 해석될 때마다 ..
실제로는 그 위에 마운트된 디렉토리로 해석됩니다. ..
이는 파일 시스템의 루트 디렉터리를 제외하고 경로 탐색에 특별한 처리가 없고 디스크에 저장된 디렉터리 항목으로 구현되는 역사적인 Unix 및 Linux 동작과 일치합니다 .
이는 마운트 네임스페이스 이스케이프가 아닙니다.
답변2
진짜 버그같아...
배포판에서 최신 커널을 확인하고 전체 세부 정보를 보고하세요(테스트 프로그램을 첨부하세요!).