FreeBSD裝置檔案(轉)

gugu99發表於2007-08-11
FreeBSD裝置檔案(轉)[@more@]

  對於每種硬體裝置,系統核心有相應的裝置驅動程式負責對它的處理。而在Unix中,使用裝置檔案的方式來表示硬體裝置,每種裝置驅動程式都被抽象為裝置檔案的形式,這樣就給應用程式一個一致的檔案介面,方便應用程式和作業系統之間的通訊。所有的裝置檔案都放置在/dev目錄下。

  $ ls -l /dev/rfd0 /dev/fd0

  brw-r----- 9 root operator 2, 0 Nov 12 13:32 /dev/fd0

  crw-r----- 9 root operator 9, 0 Nov 12 13:32 /dev/rfd0

  在上面的列表中可以看到原來顯示檔案大小的地方,現在改為顯示兩個用逗號分隔的數字。這是系統用來表示裝置的兩個重要的序號,第一個為主裝置號(major number),用來表示裝置使用的硬體驅動程式在系統中的序號;第二個為從裝置號(minor number),硬體驅動程式使用它來區分不同的裝置和判斷如何進行處理。FreeBSD 下主裝置號用8位表示,而從裝置號用24位來表示。事實上裝置檔案的名字並不重要,重要的是這兩個裝置號,作業系統使用它確定硬體驅動程式,並與硬體驅動程式進行通訊。

  • 磁碟和塊裝置檔案

  在Unix下將裝置分為兩種,塊裝置和字元裝置,其中塊裝置主要用於隨機存取的目的,磁碟為這一類裝置的代表,而字元裝置用於順序存取的目的,例如磁帶或終端裝置。

  磁碟裝置的命名方式在前一章中提到過,磁碟裝置由磁碟名、磁碟的序號、分割槽的序號、以及FreeBSD子分割槽的序號來表示,例如在裝置wd0s1a中,wd為驅動程式,此後為裝置序號,0表示為這個驅動程式的第一個裝置,Unix 習慣上從0開始計數,第三部分的分割槽序號為s1,注意這裡為第一個分割槽,因為s1是從1開始向下排列的,與一般Unix 的習慣不同,這是因為分割槽的概念是一個DOS概念,因此這裡也使用與DOS相對應的順序,最後一個a為FreeBSD 子分割槽的順序,每個UFS基本分割槽可以有8個子分割槽,這8個分割槽按照習慣用於不同的目的,例如wd0s1a用於根檔案系統,wd0s1b用做交換分割槽,使用wd0s1c表示整個硬碟分割槽wd0s1。因此可以將fd0c用於對整個軟盤fd0進行存取,wcd0c用於對整個光碟wcd0進行存取等。

  傳統名字,例如wd0a,可以用於表示第一個UFS分割槽上的a子分割槽,如wd0s1a。一般一個硬碟上只有一個UFS分割槽,因此可以直接使用傳統名字標識磁碟分割槽。

  在使用ls命令列表時,系統使用c(character)標識一個字元裝置檔案,使用b(block)標識塊裝置檔案。

  $ ls -l /dev/*wd0s1

  crw-r----- 1 root operator 3, 131072 Oct 31 19:59 /dev/rwd0s1

  brw-r----- 1 root operator 0, 131072 Oct 31 19:59 /dev/wd0s1

  雖然硬碟裝置為塊裝置,用於隨機存取的目的。但它也可以被順序存取,這種方式稱為raw方式。使用raw方式存取硬碟,就需要一個對應的字元型別的裝置檔案,對應wd0s1硬碟裝置的字元型別硬碟裝置為rwd0s1,裝置名中第一個字母使用r表示對硬碟的raw方式順序存取。

  由於裝置檔案就代表了整個裝置,就可以使用FreeBSD的標準命令以raw方式直接操作裝置檔案,從而直接訪問硬體裝置。利用這種方式,能完成很多有用的工作,但是這種方式也非常危險,例如對硬碟裝置檔案的操作失誤會破壞整個硬碟的資料。幸好大部分直接訪問裝置的操作都為讀取相應資料的操作,而不需要寫入磁碟裝置。

  當某個裝置不可使用,則其對應的裝置檔案也不能正常訪問,因此直接訪問裝置檔案可以判斷對應的裝置是否真正正常。例如,判斷連線到第一個串列埠,ttyd0上的滑鼠是否正常工作,使用命令 “cat

  cat或其他命令,沒有控制具體接收到資料的多少,更有效的系統工具是dd,它能精確輸入輸出一定數量的資料。例如:# dd if=/dev/rwd0 of=mbr count=1 bs=512

  這將以512位元組為單位,讀取硬碟wd0上一個單位的資料,儲存到名字為mbr的檔案中,通常這是硬碟wd0 上的主引導扇區。

  • 終端裝置

  終端裝置檔案為標識使用者與系統連線的終端裝置的裝置檔案,這是一種典型的字元裝置檔案。普通的終端一般使用串列埠和主機相連線,系統使用終端檔案來描述這個連線的終端。通常第一個串列埠連線的裝置為ttyd0(標準個人計算機第一個串列埠連線的常常是滑鼠),第二個串列埠為ttyd1,依次類推。

  如果使用者是使用telnet或其他遠端登入的方式,那麼系統使用一個偽裝置檔案與使用者的偽終端相對應,這些偽終端裝置檔案為ttyp0到ttysv,ttyP0到ttySv。這樣就能支援相當多使用者同時登入系統。

  Unix是多使用者、多工系統,但是個人計算機僅僅有一個螢幕,熟練Unix使用者喜歡同時進行幾個工作,例如在一邊下載檔案,一邊進行程式設計等,對於直接使用控制檯的FreeBSD使用者來講,FreeBSD提供的虛擬終端能完美的解決這個問題。

  對於在控制檯上的虛擬終端,對應的終端裝置檔案為ttyv0、ttyv1、ttyv3等,與鍵盤上的12個功能鍵相對應。控制檯裝置被系統用來輸出很多必要的資訊,包括各種登入資訊等對系統安全非常相關的資訊。由於在控制檯上操作就是在個人計算機前面操作,因此通常在控制檯上能完成許多在其他終端上不能完成的操作,例如:使用Ctrl+Alt+Del 重起系統等。為了保證系統安全,必須限制對控制檯的物理訪問。

  對於不在控制檯的使用者,就需要額外的應用程式的支援,在X終端上能使用X Window系統開出多個視窗,每個視窗對應一個偽終端。在字元終端上,也可以透過應用程式screen開啟幾個偽終端,但這需要安裝相應的軟體。這些偽終端都使用ttyp0等偽裝置檔案。

  與終端相關的另一個問題為不同的終端裝置分為不同的終端型別,這是因為雖然終端是字元型裝置,但又要求它能夠具備更復雜的功能,例如進行全螢幕操作等。這樣就要求終端裝置能接受和識別一些控制字元,而不同的終端裝置具備不同的控制字元。登入使用者可以使用TERM環境變數來告訴應用程式當前使用的終端型別,常用的終端型別有vt100,ansi 等,FreeBSD控制檯的終端型別為cons25,但是其他Unix中一般不識別這個型別,因此如果在FreeBSD 上透過telnet等連線到其他Unix上之後,應該改變TERM變數的值為ansi。

  在FreeBSD中,終端類別對應的控制字元使用termcap的方法定義,而System V中使用ter minfo的方式。所有的終端型別記錄在/usr/share/misc/termcap檔案中,並定義這些終端對應的控制字元。

  登入到系統之後,將有一個終端裝置檔案與使用者的這個登入過程相聯絡。這個終端裝置檔案在控制檯上登入時可能是 /dev/ttyv0,如果從網路上遠端登入可能是/dev/ttyp0,但無論是那種情況,系統總使用/dev/t ty來代表使用者當前使用的終端,直接訪問/dev/tty將對當前的終端進行直接操作。

  除了這些與裝置相聯絡的裝置檔案之外,還有一些特殊的裝置檔案。例如/dev/zero檔案代表一個永遠輸出 0的裝置檔案,使用它作輸入可以得到全為空的檔案。因此可用來建立新檔案和以覆蓋的方式清除舊檔案。下面使用dd命令將從zero裝置中建立一個10K大小(bs決定每次讀寫1024位元組,count定義讀寫次數為10次),但內容全為0的檔案。

  # dd if=/dev/zero of=file count=10 bs=1024

  10+0 records in

  10+0 records out

  10240 bytes transferred in 0.001408 secs (7267903 b ytes/sec)

  另一個特殊裝置檔案為/dev/null,永遠無法寫滿,寫入的內容被系統立即丟棄。如果不想看到程式的輸出,可以使用它作輸出。

  # make world > /dev/null

  去除了螢幕輸出,使整個程式執行過程非常平靜。

  • 裝置檔案的建立

  通常情況下,安裝系統時已經建立了常用的裝置檔案,可以直接訪問這些裝置檔案來訪問裝置。但在使用者重新定製核心,並新增了新硬體驅動程式之後,新驅動程式對應的裝置檔案就可能不存在。在FreeBSD中,最常見的例子就是在核心中增加音效卡的驅動程式時,就需要建立相應裝置檔案。

  建立裝置檔案可以使用/dev目錄下的shell程式MAKEDEV來完成,首先進入/dev目錄,然後再執行MAKEDEV。

  # cd /dev

  # ./MAKEDEV snd0

  MAKEDEV將使用裝置名作引數建立裝置檔案,同時也建立這個裝置檔案依賴的其他相關裝置檔案。MAKEDEV 的引數,並不一定為建立的裝置檔名。例如建立 “MAKEDEV vty8” 將建立ttyv0到ttyv7共 8個裝置檔案,使用 “MAKEDEV wd1s1a” 命令,將建立wd1、wd1s1、wd1s2等,以及wd1s1a、wd1s1b 等裝置檔案。也可以使用all做MAKEDEV的引數,這將首先清除/dev目錄下的所有裝置檔案,然後MAKEDEV建立所有預設的裝置檔案。一般情況下這將建立足夠多的裝置檔案,其中的大部分裝置檔案在具體的系統中不會用得到。

  如果對一個系統中沒有(或者核心沒有探測到)的裝置對應的裝置檔案進行操作,則系統返回Device not configured 的錯誤資訊。

  MAKEDEV將使用mknod和對應裝置的正確引數,包括字元或塊裝置、主裝置號和從裝置號來建立相應的裝置檔案。管理員也可以直接使用mknod建立裝置檔案,但這就必須將這些裝置引數統統指定正確才行。因此除非對系統中的硬體驅動程式特別熟悉,一般不直接使用mknod來建立裝置檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944775/,如需轉載,請註明出處,否則將追究法律責任。

相關文章