我想编写一个功能测试用例,用于测试具有已知随机数值的程序.我已经在单元测试期间用模拟测试了它.但我也想进行功能测试(当然不是全部)
只有一个进程覆盖/ dev / urandom的最简单方法是什么?有没有办法为一个文件做一个像chroot的东西,让所有其他人’通过’?
解决方法
如果您的系统足够新(例如RHEL 7)并支持setns系统调用,则可以在mount命名空间的帮助下完成.需要root访问权限.
我们的想法是为进程创建一个单独的挂载命名空间,并在该命名空间内绑定 – 挂载/ dev / random上的其他文件或FIFO,以便来自此挂载命名空间的进程将从此绑定挂载文件中读取数据.其他进程将看到常规/ dev / random.
这是怎么做的.
准备:运行以下命令以使所有这些人员工作(因为默认情况下可能不起作用,有关详细信息,请参阅this question).
# mount --make-rprivate /
现在让我们创建一个在新的mount命名空间内运行的shell.
# unshare -m /bin/bash
你有新的bash start,它有自己的mount命名空间.您可以在此shell和其他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)以获取更多信息).