我想編寫一個功能測試用例,用於測試具有已知值的隨機數的程序。在單元測試期間,我已經用模擬測試過了。但我希望功能測試(當然不是全部)旁路dev/urandom |隨機測試
/dev/urandom
重寫只有一個進程的最簡單方法是什麼?有沒有辦法爲單個文件做一個像chroot
的事情,並讓所有其他人「通過」?
我想編寫一個功能測試用例,用於測試具有已知值的隨機數的程序。在單元測試期間,我已經用模擬測試過了。但我希望功能測試(當然不是全部)旁路dev/urandom |隨機測試
/dev/urandom
重寫只有一個進程的最簡單方法是什麼?有沒有辦法爲單個文件做一個像chroot
的事情,並讓所有其他人「通過」?
如果您的系統足夠新(例如RHEL 7)並且支持setns
系統調用,則可以使用掛載名稱空間完成。根訪問是必需的。
這個想法是爲進程創建一個單獨的掛載名稱空間,並在該名稱空間內通過/dev/random
綁定掛載某個其他文件或FIFO,以便此掛載名稱空間中的進程將讀取來自此掛載文件的數據。其他進程將看到正常的/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
但在我們的外殼是特殊的:
# 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)
)。
有關mount命名空間的更多信息,請參見this優秀的文章。