如果您的系统足够新(例如 RHEL 7)并且支持setns
系统调用可以在挂载命名空间的帮助下完成。需要根访问权限。
这个想法是为进程创建一个单独的挂载命名空间,并在该命名空间内绑定挂载一些其他文件或 FIFO/dev/random
以便此挂载命名空间中的进程可以从此绑定挂载的文件中读取数据。其他进程会看到常规的/dev/random
.
以下是如何做到这一点。
准备工作:运行以下命令以使所有这些东西工作(因为默认情况下它可能不起作用,请参阅这个问题 https://unix.stackexchange.com/questions/31050/problem-with-mount-namespaces-under-fedora了解详情)。
# mount --make-rprivate /
现在让我们创建一个在新的挂载命名空间内运行的 shell。
# unshare -m /bin/bash
你有新的bash
启动它有自己的挂载命名空间。您可以比较此 shell 内部和其他 shell 中以下命令的结果:
这个外壳:
# ls -l /proc/self/ns/mnt
lrwxrwxrwx. 1 root root 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026532148]
其他外壳:
$ ls -l /proc/self/ns/mnt
lrwxrwxrwx. 1 ec2-user ec2-user 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026531840]
请注意,数字不同,因此两个 shell 位于不同的挂载命名空间中,并且从第一个 shell 执行的挂载对系统中的其他进程不可见(该 shell 的所有子进程除外)。
现在,在这个 shell 中,我们可以在现有的 shell 上绑定安装一些东西/dev/random
.
# echo 'some large text' > /tmp/fakerandom
# mount --bind /tmp/fakerandom /dev/random
其他进程看不到这一点,对他们来说/dev/random
照常工作:
$ ls -l /dev/random
crw-rw-rw-. 1 root root 1, 8 Sep 26 15:45 /dev/random
$ cat /dev/random
�Znp7�v�c��Ω^C
但在我们的 shell 中它很特别:
# ls -l /dev/random
-rw-r--r--. 1 root root 16 Sep 26 16:18 /dev/random
# cat /dev/random
some large text
对于功能测试,您可能需要替换/dev/random
与一些 FIFO 并在其他进程中将一些已知数据写入该 FIFO(请参阅mkfifo(1)
如果需要的话,了解更多信息)。
有关挂载命名空间的更多信息可以在this http://lwn.net/Articles/531381/优秀的文章。