2006年3月1日 星期三

Linux 的 random 總是裝死

Standard
應該有不少人碰過 Apache 啟動時卡在 digest module 過不去,導致 PHP 不能使用,或是碰過某些程式卡在某個地方很久沒動作。這時候大家可能要去檢查一下 /dev/random 這個設備檔案。可以用 cat /dev/random 來看它的內容,如果你發現他一直沒顯示任何內容﹝可能是亂碼數字之類的﹞,那就是它出問題了。


據我從 digest module 的 source code 裡所知,這模組呼叫了一個亂數產生的函數,此函數會呼叫 /dev/random。所以當 /dev/random 卡住顯示不出內容時,很自然的任何 read() 它的程式會停在那等它回應。


我了解 Linux kernel 的 source code 之後發現,/dev/random 會使用 key/mouse/disk 的 interrupt 當做亂數種子的計算來源,好處是會有更大的安全性,但問題是當我們沒在使用 key/mouse/disk 或是他們的 interrupt 訊號量不足以產生亂數種子時,/dev/random 就會永遠是空白沒東西。

這問題有個暫時的解決辦法,就是將 /dev/random 砍掉,先用 link的方式使用 /dev/urandom 取代 /dev/random。

要完全解決此問題,可至 SourceForge 找到 gkernel 這 Project。

下載 rng-tool 回來編譯安裝。

然後於開機的 Scripts 中加入:

rngd -b -o /dev/random -r /dev/urandom

此 Deamon 將會在沒足夠 interrupt 訊號時使用 urandom 的亂數當random 的亂數種子。