를 이용하여 테스트 환경을 만들려고 할 때, 소스 디렉터리에 접근할 수 없어 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
그게 다야.