루트가 소스 디렉토리에 액세스할 수 없을 때 mount --bind를 생성하는 방법은 무엇입니까?

루트가 소스 디렉토리에 액세스할 수 없을 때 mount --bind를 생성하는 방법은 무엇입니까?

를 이용하여 테스트 환경을 만들려고 할 때, 소스 디렉터리에 접근할 수 없어 mount --bind권한 오류로 실패하는 경우가 가끔 있다는 사실에 놀랐습니다 . root이는 NFS 파일 시스템에만 영향을 미치는 것으로 보입니다.

mount --bind접근할 수 없는 디렉토리 에 접근할 수 있는 방법이 있나요 root? 어쩌면 inode 번호를 통해 직접적으로 가능할까요?

vagrant:vagrant일반 사용자가 완전히 액세스할 수 있는 NFS 마운트가 있습니다 .

vagrant@ubuntu-xenial:/tmp$ find nfs_mount/ -ls
     4375      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/
   257090      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source
   257091      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path
   257092      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path/is
   257093      4 drwx------   2 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path/is/here

...하지만 root:root다음은 할 수 없습니다.

vagrant@ubuntu-xenial:/tmp$ sudo find nfs_mount/ -ls
     4375      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/
   257090      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source
   257091      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path
find: ‘nfs_mount/source/path’: Permission denied

시도했지만 mount --bind실패하는 경우:

vagrant@ubuntu-xenial:/tmp$ mkdir /tmp/bindtarget

vagrant@ubuntu-xenial:/tmp$ sudo mount --bind /tmp/nfs_mount/source/path/is/here/ /tmp/bindtarget/
mount: mount /tmp/nfs_mount/source/path/is/here/ on /tmp/bindtarget failed: Permission denied

NFS 마운트 /tmp/nfs_mount는 에서 제공되며 localhost:/srv소스 파일 시스템으로 직접 이동해도 디렉터리 권한으로 인해 문제가 발생하지 않습니다.

vagrant@ubuntu-xenial:/tmp$ sudo mount --bind /srv/source/path/is/here/ /tmp/bindtarget/

vagrant@ubuntu-xenial:/tmp$ findmnt /tmp/bindtarget
TARGET          SOURCE                              FSTYPE OPTIONS
/tmp/bindtarget /dev/sda1[/srv/source/path/is/here] ext4   rw,relatime,data=ordered

NFS 설정(만약의 경우):

vagrant@ubuntu-xenial:/tmp$ showmount -e localhost
Export list for localhost:
/srv *

vagrant@ubuntu-xenial:/tmp$ cat /etc/exports
/srv/       *(rw,sync,no_subtree_check)

 환경

  • 우분투 16.04 (Xenial64)
  • Linux ubuntu-xenial 4.4.0-116-generic #140-Ubuntu SMP 월 2월 12일 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

답변1

마운트하는 것은 위험합니다. 일부 정리 작업은 마운트 지점을 고려하지 않고 /tmp갑자기 작업하기로 결정하여 실제로 속하지 않는 오래된 파일을 삭제할 수 있기 때문입니다 . 즉, OP의 예를 사용하겠습니다./tmp/tmp/tmp


방법 1:

NFS 환경에 대한 전체 제어 권한이 있는 경우 no_root_squash내보내기 옵션에 이 옵션을 추가하기만 하면 됩니다. 이렇게 하면 루트 클라이언트가 서버의 누구에게나 매핑되어 권한을 잃는 것을 방지할 수 있습니다.


방법 2:

그렇지 않은 경우에는 아직 사용 중인 삭제된 파일에 액세스하는 것과 마찬가지로 찾고 있는 비교적 간단한 솔루션이 있습니다. /proc를 사용하세요.

단순화를 위해 두 개의 터미널이 필요합니다.

사용자 터미널:

vagrant@ubuntu-xenial:/tmp$ cd /tmp/nfs_mount/source/path/is/here/
vagrant@ubuntu-xenial:/tmp/nfs_mount/source/path/is/here$ echo $$
12345

루트 터미널: 루트는 필요한 디렉터리에 대한 참조를 얻을 수 있지만 여전히 읽을 수는 없지만 설치는 가능합니다.

# ls -l /proc/12345/cwd
lrwxrwxrwx. 1 vagrant vagrant 0 Mar 21 01:18 /proc/12345/cwd -> /tmp/nfs_mount/source/path/is/here
# ls -l /proc/12345/cwd/
ls: cannot open directory '/proc/12345/cwd/': Permission denied

# mount --bind /proc/12345/cwd /tmp/bindtarget
# ls /tmp/bindtarget
ls: cannot open directory '/tmp/bindtarget': Permission denied

그게 다야.

관련 정보