나는 다음을 관찰했습니다.
쉘 1에서 권한이 없는 사용자로:
user@box:~$ sysctl kernel.unprivileged_userns_clone
kernel.unprivileged_userns_clone = 1
user@box:~$ unshare --mount --user
nobody@box:~$ echo $$
18655
쉘 번호 2를 루트로 입력하십시오.
root@box:~# mkdir -p /tmp/myns
root@box:~# touch /tmp/myns/{user,mnt}
root@box:~# mount --bind /proc/18655/ns/user /tmp/myns/user
root@box:~# mount --bind /proc/18655/ns/mnt /tmp/myns/mnt
mount: /tmp/myns/mnt: wrong fs type, bad option, bad superblock on /proc/18655/ns/mnt, missing codepage or helper program, or other error.
오류는 놀랍습니다. 설치 네임스페이스를 파일에 바인드 마운트할 수 없지만 사용자 네임스페이스를 파일에 바인드 마운트할 수 있습니까? 왜 이런 일이 발생하며 권한이 없는 사용자가 이 마운트 네임스페이스를 사용할 수 있도록 하려면 어떻게 해야 합니까 user
?
내가 이걸 왜 원하는 걸까~user
: 프로그램을 테스트하기 위해 임시 파일 시스템을 덮어쓰고 처음에는 원본 콘텐츠를 공유하고 싶습니다 . 다음과 같이 루트로 설정할 수 있습니다.
tmp='/tmp/GAtcNNeSfM8b'
mkdir -p "$tmp"
mount -t tmpfs -o size=100m tmpfs "$tmp"
mkdir -p "${tmp}/"{upper,work,lower}
mount --bind -o ro /home/user "${tmp}/lower"
unshare -m
mount -t overlay -o"lowerdir=${tmp}/lower,upperdir=${tmp}/upper,workdir=${tmp}/work" overlay /home/user
touch /tmp/namespace
mount --bind /proc/self/ns/mnt /tmp/namespace
그러나 마지막 줄은 실패합니다.
nsenter --mount=/tmp/namespace
이는 변경 사항이 /home/user
영구적이지 않다는 점을 제외하면 권한이 없는 사용자가 이전과 동일한 시스템을 볼 수 있도록 하기 위한 것입니다 . 사실 저는 사용자 네임스페이스 공유를 해제하고 싶지도 않습니다.
저는 의식적으로 LXC, Docker, 심지어 VirtualBox의 오버헤드를 피하려고 노력하고 있습니다. 나는 이것이 Linux 표준 도구를 사용하여 가능해야 한다고 생각합니다.
고쳐 쓰다:저는 최신 ArchLinux를 실행하고 있습니다.
$ uname -r
5.0.10-arch1-1-ARCH
답변1
마운트 네임스페이스에만 영향을 미친다는 점을 감안할 때 이것이 다음 중 하나 때문인지 의심됩니다.루프 방지 점검네임스페이스를 마운트하는 데 사용됩니다. unshare --mount
설치 전파가 default 로 설정되어 있으므로 이것이 링크에서 논의된 것과 정확히 같은 상황이라고 생각하지 않습니다. private
즉, 비활성화되어 있습니다.
private
그러나 일부 경쟁 조건을 방지하려면 마운트 전파를 사용하여 마운트 내부에 마운트 네임스페이스를 마운트해야 할 수도 있다는 것이 전적으로 옳다고 생각합니다 . 나는 또한 당신 이 unbindable
.unbindable
private
즉, 다음 명령을 사용하여 준비된 디렉터리에 탑재 네임스페이스를 탑재합니다.
mount --bind /var/local/lib/myns/ /var/local/lib/myns/
mount --make-unbindable /var/local/lib/myns/
전반적으로 이것이 이와 같은 문제를 유발하지 않는 가장 안전한 방법이라고 생각합니다.
내 경쟁 조건은 가상입니다. 나는 당신이 대부분의 시간 동안 그것을 칠 것이라고 기대하지 않습니다. 그래서 나는 당신의 실제 문제가 무엇인지 모릅니다.