명령을 확인 unshare
하고 해당 매뉴얼 페이지에 따르면
unshare - run program with some namespaces unshared from parent
또한 다음과 같은 네임스페이스가 나열되어 있는 것을 볼 수 있습니다.
mount namespace
mounting and unmounting filesystems will not affect rest of the system.
이렇게 하는 목적은 무엇입니까?마운트 네임스페이스? 나는 몇 가지 예를 통해 이 개념을 이해하려고 노력했습니다.
답변1
Run은 unshare -m
호출 프로세스에 마운트 네임스페이스의 개인 복사본을 제공하고 파일 시스템 속성의 공유를 해제하여 더 이상 루트 디렉터리, 현재 디렉터리 또는 umask 속성을 다른 프로세스와 공유하지 않도록 합니다.
그렇다면 위의 구절은 정확히 무엇을 말하는 걸까요? 간단한 예를 들어 이해해 봅시다.
터미널 1:
첫 번째 터미널에서 다음 명령을 실행합니다.
#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory.
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points.
grep /tmp /proc/mounts
마지막 명령이 나에게 준 결과는 다음과 같습니다.
tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0
이제 다음 명령도 실행했습니다.
cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls -lFa
이 명령의 출력은 ls
다음과 같습니다.
ls -lFa
total 4
drwxrwxrwt 2 root root 80 Sep 3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep 3 22:22 ../
-rw-r--r-- 1 root root 0 Sep 3 22:23 hello
-rw-r--r-- 1 root root 0 Sep 3 22:23 helloagain
그렇다면 이 모든 일을 하는 데 있어 가장 큰 문제는 무엇입니까? 왜 이 일을 해야 합니까?
이제 다른 터미널을 엽니다(NO2.) 다음 명령을 실행합니다.
cd /tmp/tmp.7KtrAsd9lx
ls -lFa
출력은 다음과 같습니다.
ls -lFa
total 8
drwx------ 2 root root 4096 Sep 3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep 3 22:22 ../
파일이 보이지 hello
않습니다 helloagain
. 파일을 확인하기 위해 루트로 로그인하기도 했습니다. 그래서 장점은,이 기능을 사용하면 다른 루트 소유 프로세스에서도 보거나 탐색할 수 없는 개인 임시 파일 시스템을 생성할 수 있습니다.
매뉴얼 페이지 unshare
에서
mount 네임스페이스 파일 시스템 마운트 및 마운트 해제는 파일 시스템이 명시적으로 공유로 표시되지 않는 한(mount --make-shared 사용, 공유 플래그는 /proc/self/ 참조) 시스템의 나머지 부분(CLONE_NEWNS 플래그)에 영향을 주지 않습니다. ).
unshare --mount 후에 mount --make-rprivate 또는 mount --make-rslave를 사용하여 새 네임스페이스의 마운트 지점이 실제로 상위 네임스페이스에서 공유 해제되도록 하는 것이 좋습니다.
네임스페이스에서 사용하는 메모리는 커널의 VFS입니다. 그리고 처음부터 바로 설정하면 루트 권한 없이 루트 사용자인 전체 가상 환경을 만들 수 있습니다.
인용하다:
이 예제는 다음 세부 정보를 사용하여 구축되었습니다.이 블로그 게시물. 또한 이 답변은 다음에서 인용되었습니다.훌륭한 설명 마이크. 이에 대한 또 다른 훌륭한 내용은 아래 답변에서 찾을 수 있습니다.여기.
답변2
네임스페이스 마운팅에 관한 매우 중요한 사항이 완전히 무시되었습니다.
자세한 설명은 안 드리고 맛은 알려드리겠습니다.
두 개의 마운트 네임스페이스를 사용한다고 해서 두 개의 독립적인 파일 시스템이 있다는 의미는 아닙니다. 이것은 완전히 잘못된 것입니다.
예.
마운트 네임스페이스 A에 마운트 지점 /01이 있습니다.
다음으로 A에서 마운트 네임스페이스 B를 생성합니다.
이제 마운트 네임스페이스 B에 /01이 있습니다.
다음으로 B의 /01을 비공개로 설정합니다.
(namespace B) # mount --make-private /01
다음으로 A에 파일을 만듭니다.
(namespace A) # touch /01/a.txt
이 파일은 B/01에서 볼 수 있습니다.
다음으로 B에서 b.txt를 만듭니다.
(namespace B)# touch /01/b.txt
A/01에 b.txt가 표시됩니다.
그래서. 마운트 네임스페이스 간에는 독립성이 없습니다.
한 네임스페이스의 마운트 지점이 다른 네임스페이스에 있는 다른 마운트 지점의 소스인 경우 두 마운트 지점 사이의 단순 파일과 단순 폴더는 100% 투명도를 갖습니다. 마운트 지점에 어떤 옵션(공유, 개인, 슬레이브)을 할당하는지는 중요하지 않습니다. 이것은 전혀 도움이 되지 않습니다.
따라서 assgin 개인 옵션을 사용하여 새 마운트 네임스페이스를 생성하고 새 네임스페이스의 모든 마운트 지점에 대해 독립적인 파일 시스템을 얻는다고 생각한다면 이는 완전히 잘못된 것입니다.
진정한 독립성은 새로운 하위 마운트 지점에만 관련됩니다.
또한 새 네임스페이스에 새 하위 마운트 지점을 생성한다고 해서 일반적으로 하위 마운트 지점이 다른 마운트 네임스페이스와 독립적이라는 의미는 아닙니다. 핵심은 각 마운트 지점에 백엔드(예: 실제 물리적 디스크)가 있다는 것입니다. 따라서 백엔드를 알고 있다면 이를 설치하고 변경할 수 있습니다.
(namespace A) # mount /dev/sdb1 /mnt
(namespace A) # mount --make-private /mnt
(namespace A) # unshare -m bash
(namespace B) #
네임스페이스 A 반환
(namespace A) # mkdir /mnt/01
(namespace A) # mount /dev/sdc1 /mnt/01
(namespace A) # mount --make-private /mnt/01
(namespace A) # touch /mnt/01/a.txt
네임스페이스 B에는 a.txt가 표시되지 않습니다.
(namespace B) # ls -1al /mnt/01
아무것도 표시되지 않습니다.
그래서 지금은 모든 것이 괜찮습니다.
하지만 /mnt/01의 백엔드가 /dev/sdc1이라는 것을 알게 되면 이 백엔드를 네임스페이스 B에 마운트할 수 있으며 마지막으로 a.txt를 볼 수 있습니다.
(namespace B) # mkdir /mnt/02
(namespace B) # mount /dev/sdc1 /mnt/02
(namespace B) # ls -1al /mnt/02/a.txt
승리
마지막으로, 결론적으로, 네임스페이스 마운팅은 까다로운 작업이며, 진정으로 독립적인 파일 시스템을 만들거나 원하는 결과를 얻으려면 배후의 모든 세부 사항을 잘 이해해야 합니다.
답변3
당신이 가지고 있다면버블 랩시스템에 설치한 후에는 단 한 단계만으로 쉽게 완료할 수 있습니다.
bwrap --dev-bind / / --tmpfs /tmp bash
위의 예에서 내부 bash는 /tmp에 대한 자체 보기를 갖습니다.
@ Ramesh-s 답변에서 영감을 얻은 솔루션 - 감사합니다!