프로세스별 개인 파일 시스템 마운트 지점

프로세스별 개인 파일 시스템 마운트 지점

명령을 확인 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 답변에서 영감을 얻은 솔루션 - 감사합니다!

관련 정보