Ⅰ 使用/dev/random生成隨機整數
很多庫常式產生的「隨機」數是准備用於模擬、游戲等等;它們在被用於密鑰生成一類的安全函數時是不夠隨機的。其問題在於這些庫常式使用的演算法的未來值可以被攻擊者輕易地推導出來(雖然看起來它們可能是隨機的)。對於安全函數,需要的隨機值應該是基於量子效應之類的確實無法預測的值。linux內核(1.3.30以上)包括了一個隨機數發生器/dev/random,對於很多安全目的是足夠的。
/dev/random 是如何創建隨機數的呢?
Linux 操作系統提供本質上隨機(或者至少具有強烈隨機性的部件)的庫數據。這些數據通常來自於設備驅動程序。例如,鍵盤驅動程序收集兩個按鍵之間時間的信息,然後將這個環境雜訊填入隨機數發生器庫。
隨機數據存儲在 熵池中,它在每次有新數據進入時進行「攪拌」。這種攪拌實際上是一種數學轉換,幫助提高隨機性。當數據添加到熵池中後,系統估計獲得了多少真正隨機位。
測定隨機性的總量是很重要的。問題是某些量往往比起先考慮時看上去的隨機性小。例如,添加表示自從上次按鍵盤以來秒數的 32 位數實際上並沒有提供新的 32 位隨機信息,因為大多數按鍵都是很接近的。
從 /dev/random 中讀取位元組後,熵池就使用 MD5 演算法進行密碼散列,該散列中的各個位元組被轉換成數字,然後返回。
如果在熵池中沒有可用的隨機性位, /dev/random 在池中有足夠的隨機性之前等待,不返回結果。這意味著如果使用 /dev/random 來產生許多隨機數,就會發現它太慢了,不夠實用。我們經常看到 /dev/random 生成幾十位元組的數據,然後在許多秒內都不產生結果。
幸運的是有熵池的另一個介面可以繞過這個限制:/dev/urandom。即使熵池中沒有隨機性可用,這個替代設備也總是返回隨機數。如果您取出許多數而不給熵池足夠的時間重新充滿,就再也不能獲得各種來源的合用熵的好處了;但您仍可以從熵池的 MD5 散列中獲得非常好的隨機數!這種方式的問題是,如果有任何人破解了 MD5 演算法,並通過查看輸出了解到有關散列輸入的信息,那麼您的數就會立刻變得完全可預料。大多數專家都認為這種分析從計算角度來講是不可行的。然而,仍然認為 /dev/urandom 比 /dev/random 要「不安全一些」(並通常值得懷疑)。
應用中出現的問題:
在我們的伺服器程序中,用戶登陸的時候會讀取/dev/random產生隨機數,問題來了,當用戶登陸比較密集,這時候read就會返回特別慢,並且返回的位元組數也比要求的少,甚至不返回――阻塞。我們把用戶登陸處理函數放在了線程池裡,導致的問題就是線程池裡所有線程都可能會阻塞,這就造成了拒絕服務攻擊。導致其他用戶登陸失敗。
解決方案:
CODE:1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <sys/file.h>
6 #include <sys/time.h>
7 #include <errno.h>
8 #include <unistd.h>
9 #include <stdlib.h>
10
11 static int get_random_fd (void)
12 {
13 static int fd = -2;
14
15 if (fd == -2)
16 {
17 fd = open ("/dev/random", O_RDONLY | O_NONBLOCK);
18 if (fd == -1)
19 fd = open ("/dev/urandom", O_RDONLY | O_NONBLOCK);
20 }
21
22 return fd;
23 }
24
25 /*
26 * Generate a series of random bytes. Use /dev/random if possible,
27 * and if not, use /dev/urandom.
28 */
29 void get_random_bytes(void* buf, int nbytes)
30 {
31 int i, fd = get_random_fd();
32 int lose_counter = 0;
33 char *cp = (char*)buf;
34 struct timeval tv;
35 static unsigned seed = 0;
36
37 if (fd >= 0)
38 {
39 while (nbytes > 0)
40 {
41 i = read (fd, cp, nbytes);
42 if ((i < 0) &&
43 ((errno == EINTR) || (errno == EAGAIN)))
44 continue;
45
46 if (i <= 0)
47 {
48 if (lose_counter++ == 8)
49 break;
50
51 continue;
52 }
53 nbytes -= i;
54 cp += i;
55 lose_counter = 0;
56 }
57 }
58
59 for (i = 0; i < nbytes; i++)
60 {
61 if (seed == 0)
62 {
63 gettimeofday(&tv, 0);
64 seed = (getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec;
65 }
66 *cp++ = rand_r(&seed) & 0xFF;
67 }
68
69 return;
70 }
13行: 定義fd為靜態變數,這樣只打開一次設備。
17 – 19行: 無阻塞模式打開/dev/random設備。如果該設備打開失敗嘗試打開/dev/urandom。
29行: void get_random_bytes(void* buf, int nbytes)函數是提供給用戶的介面,用戶調用這個函數就可以得到隨機數。
37-57行: read有可能返回的位元組數小於請求的位元組數。這時候就循環讀直到讀夠了所請求的大小。這樣最多重復8次。然後返回。
59-67行: 如果上面重復8次都沒有讀夠所請求的位元組數,則我們自己生成隨機數來填充。
注意:打開的fd我們並沒有關閉,請您根據自己需求在合適的地方關閉。
Ⅱ 如何查看linux伺服器的cpu數量,內核數,和cpu線程數
lscpu命令,查看的是cpu的統計信息.
blue@blue-pc:~$ lscpu
Architecture: i686 #cpu架構
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian #小尾序
CPU(s): 4 #總共有4核
On-line CPU(s) list: 0-3
Thread(s) per core: 1 #每個cpu核,只能支持一個線程,即不支持超線程
Core(s) per socket: 4 #每個cpu,有4個核
Socket(s): 1 #總共有1一個cpu
Vendor ID: GenuineIntel #cpu產商 intel
CPU family: 6
Model: 42
Stepping: 7
CPU MHz: 1600.000
BogoMIPS: 5986.12
Virtualization: VT-x #支持cpu虛擬化技術
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K
查看/proc/cpuinfo,可以知道每個cpu信息,如每個CPU的型號,主頻等。
#cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 42
model name : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz
.....
上面輸出的是第一個cpu部分信息,還有3個cpu信息省略了。
內存
概要查看內存情況
free -m
total used free shared buffers cached
Mem: 3926 3651 274 0 12 404
-/+ buffers/cache: 3235 691
Swap: 9536 31 9505
這里的單位是MB,總共的內存是3926MB。
查看內存詳細使用
# cat /proc/meminfo
MemTotal: 4020868 kB
MemFree: 230884 kB
Buffers: 7600 kB
Cached: 454772 kB
SwapCached: 836 kB
.....
查看內存硬體信息
dmidecode -t memory
# dmidecode 2.11
SMBIOS 2.7 present.
Handle 0x0008, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
....
Maximum Capacity: 32 GB
....
Handle 0x000A, DMI type 17, 34 bytes
....
Memory Device
Array Handle: 0x0008
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 4096 MB
.....
我的主板有4個槽位,只用了一個槽位,上面插了一條4096MB的內存。
磁碟
查看硬碟和分區分布
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├—sda1 8:1 0 1G 0 part /boot
├—sda2 8:2 0 9.3G 0 part [SWAP]
├—sda3 8:3 0 74.5G 0 part /
├—sda4 8:4 0 1K 0 part
├—sda5 8:5 0 111.8G 0 part /home
└—sda6 8:6 0 269.2G 0 part
顯示很直觀
如果要看硬碟和分區的詳細信息
# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00023728
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2148351 1073152 83 Linux
/dev/sda2 2148352 21680127 9765888 82 Linux swap / Solaris
/dev/sda3 21680128 177930239 78125056 83 Linux
/dev/sda4 177932286 976771071 399419393 5 Extended/dev/sda5 177932288 412305407 117186560 83 Linux
/dev/sda6 412307456 976771071 282231808 83 Linux
網卡
查看網卡硬體信息
# lspci | grep -i 'eth'
02:00.0 Ethernet controller: Realtek Semiconctor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
查看系統的所有網路介面
# ifconfig -a
eth0 Link encap:乙太網 硬體地址 b8:97:5a:17:b3:8f
.....
lo Link encap:本地環回
.....
或者是
ip link show
1: lo: <LOOPBACK> mtu 16436 qdisc noqueue state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether b8:97:5a:17:b3:8f brd ff:ff:ff:ff:ff:ff
如果要查看某個網路介面的詳細信息,例如eth0的詳細參數和指標
# ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full #支持千兆半雙工,全雙工模式
Supported pause frame use: No
Supports auto-negotiation: Yes #支持自適應模式,一般都支持
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes #默認使用自適應模式
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
.....
Speed: 100Mb/s #現在網卡的速度是100Mb,網卡使用自適應模式,所以推測路由是100Mb,導致網卡從支 持千兆,變成要支持百兆
Duplex: Full #全雙工
.....
Link detected: yes #表示有網線連接,和路由是通的
其他
查看pci信息,即主板所有硬體槽信息。
lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09) #主板晶元
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) #顯卡
00:14.0 USB controller: Intel Corporation Panther Point USB xHCI Host Controller (rev 04) #usb控制器
00:16.0 Communication controller: Intel Corporation Panther Point MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation Panther Point USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation Panther Point High Definition Audio Controller (rev 04) #音效卡
00:1c.0 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 1 (rev c4) #pci 插槽
00:1c.2 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 3 (rev c4)
00:1c.3 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 4 (rev c4)
00:1d.0 USB controller: Intel Corporation Panther Point USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Panther Point LPC Controller (rev 04)
00:1f.2 IDE interface: Intel Corporation Panther Point 4 port SATA Controller [IDE mode] (rev 04) #硬碟介面
00:1f.3 SMBus: Intel Corporation Panther Point SMBus Controller (rev 04)
00:1f.5 IDE interface: Intel Corporation Panther Point 2 port SATA Controller [IDE mode] (rev 04) #硬碟介面
02:00.0 Ethernet controller: Realtek Semiconctor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06) #網卡
03:00.0 PCI bridge: Integrated Technology Express, Inc. Device 8893 (rev 41)
如果要更詳細的信息:lspci -v 或者 lspci -vv
如果要看設備樹:lscpi -t
查看bios信息
# dmidecode -t bios
......
BIOS Information
Vendor: American Megatrends Inc.
Version: 4.6.5
Release Date: 04/25/2012
.......
BIOS Revision: 4.6
......
dmidecode以一種可讀的方式mp出機器的DMI(Desktop Management Interface)信息。這些信息包括了硬體以及BIOS,既可以得到當前的配置,也可以得到系統支持的最大配置,比如說支持的最大內存數等。
如果要查看所有有用信息
dmidecode -q
以上是linux查看硬體信息的所有命令,可以查看CPU、硬碟、網卡、磁碟等硬體的信息。
Ⅲ Linux發行版和Linux內核的區別
首先解釋一下什麼是Linux發行版(英文名稱是Linux Distribution)。Linux實際上是一種開放源代碼的操作系統內核,通常我們說的Linux指的是基於Linux內核的操作系統。Linux操作系統包括Linux內核和Linux用戶態程序,Linux內核和Linux用戶態程序都是開放源代碼的,絕大多數軟體代碼遵循GPL協議,任何人拿到這些代碼都可以對這些代碼進行修改和分發。由於Linux上代碼的高度自由,很多公司和組織都推出了自己的Linux操作系統,這些Linux操作系統我們就叫做Linux發行版。
各種不同的Linux發行版的共同點就是都使用了Linux內核,不同的Linux發行版的內核可能有一些小的修改。
Linux內核版本與linux發行版本的區別 LINUX內核版本 是指系統內核的版本號。LINUX的內核具有兩種不同的版本號,實驗版本和產品化版本。要確定 LINUX版本 的類型,只要查看一下版本號:每一個版本號由三位數字組成,第二位數字說明版本類型。如果第二位數字是偶數則說明這種版本是產品化版本,如果是奇數說明是實驗版本。如2.4.18是產品化版本,2.5.21是實驗版本。查看 linux內核版本 命令:uname -r Linux發行版本 是指一些 Linux廠商 將 LINUX系統內核 與應用軟體及文檔包裝在一起,並提供一些安裝界面和系統設定與管理工具,這就構成了一個發行套件。
相對於內核版本,發行套件的版本號是隨著發布者的不同而不同,與系統內核的版本號是相對獨立的。比如 RedHat AS4.0 UP4 的 內核版本 是2.6.9-42。Linux是GNU/Linux的縮寫,通常指各種Linux發行版的通稱。 常見的Linux廠家主要有Redhat/Novell等。 Redhat有兩大Linux產品系列,其一是免費的Fedora Core系列 主要用於桌面版本,提供了較多新特性的支持。 另外一個產品系列是收費的Enterprise系列,這個系列分成:AS/ES/WS等分支。 Advanced Server,縮寫即AS。AS在標准Linux內核的基礎上, 做了性能上的增強,並提高了可靠性,集成了眾多常見伺服器的驅動程序。 可輕松識別IBM/DELL/HP等常見機架式伺服器的磁碟陣列卡等設備。 AS主要版本2.x/3.x/4.x,也就是我們所說的AS3/AS4 每一個版本還有若干個升級,例如最早推出的AS4後,遇到了一些更新 此時就會發布AS4 Update1,以後還會陸續有AS4 Update2/Update3等出現 簡稱AS4u1/AS4u2/AS4u3等。這和微軟的發布形式也是非常類似的, 微軟的Windows NT4 從SP1出到SP6,Windows2000從SP1出到AS這些Update版本所包含的主要程序包版本都有一定差別,最好不要混用 否則很容易出現問題。Prima和Plesk的安裝包,對於各種發行版都有了針對性的設計 在下載頁面上,通常都會標識出來,支持哪些版本和哪些update的系統。
ES,是AS的精簡版本。他與常見的AS系列的區別是,AS支持到4路以上CPU, 而ES只能支持兩路CPU。AS和ES在大多數程序包上並無區別, 只在內核等少數軟體包上有差異。 AS和ES的售價差別比較大,通常ES用在隨伺服器一同購買的OEM版本中 例如購買DELL伺服器,搭配的Linux會是ES系列。 如果要搭配AS系列,則需要多花數千元。 WS,是ES的進一步簡化版,主要針對企業內部的桌面辦公市場,國內較少採用。 Redhat的Fedora Core Linux和Enterprise Linux,都需要遵循GNU協議 即需要發布自己的源代碼。 所以,對於免費的Fedora Core Linux,從Redhat網站上可以直接下載ISO刻盤, 還能下載到SRPM的ISO,即程序包源碼光碟。
對於收費的Enterprise Linux系列,是一款商業產品,所以網站上不能下載到ISO文件, 需要購買正式授權方可。 由於Enterprise Linux也需要遵循GNU協議,故必須發布源代碼。 所以在Redhat的網站上,可以獲得AS/ES/WS系列的SRPM源碼ISO文件。 這些文件可以被自由的下載,修改代碼,重新編譯使用。 一個名為Community Enterprise Operating System的項目誕生了。 他的縮寫既是CentOS。CentOS社區將Redhat的網站上的所有源代碼下載下來, 進行重新編譯。重新編譯後,由於AS/ES/WS是商業產品, 必須將所有Redhat的Logo和標識改成自己的CentOS標識。 比如將AS4原版的SRPM源碼編譯後,就成為了CentOS 4.0。 AS4Update1的源碼編譯後,就成為了CentOS4.1。 AS4Update2的源碼編譯後,就成為了CentOS4.2。 同理,CentOS的3.x/4.x都對應著相應的版本。
所以我們說,CentOS就是Redhat的AS/ES/WS的免費版本。 使用CentOS,可以獲得和AS/ES相同的性能和感受。 CentOS除了提供標準的編號1~4或者1~5的若干張ISO以外, 還提供了最小化1CD的Server光碟。用Server光碟安裝好的系統, 就是一個最小化的Linux內核加上常用的httpd/mysql等包 不包含Xwindows桌面等對於伺服器無用的軟體。 Prima、Plesk、Virtuozzo和都可以安裝在CentOS上。
Ⅳ Linux為什麼具有這么高的穩定性
人們會經常提及一個問題為什麼Linux幾乎不崩潰,Linux的穩定性是由於它沒有象其它操作系統一樣內核如此龐大、漏洞無窮。考察資料表明,Linux與其它Unix系統和大型操作系統如VMS、IBM大型機等一樣具有相同的可靠性。原因並不難以得到,系統的穩定性主要取決於系統設計的結構。計算機硬體的結構自從1981設計開始就沒有作特別大的改動,而連續向後兼容性使那些編程風格極差的應用軟體勉強移植到Windows的最新版本,這種將就的軟體開發模式極大地阻礙了系統穩定性的發展。另一種易於崩潰的系統Macintosh,它缺乏內存使用保護和缺乏搶占式多任務的缺點與它友好的使用界面一樣聞名於世,令人驚奇的是Macintosh雖然具有如此重大的缺陷但並沒有如人們想像的那樣頻繁死機。
Linux的穩定性並不是一個意外的例外,穩定性是所有大型計算機操作系統所具有的共性。僅僅Windows和蘋果機有時會失常。Linux所共享的Unix設計體系是經過長期實踐考驗的,Linux吸取了Unix系統近1/4世紀發展的經驗,Linux操作系統體現了最先現代化操作系統的設計理念和最經得住時間考驗的設計方案。最令人注目的是Linux開發源代碼的開發模式,這保證了任何系統的漏洞都能被及時發現和改正。
就如IBM在其網站上所說的一樣,Linux是一個穩定的、功能強大的、值得使用的操作系統。
Ⅳ 介紹一下LINUX有哪些版本
1.5.1 Linux常見發行版本介紹
Linux常見發行商包括Redhat、Debian、Fedora、SUSE、CentOS、Ubuntu、麒麟……
其中,對於Linux運維來說,下面幾個是重要的服務端發行版本。
1) Red Hat:Red Hat Linux9.0的內核為2.4.20。在版本9.0後,Red Hat不再遵循GPL協議,成為收費產品(但仍開源),發展的新版本依次為3.x、4.x、5.x、6.x、7.x、8.x。
2) Fedora:Red Hat的一個分支,仍遵循GPL協議,可以認為是Red Hat預發布版。
3) CentOS:Red Hat的另一個分支,以Red Hat發布的源代碼重建符合GPL許可協議的Linux系統,即將其源代碼的商標LOGO以及非自由軟體部分去除後再編譯而成的版本,目前CentOS已被Red Hat公司收購,但仍開源免費。
重點:CentOS、Redhat、Ubuntu(server版)是當下最重要的版本
Ⅵ 盤一盤Linux內核中ns級別的高精度計時方法
在Linux內核中,盡管系統本身和中斷的存在限制了其提供ns級別的高精度計時,常規內核高精度計時器只能勉強達到us級別且誤差較大。因此,在需要ns級別精確計時的場景下,需要藉助其他方法。以下介紹兩種針對不同處理器平台的精確計時方式:x86平台和ARM平台。
### x86平台下的精確計時
從Pentium開始,x86平台引入了時間戳計數器(TSC),這是一個用於記錄自上電啟動以來CPU執行周期數的64位寄存器。在每個時鍾信號到來時,TSC自動加一。若CPU主頻為2GHz,每條指令執行時間為0.5ns。通過讀取TSC的當前值,可以計算出代碼執行的時間。具體操作是在代碼段的A點和B點分別讀取TSC,兩值相減並乘以指令周期,即可得到A點和B點間代碼執行的耗時。
### ARM平台下的精確計時
對於ARM平台,雖然沒有直接提供類似TSC的寄存器,但通過定時計數器實現精確計時是可行的。定時器能夠提供計數和計數比較功能,計數頻率由系統時鍾經過分頻決定,且不受系統軟體影響,可以實現較高的精度。以24MHz計數頻率為例,每秒計數24000000次,轉換為us級別,每計數一次為42ns。通過驅動程序直接訪問相關寄存器,可以實現精確的計時功能。
### ARM平台的計數器使用
在ARM架構的晶元上,定時器的使用涉及頻率、控制、計數等關鍵寄存器。通過設置計數器頻率控制器(CNTFRQ_EL0)和物理計數器控制寄存器(CNTP_CTL_EL0),可以啟用計數器進行精確計時。計數器在使能後開始計數,即使被停止計數,仍會繼續計數直到斷電。驅動程序通過死循環輪詢計數寄存器,可以驗證計數器的精度,並實現精確的計時功能。
### 性能監控寄存器
ARM平台還提供性能監控寄存器(Performance Monitors registers),包括性能監控控制寄存器(PMCR_EL0)、計數使能寄存器(PMCNTENSET_EL0)和周期計數寄存器(PMCCNTR_EL0)。這些寄存器主要用於CPU性能監控,但同樣提供了計數功能,可以用於精確計時。通過結合性能監控單元(PMU),可以實現高級的性能監控和計時。
通過上述方法,x86和ARM平台在特定場景下能夠實現ns級別的精確計時,為開發者提供了靈活的計時解決方案。