/dev/random vs /dev/urandom

來源:互聯網
上載者:User

/dev/random和/dev/urandom是unix系統提供的產生隨機數的裝置,很多應用都需要使用random裝置提供的隨機數,比如ssh keys, SSL keys, TCP/IP sequence numbers等等。

而random裝置的random pool是從基於中斷的IRQS裡面取值,IRQS跟一些特殊的硬體綁定,基於這些硬體的interrupts將會提供給random裝置。

linux下我們可以用cat /proc/interrupts 查看哪些裝置綁定了irq

[oracle@test oracle]$ cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 135 0 0 301721845 IO-APIC-edge timer
1: 0 0 0 54 IO-APIC-edge keyboard
2: 0 0 0 0 XT-PIC cascade
8: 0 0 0 1 IO-APIC-edge rtc
14: 0 0 0 2 IO-APIC-edge ide0
16: 0 0 0 40 IO-APIC-level usb-uhci
18: 0 0 0 0 IO-APIC-level usb-uhci
19: 0 0 0 0 IO-APIC-level usb-uhci
23: 0 0 0 2257 IO-APIC-level ide2, ehci-hcd
25: 0 0 0 29 IO-APIC-level ioc1
26: 0 0 0 29 IO-APIC-level ioc0
48: 0 0 0 2151823972 IO-APIC-level eth0
82: 0 0 0 339588855 IO-APIC-level megaraid
NMI: 0 0 0 0
LOC: 301720634 301720634 301720634 301720633
ERR: 0
MIS: 0

來類比一個從/dev/random取值但是/dev/random取不到足夠值的情況,這時候取值的進程將會等待,直到得到足夠的random 值。

[root@csdba ~]# time dd if=/dev/random of=1.dmp bs=1024k count=100

這時dd的進程將會hang住等待足夠的random值

trace dd的進程在做什麼

[root@csdba ~]# ps -ef|grep dd
root 4749 4156 0 17:11 pts/1 00:00:00 dd if /dev/random of 1.dmp bs 1024k count 100
root 4753 4634 0 17:12 pts/3 00:00:00 grep dd

[root@csdba ~]# strace -p 4749
Process 4749 attached - interrupt to quit
read(0,

dd的進程在等待讀取足夠的隨機數,從上面我們可以看到eth0 網卡綁定了IRQS,那麼我們進行網路傳輸的時候網卡將會提供很多interrupt 給/dev/random,既然這樣,我們試著scp給這台機器一個檔案看看。

[oracle@csdbc oracle]$ scp 1.dmp root@10.0.100.115:/
root@10.0.100.115’s password:
1.dmp 100% |***************************************************************************

再回到原來視窗看strace,可以發現strace已經結束,也就是dd已經完成

read(0, “E/347/276m/274/33/227-IZ5/330/264/245/260z/326/’/376/266″…, 1048576) = 44
write(1, “E/347/276m/274/33/227-IZ5/330/264/245/260z/326/’/376/266″…, 44) = 44
munmap(0xb7cb5000, 1060864) = 0
open(”/usr/share/locale/locale.alias”, O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2528, …}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7db7000
read(3, “# Locale name alias data base./n#”…, 4096) = 2528
read(3, “”, 4096) = 0
close(3) = 0
munmap(0xb7db7000, 4096) = 0
open(”/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(”/usr/share/locale/en/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, “0+100 records in/n”, 17) = 17
write(2, “0+100 records out/n”, 18) = 18
close(0) = 0
close(1) = 0
exit_group(0) = ?
Process 4749 detached

再看看dd的視窗

[root@csdba ~]# time dd if=/dev/random of=1.dmp bs=1024k count=100
0+100 records in
0+100 records out
real 4m19.484s
user 0m0.000s
sys 0m0.004s

果然dd已經結束,這個過程也驗證了/dev/random是基於IRQS產生隨機數的。

看過/dev/random後再來看看/dev/urandom

[root@csdba ~]# time dd if=/dev/urandom of=1.dmp bs=1024k count=100
100+0 records in
100+0 records out
real 0m21.758s
user 0m0.002s
sys 0m21.752s

很明顯/dev/urandom和/dev/random有區別,/dev/urandom不受interrupts的限制,即使沒有足夠的interrupt它也能通過 random number generator產生足夠的輸出值,所以它不會導致dd hang.

另外還有一個很有意思的事情

當我們在linux上執行time dd if=/dev/random of=1.dmp bs=1024k count=100,dd雖然會hang住,但是可以用ctrl+c或kill命令中止dd,這是因為linux的dd會工作在使用者模式。

但是我們遇到過在aix上執行 dd if=/dev/random of=1.dmp bs=1024k count=100
,dd進程會導致佔用一個單獨的cpu,當dd讀取一個bs的時候它進入核心模式,它將不能被
ctrl+c或kill -9中斷,只有當它讀完一個bs後會把控制權返回給使用者,這樣的話就面臨著如果
bs值設定過大的時候會導致dd進程從/dev/random裡面讀不到足夠的值而一直處於核心模式,
dd的進程將會一直消耗cpu直到/dev/random提供了新的值。由於dd命令在aix和linux處理的
方式不同,所以在aix上多採用/dev/urandom來產生隨機數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.