mknod - make block or character special files
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
option 有用的就是 -m 了
name 自定義
type 有 b 和 c 還有 p
主設(shè)備號(hào)
次設(shè)備號(hào)
主設(shè)備號(hào)是由/usr/src/linux/include/linux/major.h定義的,如下定義了一個(gè)DOC設(shè)備:
#define IGEL_FLASH_MAJOR 62
假如有一個(gè)命令mknod doc b 62 0 :
其中的doc為定義的名字,b指塊設(shè)備,0指的是整個(gè)DOC。如果把0換為1,則1指的是DOC的第一個(gè)分區(qū)。2是第2個(gè),依次類(lèi)推。
至于mknod console c 5 1 的意思也很相似:
console是設(shè)備的名字
c指字符設(shè)備
5是該設(shè)備在major.h中定義的標(biāo)記
1是第一個(gè)子設(shè)備
mknod console c 5 1
console為設(shè)備文件名,自己隨便取
c是指字符型設(shè)備 (可選b,塊設(shè)備)
5是主設(shè)備號(hào) /dev/devices里面記錄現(xiàn)有的設(shè)備
找個(gè)沒(méi)有用的就可以了
1是次設(shè)備號(hào),當(dāng)你要給兩個(gè)同樣的設(shè)備上一個(gè)驅(qū)動(dòng)的時(shí)候就要分了,從0開(kāi)始,1就是第二個(gè)了
設(shè)備文件
對(duì)于每種硬件設(shè)備,系統(tǒng)內(nèi)核有相應(yīng)的設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)對(duì)它的處理。而在Unix中,使用設(shè)備文件的方式來(lái)表示硬件設(shè)備,每種設(shè)備驅(qū)動(dòng)程序都被抽象為設(shè)備文件的形式,這樣就給應(yīng)用程序一個(gè)一致的文件界面,方便應(yīng)用程序和操作系統(tǒng)之間的通信。
習(xí)慣上,所有的設(shè)備文件都放置在/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
在上面的列表中可以看到原來(lái)顯示文件大小的地方,現(xiàn)在改為顯示兩個(gè)用逗號(hào)分隔的數(shù)字。這是系統(tǒng)用來(lái)表示設(shè)備的兩個(gè)重要的序號(hào),第一個(gè)為主設(shè)備號(hào)(major number),用來(lái)表示設(shè)備使用的硬件驅(qū)動(dòng)程序在系統(tǒng)中的序號(hào);第二個(gè)為從設(shè)備號(hào)(minor number),硬件驅(qū)動(dòng)程序使用它來(lái)區(qū)分不同的設(shè)備和判斷如何進(jìn)行處理。FreeBSD下主設(shè)備號(hào)用8位表示,而從設(shè)備號(hào)用24位來(lái)表示。事實(shí)上設(shè)備文件的名字并不重要,重要的是這兩個(gè)設(shè)備號(hào),操作系統(tǒng)使用它確定硬件驅(qū)動(dòng)程序,并與硬件驅(qū)動(dòng)程序進(jìn)行通信。
1) 磁盤(pán)和塊設(shè)備文件
在Unix下將設(shè)備分為兩種,塊設(shè)備和字符設(shè)備,其中塊設(shè)備主要用于隨機(jī)存取的目的,磁盤(pán)為這一類(lèi)設(shè)備的代表,而字符設(shè)備用于順序存取的目的,例如磁帶或終端設(shè)備就屬于這個(gè)類(lèi)別。
磁盤(pán)設(shè)備的命名方式在前一章中提到過(guò),磁盤(pán)設(shè)備由磁盤(pán)名、磁盤(pán)的序號(hào)、分區(qū)的序號(hào)、以及FreeBSD子分區(qū)的序號(hào)來(lái)表示,例如在設(shè)備 wd0s1a中,wd為驅(qū)動(dòng)程序,此后為設(shè)備序號(hào),0表示為這個(gè)驅(qū)動(dòng)程序的第一個(gè)設(shè)備,Unix習(xí)慣上從0開(kāi)始計(jì)數(shù),第三部分的分區(qū)序號(hào)為s1,注意這里為第一個(gè)分區(qū),因?yàn)閟1是從1開(kāi)始向下排列的,與一般Unix的習(xí)慣不同,這是因?yàn)榉謪^(qū)的概念是一個(gè)DOS概念,因此這里也使用與DOS相對(duì)應(yīng)的順序,最后一個(gè)a為FreeBSD子分區(qū)的順序,每個(gè)UFS基本分區(qū)可以有8個(gè)子分區(qū),這8個(gè)分區(qū)按照習(xí)慣用于不同的目的,例如wd0s1a用于根文件系統(tǒng), wd0s1b用做交換分區(qū),使用wd0s1c表示整個(gè)硬盤(pán)分區(qū)wd0s1。因此可以將fd0c用于對(duì)整個(gè)軟盤(pán)fd0進(jìn)行存取,wcd0c用于對(duì)整個(gè)光盤(pán) wcd0進(jìn)行存取等。
傳統(tǒng)名字,例如wd0a,可以用于表示第一個(gè)UFS分區(qū)上的a子分區(qū),如wd0s1a。一般一個(gè)硬盤(pán)上只有一個(gè)UFS分區(qū),因此可以直接使用傳統(tǒng)名字標(biāo)識(shí)磁盤(pán)分區(qū)。
在使用ls命令列表時(shí),系統(tǒng)使用c(character)標(biāo)識(shí)一個(gè)字符設(shè)備文件,使用b(block)標(biāo)識(shí)塊設(shè)備文件。
$ 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
雖然硬盤(pán)設(shè)備為塊設(shè)備,用于隨機(jī)存取的目的。但它也可以被順序存取,這種方式稱(chēng)為raw方式。使用raw方式存取硬盤(pán),就需要一個(gè)對(duì)應(yīng)的字符類(lèi)型的設(shè)備文件,對(duì)應(yīng)wd0s1硬盤(pán)設(shè)備的字符類(lèi)型硬盤(pán)設(shè)備為rwd0s1,設(shè)備名中第一個(gè)字母使用r表示對(duì)硬盤(pán)的raw方式順序存取。
由于設(shè)備文件就代表了整個(gè)設(shè)備,就可以使用FreeBSD的標(biāo)準(zhǔn)命令以raw方式直接操作設(shè)備文件,從而直接訪問(wèn)硬件設(shè)備。利用這種方式,能完成很多有用的工作,但是這種方式也非常危險(xiǎn),例如對(duì)硬盤(pán)設(shè)備文件的操作失誤會(huì)破壞整個(gè)硬盤(pán)的數(shù)據(jù)。幸好大部分直接訪問(wèn)設(shè)備的操作都為讀取相應(yīng)數(shù)據(jù)的操作,而不需要寫(xiě)入磁盤(pán)設(shè)備。
當(dāng)某個(gè)設(shè)備不可使用,則其對(duì)應(yīng)的設(shè)備文件也不能正常訪問(wèn),因此直接訪問(wèn)設(shè)備文件可以判斷對(duì)應(yīng)的設(shè)備是否真正正常。例如,判斷連接到第一個(gè)串口, ttyd0上的鼠標(biāo)是否正常工作,使用命令 “cat </dev/ttyd0” 來(lái)查看ttyd0上的輸入數(shù)據(jù),如果連接的有鼠標(biāo)且工作正常,那么在移動(dòng)鼠標(biāo)的同時(shí)屏幕上就會(huì)顯示出接收到的雜亂數(shù)據(jù)。如果沒(méi)有反應(yīng),說(shuō)明鼠標(biāo)工作不正確。
但是如果存在其他的程序接管了這個(gè)設(shè)備,有可能就不能得到正確的結(jié)果。例如系統(tǒng)運(yùn)行了moused,由moused控制了鼠標(biāo)端口,那么”cat </dev/ttyd0”就不能正常工作,而 “cat < /dev/sysmouse” 會(huì)給出答案。
cat或其他命令,沒(méi)有控制具體接收到數(shù)據(jù)的多少,更有效的系統(tǒng)工具是dd,它能精確輸入輸出一定數(shù)量的數(shù)據(jù)。例如:
# dd if=/dev/rwd0 of=mbr count=1 bs=512
這將以512字節(jié)為單位,讀取硬盤(pán)wd0上一個(gè)單位的數(shù)據(jù),保存到名字為mbr的文件中,通常這是硬盤(pán)wd0上的主引導(dǎo)扇區(qū)。
2) 設(shè)備文件的創(chuàng)建
通常情況下,安裝系統(tǒng)時(shí)已經(jīng)創(chuàng)建了常用的設(shè)備文件,可以直接訪問(wèn)這些設(shè)備文件來(lái)訪問(wèn)設(shè)備。但在用戶(hù)重新定制內(nèi)核,并添加了新硬件驅(qū)動(dòng)程序之后,新驅(qū)動(dòng)程序?qū)?yīng)的設(shè)備文件就可能不存在。在FreeBSD中,最常見(jiàn)的例子就是在內(nèi)核中增加聲卡的驅(qū)動(dòng)程序時(shí),就需要?jiǎng)?chuàng)建相應(yīng)設(shè)備文件。
創(chuàng)建設(shè)備文件的基本方式是使用mknod,但是必須知道該設(shè)備的正確設(shè)備號(hào)才可以。另一種簡(jiǎn)單的方式是使用/dev目錄下的shell程序 MAKEDEV來(lái)完成,MAKEDEV實(shí)質(zhì)上就是記錄了很多設(shè)備的名字與其設(shè)備號(hào)之間的關(guān)系的程序,因此它能使用正確的設(shè)備號(hào)來(lái)創(chuàng)建設(shè)備。首先進(jìn)入 /dev目錄,然后再執(zhí)行MAKEDEV。
# cd /dev
# sh MAKEDEV snd0
MAKEDEV將使用設(shè)備名作參數(shù)創(chuàng)建設(shè)備文件,同時(shí)也創(chuàng)建這個(gè)設(shè)備文件依賴(lài)的其他相關(guān)設(shè)備文件。MAKEDEV的參數(shù),并不一定為創(chuàng)建的設(shè)備文件名。例如建立 “MAKEDEV vty8” 將建立ttyv0到ttyv7共8個(gè)設(shè)備文件,使用 “MAKEDEV wd1s1a” 命令,將建立 wd1、wd1s1、wd1s2等,以及wd1s1a、wd1s1b等設(shè)備文件。也可以使用all做MAKEDEV的參數(shù),這將首先清除/dev目錄下的所有設(shè)備文件,然后MAKEDEV創(chuàng)建所有預(yù)設(shè)的設(shè)備文件。一般情況下這將創(chuàng)建足夠多的設(shè)備文件,其中的大部分設(shè)備文件在具體的系統(tǒng)中不會(huì)用得到。
如果對(duì)一個(gè)系統(tǒng)中沒(méi)有(或者即使有但內(nèi)核沒(méi)有支持或探測(cè)到)的設(shè)備對(duì)應(yīng)的設(shè)備文件進(jìn)行操作,則系統(tǒng)返回Device not configured的錯(cuò)誤信息。
MAKEDEV將使用mknod和對(duì)應(yīng)設(shè)備的正確參數(shù),包括字符或塊設(shè)備、主設(shè)備號(hào)和從設(shè)備號(hào)來(lái)建立相應(yīng)的設(shè)備文件。管理員也可以直接使用 mknod創(chuàng)建設(shè)備文件,但這就必須將這些設(shè)備參數(shù)統(tǒng)統(tǒng)指定正確才行。因此除非對(duì)系統(tǒng)中的硬件驅(qū)動(dòng)程序特別熟悉,一般不直接使用mknod來(lái)創(chuàng)建設(shè)備文件。
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
option 有用的就是 -m 了
name 自定義
type 有 b 和 c 還有 p
主設(shè)備號(hào)
次設(shè)備號(hào)
主設(shè)備號(hào)是由/usr/src/linux/include/linux/major.h定義的,如下定義了一個(gè)DOC設(shè)備:
#define IGEL_FLASH_MAJOR 62
假如有一個(gè)命令mknod doc b 62 0 :
其中的doc為定義的名字,b指塊設(shè)備,0指的是整個(gè)DOC。如果把0換為1,則1指的是DOC的第一個(gè)分區(qū)。2是第2個(gè),依次類(lèi)推。
至于mknod console c 5 1 的意思也很相似:
console是設(shè)備的名字
c指字符設(shè)備
5是該設(shè)備在major.h中定義的標(biāo)記
1是第一個(gè)子設(shè)備
mknod console c 5 1
console為設(shè)備文件名,自己隨便取
c是指字符型設(shè)備 (可選b,塊設(shè)備)
5是主設(shè)備號(hào) /dev/devices里面記錄現(xiàn)有的設(shè)備
找個(gè)沒(méi)有用的就可以了
1是次設(shè)備號(hào),當(dāng)你要給兩個(gè)同樣的設(shè)備上一個(gè)驅(qū)動(dòng)的時(shí)候就要分了,從0開(kāi)始,1就是第二個(gè)了
設(shè)備文件
對(duì)于每種硬件設(shè)備,系統(tǒng)內(nèi)核有相應(yīng)的設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)對(duì)它的處理。而在Unix中,使用設(shè)備文件的方式來(lái)表示硬件設(shè)備,每種設(shè)備驅(qū)動(dòng)程序都被抽象為設(shè)備文件的形式,這樣就給應(yīng)用程序一個(gè)一致的文件界面,方便應(yīng)用程序和操作系統(tǒng)之間的通信。
習(xí)慣上,所有的設(shè)備文件都放置在/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
在上面的列表中可以看到原來(lái)顯示文件大小的地方,現(xiàn)在改為顯示兩個(gè)用逗號(hào)分隔的數(shù)字。這是系統(tǒng)用來(lái)表示設(shè)備的兩個(gè)重要的序號(hào),第一個(gè)為主設(shè)備號(hào)(major number),用來(lái)表示設(shè)備使用的硬件驅(qū)動(dòng)程序在系統(tǒng)中的序號(hào);第二個(gè)為從設(shè)備號(hào)(minor number),硬件驅(qū)動(dòng)程序使用它來(lái)區(qū)分不同的設(shè)備和判斷如何進(jìn)行處理。FreeBSD下主設(shè)備號(hào)用8位表示,而從設(shè)備號(hào)用24位來(lái)表示。事實(shí)上設(shè)備文件的名字并不重要,重要的是這兩個(gè)設(shè)備號(hào),操作系統(tǒng)使用它確定硬件驅(qū)動(dòng)程序,并與硬件驅(qū)動(dòng)程序進(jìn)行通信。
1) 磁盤(pán)和塊設(shè)備文件
在Unix下將設(shè)備分為兩種,塊設(shè)備和字符設(shè)備,其中塊設(shè)備主要用于隨機(jī)存取的目的,磁盤(pán)為這一類(lèi)設(shè)備的代表,而字符設(shè)備用于順序存取的目的,例如磁帶或終端設(shè)備就屬于這個(gè)類(lèi)別。
磁盤(pán)設(shè)備的命名方式在前一章中提到過(guò),磁盤(pán)設(shè)備由磁盤(pán)名、磁盤(pán)的序號(hào)、分區(qū)的序號(hào)、以及FreeBSD子分區(qū)的序號(hào)來(lái)表示,例如在設(shè)備 wd0s1a中,wd為驅(qū)動(dòng)程序,此后為設(shè)備序號(hào),0表示為這個(gè)驅(qū)動(dòng)程序的第一個(gè)設(shè)備,Unix習(xí)慣上從0開(kāi)始計(jì)數(shù),第三部分的分區(qū)序號(hào)為s1,注意這里為第一個(gè)分區(qū),因?yàn)閟1是從1開(kāi)始向下排列的,與一般Unix的習(xí)慣不同,這是因?yàn)榉謪^(qū)的概念是一個(gè)DOS概念,因此這里也使用與DOS相對(duì)應(yīng)的順序,最后一個(gè)a為FreeBSD子分區(qū)的順序,每個(gè)UFS基本分區(qū)可以有8個(gè)子分區(qū),這8個(gè)分區(qū)按照習(xí)慣用于不同的目的,例如wd0s1a用于根文件系統(tǒng), wd0s1b用做交換分區(qū),使用wd0s1c表示整個(gè)硬盤(pán)分區(qū)wd0s1。因此可以將fd0c用于對(duì)整個(gè)軟盤(pán)fd0進(jìn)行存取,wcd0c用于對(duì)整個(gè)光盤(pán) wcd0進(jìn)行存取等。
傳統(tǒng)名字,例如wd0a,可以用于表示第一個(gè)UFS分區(qū)上的a子分區(qū),如wd0s1a。一般一個(gè)硬盤(pán)上只有一個(gè)UFS分區(qū),因此可以直接使用傳統(tǒng)名字標(biāo)識(shí)磁盤(pán)分區(qū)。
在使用ls命令列表時(shí),系統(tǒng)使用c(character)標(biāo)識(shí)一個(gè)字符設(shè)備文件,使用b(block)標(biāo)識(shí)塊設(shè)備文件。
$ 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
雖然硬盤(pán)設(shè)備為塊設(shè)備,用于隨機(jī)存取的目的。但它也可以被順序存取,這種方式稱(chēng)為raw方式。使用raw方式存取硬盤(pán),就需要一個(gè)對(duì)應(yīng)的字符類(lèi)型的設(shè)備文件,對(duì)應(yīng)wd0s1硬盤(pán)設(shè)備的字符類(lèi)型硬盤(pán)設(shè)備為rwd0s1,設(shè)備名中第一個(gè)字母使用r表示對(duì)硬盤(pán)的raw方式順序存取。
由于設(shè)備文件就代表了整個(gè)設(shè)備,就可以使用FreeBSD的標(biāo)準(zhǔn)命令以raw方式直接操作設(shè)備文件,從而直接訪問(wèn)硬件設(shè)備。利用這種方式,能完成很多有用的工作,但是這種方式也非常危險(xiǎn),例如對(duì)硬盤(pán)設(shè)備文件的操作失誤會(huì)破壞整個(gè)硬盤(pán)的數(shù)據(jù)。幸好大部分直接訪問(wèn)設(shè)備的操作都為讀取相應(yīng)數(shù)據(jù)的操作,而不需要寫(xiě)入磁盤(pán)設(shè)備。
當(dāng)某個(gè)設(shè)備不可使用,則其對(duì)應(yīng)的設(shè)備文件也不能正常訪問(wèn),因此直接訪問(wèn)設(shè)備文件可以判斷對(duì)應(yīng)的設(shè)備是否真正正常。例如,判斷連接到第一個(gè)串口, ttyd0上的鼠標(biāo)是否正常工作,使用命令 “cat </dev/ttyd0” 來(lái)查看ttyd0上的輸入數(shù)據(jù),如果連接的有鼠標(biāo)且工作正常,那么在移動(dòng)鼠標(biāo)的同時(shí)屏幕上就會(huì)顯示出接收到的雜亂數(shù)據(jù)。如果沒(méi)有反應(yīng),說(shuō)明鼠標(biāo)工作不正確。
但是如果存在其他的程序接管了這個(gè)設(shè)備,有可能就不能得到正確的結(jié)果。例如系統(tǒng)運(yùn)行了moused,由moused控制了鼠標(biāo)端口,那么”cat </dev/ttyd0”就不能正常工作,而 “cat < /dev/sysmouse” 會(huì)給出答案。
cat或其他命令,沒(méi)有控制具體接收到數(shù)據(jù)的多少,更有效的系統(tǒng)工具是dd,它能精確輸入輸出一定數(shù)量的數(shù)據(jù)。例如:
# dd if=/dev/rwd0 of=mbr count=1 bs=512
這將以512字節(jié)為單位,讀取硬盤(pán)wd0上一個(gè)單位的數(shù)據(jù),保存到名字為mbr的文件中,通常這是硬盤(pán)wd0上的主引導(dǎo)扇區(qū)。
2) 設(shè)備文件的創(chuàng)建
通常情況下,安裝系統(tǒng)時(shí)已經(jīng)創(chuàng)建了常用的設(shè)備文件,可以直接訪問(wèn)這些設(shè)備文件來(lái)訪問(wèn)設(shè)備。但在用戶(hù)重新定制內(nèi)核,并添加了新硬件驅(qū)動(dòng)程序之后,新驅(qū)動(dòng)程序?qū)?yīng)的設(shè)備文件就可能不存在。在FreeBSD中,最常見(jiàn)的例子就是在內(nèi)核中增加聲卡的驅(qū)動(dòng)程序時(shí),就需要?jiǎng)?chuàng)建相應(yīng)設(shè)備文件。
創(chuàng)建設(shè)備文件的基本方式是使用mknod,但是必須知道該設(shè)備的正確設(shè)備號(hào)才可以。另一種簡(jiǎn)單的方式是使用/dev目錄下的shell程序 MAKEDEV來(lái)完成,MAKEDEV實(shí)質(zhì)上就是記錄了很多設(shè)備的名字與其設(shè)備號(hào)之間的關(guān)系的程序,因此它能使用正確的設(shè)備號(hào)來(lái)創(chuàng)建設(shè)備。首先進(jìn)入 /dev目錄,然后再執(zhí)行MAKEDEV。
# cd /dev
# sh MAKEDEV snd0
MAKEDEV將使用設(shè)備名作參數(shù)創(chuàng)建設(shè)備文件,同時(shí)也創(chuàng)建這個(gè)設(shè)備文件依賴(lài)的其他相關(guān)設(shè)備文件。MAKEDEV的參數(shù),并不一定為創(chuàng)建的設(shè)備文件名。例如建立 “MAKEDEV vty8” 將建立ttyv0到ttyv7共8個(gè)設(shè)備文件,使用 “MAKEDEV wd1s1a” 命令,將建立 wd1、wd1s1、wd1s2等,以及wd1s1a、wd1s1b等設(shè)備文件。也可以使用all做MAKEDEV的參數(shù),這將首先清除/dev目錄下的所有設(shè)備文件,然后MAKEDEV創(chuàng)建所有預(yù)設(shè)的設(shè)備文件。一般情況下這將創(chuàng)建足夠多的設(shè)備文件,其中的大部分設(shè)備文件在具體的系統(tǒng)中不會(huì)用得到。
如果對(duì)一個(gè)系統(tǒng)中沒(méi)有(或者即使有但內(nèi)核沒(méi)有支持或探測(cè)到)的設(shè)備對(duì)應(yīng)的設(shè)備文件進(jìn)行操作,則系統(tǒng)返回Device not configured的錯(cuò)誤信息。
MAKEDEV將使用mknod和對(duì)應(yīng)設(shè)備的正確參數(shù),包括字符或塊設(shè)備、主設(shè)備號(hào)和從設(shè)備號(hào)來(lái)建立相應(yīng)的設(shè)備文件。管理員也可以直接使用 mknod創(chuàng)建設(shè)備文件,但這就必須將這些設(shè)備參數(shù)統(tǒng)統(tǒng)指定正確才行。因此除非對(duì)系統(tǒng)中的硬件驅(qū)動(dòng)程序特別熟悉,一般不直接使用mknod來(lái)創(chuàng)建設(shè)備文件。
[root@can]# ll /dev/hd hda hda1 hda2 hda3 hda4 hda5 hdc [root@can]# ll /dev/hda brw-r----- 1 root disk 3, 0 2008-12-18 /dev/hda [root@can]# ll /dev/hda4 brw-r----- 1 root disk 3, 4 2008-12-18 /dev/hda4 [root@can]# |