2014-09-26 100 views
3

我想編寫一個功能測試用例,用於測試具有已知值的隨機數的程序。在單元測試期間,我已經用模擬測試過了。但我希望功能測試(當然不是全部)旁路dev/urandom |隨機測試

/dev/urandom重寫只有一個進程的最簡單方法是什麼?有沒有辦法爲單個文件做一個像chroot的事情,並讓所有其他人「通過」?

回答

3

如果您的系統足夠新(例如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優秀的文章。