在尝试使用创建测试环境时,mount --bind
我惊讶地发现它有时会因权限错误而失败,因为root
无法访问源目录。这似乎只影响 NFS 文件系统。
有没有办法访问无法访问mount --bind
的目录root
?也许直接通过索引节点号?
例子
我有一个普通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)
环境
- Ubuntu 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
都是危险的,因为某些清理任务可能会突然决定在 中进行工作/tmp
而不关心挂载点,从而擦除实际上不属于 的旧文件/tmp
。也就是说,我将使用/tmp
OP 中的示例。
方法一:
如果您完全控制 NFS 环境,只需将该no_root_squash
选项添加到导出选项即可:这将防止 root 用户客户端被映射为服务器上的任何人并失去权限。
方法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
root 终端:root 可以获得对所需目录的引用,仍然不可读,但可安装:
# 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
就是这样。