假设:
- 我在 Linux 机器上使用 ubuntu 发行版。
- 我没有 root/admin 权限——只是一个标准用户。
- 我主要使用 bash shell。
- 该目录
/ts
已存在。我对此目录只有只读权限。
当我通过 ssh 进入这台 Linux 机器时,我想要/ts
引用~/.local/ts
。例如,给定以下目录/文件结构:
/
├── ts
| └── A.sh
├── home
└── rtetteh
└── .local
└── ts
└── B.sh
当我执行时,ls /ts
我希望看到B.sh
。当我执行时,cd /ts
我希望处于~/.local/ts
。
不仅限于上面的例子,我想在所有场景中/ts
参考。~/.local/ts
我只想为自己实现这一点。我不想改变此 Linux 服务器上其他用户的任何行为。
我做了一些研究,发现mount --bind
这需要 root/admin 权限,而且我确信这种特定技术也会影响其他用户,这不是我想要的。我还看到了一些相关内容,bindfs
但还不太确定,仍在研究中。
答案1
你想要的可以通过利用内核命名空间功能在我看来,如果你从头开始重新创建文件系统命名空间,这需要一些管道……不过,幸运的是,有一个来自软件包的工具bubblewrap
可以很容易地做到这一点:
包裹是容器设置的特权助手。您不太可能直接从命令行使用它,尽管这是可能的。
它的工作原理是创建一个新的、完全空的文件系统命名空间,其中根位于主机不可见的 tmpfs 上,并且当最后一个进程退出时会自动清理。然后,您可以使用命令行选项来构建根文件系统和进程环境,以便在命名空间中运行命令。
所以:
bwrap --die-with-parent --bind / / --dev-bind /dev /dev --bind /home/rtetteh/.local/ts /ts -- /bin/bash
是最小例子(照我看来) 做你想做的事...阅读手册并根据需要使用更多选项扩展该示例,例如--setenv VAR VALUE
在需要时设置环境变量。
如果您需要添加更多绑定挂载,那么您可以在最后一个之前--
以...的形式添加它们--bind SRC DEST
。并且您将始终需要它们--bind / / --dev-bind /dev /dev
,所以不要删除或修改它们。
不用说,您不能使用诸如或...等系统目录/etc
作为/bin
其他/var
目录的目标挂载点,否则您新创建的文件系统命名空间将变得不稳定并且可能无法使用。
这不会影响其他用户或系统服务,只会影响新创建的文件系统命名空间。