【发布时间】:2014-11-21 03:06:10
【问题描述】:
我想编写一个功能测试用例,用已知的随机数值测试程序。在单元测试期间,我已经使用模拟对其进行了测试。但我也希望它用于功能测试(当然不是全部:)
只为一个进程覆盖/dev/urandom 的最简单方法是什么?有没有办法为单个文件执行chroot 之类的操作并让所有其他文件“通过”?
【问题讨论】:
标签: linux testing random chroot
我想编写一个功能测试用例,用已知的随机数值测试程序。在单元测试期间,我已经使用模拟对其进行了测试。但我也希望它用于功能测试(当然不是全部:)
只为一个进程覆盖/dev/urandom 的最简单方法是什么?有没有办法为单个文件执行chroot 之类的操作并让所有其他文件“通过”?
【问题讨论】:
标签: linux testing random chroot
如果您的系统足够新(例如 RHEL 7)并支持 setns 系统调用,则可以借助挂载命名空间来完成。需要 root 访问权限。
这个想法是为进程创建一个单独的挂载命名空间,并在该命名空间内绑定挂载一些其他文件或 FIFO 在/dev/random 上,以便来自这个挂载命名空间的进程可以从这个绑定挂载的文件中读取数据.其他进程会看到常规的/dev/random。
这里是如何做到这一点的。
准备工作:运行以下命令以使所有这些东西正常工作(因为默认情况下可能无法正常工作,请参阅this question 了解详细信息)。
# 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 中,我们可以在现有的 /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
对于功能测试,您可能希望用一些 FIFO 替换 /dev/random,并在其他进程中将一些已知数据写入该 FIFO(如果需要,请参阅 mkfifo(1) 了解更多信息)。
更多关于挂载命名空间的信息可以在this优秀文章中找到。
【讨论】: