linux是檔案型系統,所有硬體如軟體都會在對於的目錄下面有相應的檔案表示。對於dev這個目錄,我們知道它下面的檔案,表示的是linux的裝置。在windows系統中,裝置大家很好理解,象硬碟,磁碟指的是實實在在硬體。而在檔案系統的linux下面,都有對於檔案與這些裝置關聯的。訪問它們就可以放到實際硬體,想想還是linux靈活了。變成檔案,操作該多簡單了。不用呼叫以前com,prt等介面了。直接讀檔案,寫檔案就可以向裝置傳送讀或者寫操作了。 按照讀寫儲存資料方式,我們可以把裝置分為以下幾種:字元型裝置,塊裝置,偽裝置。
一、裝置分類
- 字元型裝置
字元裝置是指每次與系統傳輸1個字元的裝置。這些裝置節點通常為傳真、虛擬終端和串列埠調變解調器、鍵盤之類裝置提供流通訊服務,它通常不支援隨機存取資料。 字元裝置在實現時,大多不使用快取器。系統直接從裝置讀取/寫入每一個字元。例如,鍵盤這種裝置提供的就是一個資料流,當你敲入“cnblogs”這個字串時,鍵盤驅動程式會按照和輸入完全相同的順序返回這個由七個字元組成的資料流。它們是順序的,先返回c,最後是s。
- 塊裝置
塊裝置是指與系統間用塊的方式移動資料的裝置。這些裝置節點通常代表可定址裝置,如硬碟、CD-ROM和記憶體區域。
塊裝置通常支援隨機存取和定址,並使用快取器。作業系統為輸入輸出分配了快取以儲存一塊資料。當程式向裝置傳送了讀取或者寫入資料的請求時,系統把資料中的每一個字元儲存在適當的快取中。當快取被填滿時,會採取適當的操作(把資料傳走),而後系統清空快取。它與字元裝置不同之處就是,是否支援隨機儲存。字元型是流形式,逐一儲存。
- 偽裝置
在類Unix作業系統中,裝置節點並不一定要對應物理裝置。沒有這種對應關係的裝置是偽裝置。作業系統運用了它們提供的多種功能。部份經常使用到的偽裝置包括: null,zero,full,loop,random,urandom
二、特殊裝置及使用
這裡說到特殊裝置除了硬碟主機板等,只是它在linux shell命令裡面,有特殊的作用,因此把它們單獨拿出來。這些裝置分別是:
/dev/stdin
/dev/stdout
/dev/stderr
/dev/null
/dev/zero
/dev/full
/dev/random,urandom
/dev/fd
/dev/tcp|upd
/dev/loop
1、標準輸出輸入裝置
還記得上次說的,linux重定向嗎?可以看下:linux shell資料重定向(輸入重定向與輸出重定向)詳細分析 。它們就是與幾個特殊檔案描述符對應,fd0,fd1,fd2 (stdin,stdout,stderr)
如:
1 2 3 4 5 6 7 8 9 10 11 |
[chengmo@centos5 shell]$ cat>teststdin</dev/stdin test #ctrl+D #cat從/dev/stdin獲得資料,然後將標準輸出,輸入的到teststdin檔案 [chengmo@centos5 shell]$ cat teststdin test [chengmo@centos5 shell]$ cat>teststdin test #ctrl+D #不指定輸入,預設輸入裝置就是/dev/stdinn |
/dev/stdin指的就是鍵盤裝置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[chengmo@centos5 shell]$ cat test.sh >/dev/stdout |grep 'echo' echo "very good!"; echo "good!"; echo "pass!"; echo "no pass!" #/dev/stdout指向就是標準輸出,因此重定向給它的資料,最終傳送到螢幕上(fd1) [chengmo@centos5 shell]$ cat test.sh |grep 'echo' echo "very good!"; echo "good!"; echo "pass!"; echo "no pass!"; [chengmo@centos5 shell]$ cat test.sh >/dev/stderr |grep 'echo' #!/bin/sh scores=40; if [[ $scores -gt 90 ]]; then echo "very good!"; elif [[ $scores -gt 80 ]]; then echo "good!"; elif [[ $scores -gt 60 ]]; then echo "pass!"; else echo "no pass!"; fi; #/dev/stderr 指是錯誤輸出,預設也是輸出到螢幕上面,但是它的內容不能通過管道傳遞給grep,管道只能傳遞標準輸出 |
/dev/null裝置
是個黑洞裝置,它丟棄一切寫入其中資料,空裝置通常被用於丟棄不需要的輸出流。記得當年用windows時候,有個類似的裝置:NUL ,跟這個功能一樣。任何寫入該裝置資料都會被丟棄掉。從這個裡面讀取資料返回是空。將一些不用內容經常傳送給這個裝置,丟棄不需要的資料。
如:
1 2 3 4 |
[chengmo@centos5 shell]$ cat /dev/null [chengmo@centos5 shell]$ cat test.sh >/dev/null #讀該裝置為空,寫入該裝置資料都丟棄了 |
/dev/zero裝置
在類UNIX 作業系統中, /dev/zero 是一個特殊的檔案,當你讀它的時候,它會提供無限的空字元(NULL, ASCII NUL, 0x00)。其中的一個典型用法是用它提供的字元流來覆蓋資訊,另一個常見用法是產生一個特定大小的空白檔案。
如:
1 2 3 4 5 6 7 8 9 10 11 12 |
[chengmo@centos5 shell]$ dd if=/dev/zero of=testzero count=1024 bs=1024 1024+0 records in 1024+0 records out 1048576 bytes (1.0 MB) copied, 0.0107194 seconds, 97.8 MB/s #建立一個大小為1M檔案,該檔案一個塊是1024位元組,一共是1024塊(剛好1M),用/dev/zero檔案內容填充它。輸出建立到:testzero檔案 [chengmo@centos5 shell]$dd if=/dev/zero of=/dev/磁碟分割槽 #這個命令一定不要隨便用,有點象windows裡面的粉碎檔案工具。不過它是用x00填充整個分割槽。這樣做資料是不可以恢復的了。 [chengmo@centos5 shell]$cat /dev/zero>testinputzero #這個命令也不能隨便使用咯,/dev/zero裝置一個特效是,如果你讀取的話,是一個死迴圈會輸出無窮的\x00,這樣你將建立一個用\x00填充的檔案。如果你沒有限制該使用者磁碟配額。它將耗盡整個磁碟空間。 |
在linux資源配額限制裡面,如果沒有現在普通使用者的磁碟空間利用,或記憶體使用。一個普通使用者就可以通過上面方法一會就塞滿整個磁碟。也可以通過while(true) {fork……}類程式,啟動無限執行緒,耗盡整個系統記憶體。
/dev/full裝置
類Unix系統中,/dev/full(常滿裝置)是一個特殊裝置檔案,總是在向其寫入時返回裝置無剩餘空間(錯誤碼為ENOSPC),讀取時則與/dev/zero相似,返回無限的空字元(NULL, ASCII NUL, 0x00)。這個裝置通常被用來測試程式在遇到磁碟無剩餘空間錯誤時的行為。
如:
1 2 3 4 5 |
[chengmo@centos5 shell]$ echo 'chengmo' >/dev/full -bash: echo: write error: 裝置上沒有空間 [chengmo@centos5 shell]$ echo $? 1 #命令執行返回錯誤 |
/dev/random[urandom]
在類UNIX作業系統中,/dev/random是一個特殊的裝置檔案,可以用作隨機數發生器或偽隨機數發生器。它允許程式訪問來自裝置驅動程式或其它來源的背景噪聲。常用作隨機數發生器。具體參考:linux shell實現隨機數多種方法(date,random,uuid)
/dev/fd
記錄使用者開啟的檔案描述符
[chengmo@centos5 shell]$ ls /dev/fd/
0 1 2 3
詳細參考:
linux shell資料重定向(輸入重定向與輸出重定向)詳細分析 檔案描述符介紹。
/dev/tcp[udp]/host/port
讀取該類形式裝置,將會建立一個連線host主機port埠的tcp[upd]連線。開啟一個socket通訊介面。
詳細使用可以參考:
linux shell 指令碼實現tcp/upd協議通訊(重定向應用)
/dev/loop
在類UNIX作業系統中,Loop裝置 可以把loop 檔案,作為塊裝置掛載使用。
如:
[chengmo@centos5 shell]$mount -o loop example.img /home/chengmo/img
#將img映象檔案掛載到/home/chengmo/img目錄下面,有了這個裝置,我們不需要通過虛擬光碟機就可以讀虛擬磁碟格式的檔案。
說了很多linux 特殊裝置,其它象cpu,記憶體,磁碟,網路,鍵盤,終端裝置。跟我們windows裡面常見差不多。有什麼問題,歡迎交流!