分类:
2006-02-21 17:02:03
设备文件是什么?
操作系统与外部设备(例如,磁带驱动器,磁盘驱动器,打印机,终端,modern)是通过一种被称为设备文件的文件来进行通信。unix输入输出到外部设备的方式和输入输出到一个文件的方式是相同的。在UNIX 同一个外部设备进行通讯之前,这个设备必须首先要有一个设备文件存在。例如,每一个终端都有自己的设备文件来供UNIX写数据(出现在终端屏幕上),和读取数据(用户通过键盘输入)。
设备文件和普通文件不一样,设备文件中并不包含任何数据。
操作系统通过设备文件来与一个设备进行通讯。设备文件存在于/dev目录下。
注意:设备文件与特殊文件是同义词。你可以互换这两个术语。
由于UNIX操作系统为你创建所有的设备文件,所以在你存取一个外部设备的时候,你需要知道这个设备对应的设备文件名。有时候你会需要自己创建一个设备文件。如果你永久地去掉一个外部设备,你应该删除它对应的设备文件。
以下的例子说明了UNIX命令如何使用一个设备文件:
#tar -cvf /dev/rmt/0m /usr
tar应用使用-f选项来打开一个文件以供输出。然后tar会备份数据到那个文件。tar可以写到一个普通文件或者直接写到一个设备。tar并不需要知道它们之间的不同。
# echo hello > /dev/tty0p1
在这个例子中,echo命令的标准输出通过被重定向到一个终端,其方式是通过这个终端的设备文件
使用ls -l列出设备文件
使用ls -l /dev列出设备文件名
brw-r----- 1 root sys 31 0x005000 Feb 10 1997 /dev/dsk/c0t5d0
brw-r----- 1 root sys 31 0x006000 Feb 10 1997 /dev/dsk/c0t6d0
crw-r----- 1 root sys 31 0x005000 Feb 10 1997 /dev/rdsk/c0t5d0
crw-r----- 1 root sys 31 0x006000 Feb 10 1997 /dev/rdsk/c0t6do
crw-r----- 2 root tty 17 0x000001 Jan 9?09:25 /dev/ttyp1
crw-r----- 2 root tty 17 0x000002 Jan 9?17:25 /dev/ttyp2
设备文件类型 ????主号 次号 ????????设备文件名
设备文件通常都是在/dev目录下。你可以使用ls -l命令来列出这个目录下的文件,就像你列出其它目录下的文件一样。注意:ls -l列出的设备文件和其它文件有一点点的不同。
设备文件类型
设备文件名的第一个字符指明了这个设备文件的类型。
字符设备文件:?第一个字符为“c",表明这个文件是一个字符设备文件。
字符设备文件传送数据给设备的时候,一次传送一个字符。终端,打印机,绘图仪,modern等设备是一些典型的经过字符设备文件传送数据的设备。字符设备文件有时也被称为“raw” 设备文件。
块设备文件: ??第一个字符为“b”的设备文件是一个块设备文件。系统通过块设备文件存取一个设备的时候,先从内存中的buffer中读或写数据。而不是直接传送数据到物理磁盘。这种方式能有效的提高磁盘和CD-ROMS的I/O性能。
终端,moderms,打印机,绘图仪和磁带设备是典型的只能使用字符设备文件的设备,磁盘和CD-ROMS既可以使用字符设备文件也可以使用块设备文件。
一些应用程序和工具选择使用字符设备文件直接存取磁盘。而其它工具要求使用一个块设备文件。阅读应用或者工具的说明文档来决定使用那一种设备文件。
设备文件主号
每一个设备文件都有一个“主号”,使用ls -l命令输出的内容的第五个字段即为主号。主号是表示系统存取这个设备的“内核驱动” 。内核驱动是UNIX内核中的一部分代码,其作用是用来控制一种特殊的设备的输入输出。大多数的unix操作系统都有多种设备驱动程序;每一个设备文件名中的设备主号就代表这个设备使用的是那个设备驱动程序。lsdev命令可以列出你的内核中配置的驱动程序,和这些驱动程序对应的主号。
设备文件次号
每一个设备文件都有一个次号。“次号”是一个24位的十六进制数字,其定义了:
这个设备在系统中的物理的位置。
设备存储选项。例如磁带,磁带有特殊的存取选项,使用/不使用硬件压缩,和定义写到磁带上的数据格式密度等。
设备文件名
设备文件名遵循一个标准的命名的约定。这种约定使分辩那一个设备文件关联那一个设备变得很容易。以下的章节会讨论命名规则的细节。
使用ioscan列出设备文件名
# ioscan -fun ???列出所有的设备和对应的设备文件名
# ioscan -fun disk ?列出所有的磁盘设备和设备文件名
# ioscan -funC tape ?列出所有的磁带设备和磁带设备文件
虽然ls -l命令可以列出你的系统中的设备文件。但是它没有指明那一个设备文件对应那一个设备。
ioscan -fun命令提供了一种方便的机制来找到设备文件对应系统中的硬件的路径。在每一个硬件路径下,ioscan -fun列出了与每一个硬件路径相关联的设备文件。由于一些设备有多个存取选项,ioscan可以列出一个设备对应的多个设备文件。
例子:
#ioscan -fun??????????列出所有的设备和设备关联的设备文件名
# ioscan -funC disk ?????? 仅列出磁盘类的设备和关联的设备文件名
#ioscan -funC tape ???????仅列出磁带设备和关联的设备文件名
#ioscan -funH 2/0/1.6.0 ???? 仅列出在2/0/1.6.0位置的设备的设备文件名
使用lssf列出设备文件
??/usr/sbin/lssf path [pah -]
??# lssf /dev/rdsk/clt6d0
??disc3 card instance 1 scsi target 6 scsi LUN 0
??section 0 at address 52.6.0 /dev/rdsk/clt6d0
??# lssf /dev/rmt/0mn
??tape2 card instance 1 SCSI target 0 SCSI LUN at@t no
??rewind best density available at address 52.0.0 /dev/rmt/omn
许多设备有多个相关联的设备文件。例如,上例中的磁带设备有八个设备文件。这是因为许多设备可以使用不同的存取选项来存取。每一个设备文件代表一个存取选项。
ioscan列出每一个设备的设备文件,但是不指明设备文件对应那一个设备。lssf命令可以选择用来判断每一个设备文件的特征。lssf 告诉你:
这个设备文件使用的哪一个驱动程序
设备的硬件地址信息
任何设备文件使用的设备存取选项。
问题:
我们已经有三个命令可以用来浏览设备文件:ls -l,lssf,和ioscan。请判断在以下情况下应该使用那个命令:
1.列出硬件地址为2/0/1.1.2的磁带驱动器的设备文件。
2.列出所有的磁盘设备文件。
3.那一个命令可以用来判断通过设备文件/dev/rmt/c0t0dBESTnb存取的硬件路径。
4.那一个命令可以告诉你设备文件/dev/rmt/c0t0d0BESTnb的设备选项是什么。
/dev目录的布局
这一部分会介绍系统对一个设备文件取名的命名规则。一个容易理解的命令规则会让你更容易地选择和使用你系统中的设备文件。
在多数UNIX系统中,所有的设备文件都是存在于/dev目录下的。一些设备文件事直接在/dev目录下,而另外一些被组织在/dev下的子目录下。一下是一些重要的设备文件目录的列表
/dev ??????包含所有的终端,moderm,lan和打印机的设备文件。
/dev/dsk ????包含所有的块磁盘设备文件
/dev/rdsk????包含有所有的裸磁盘设备文件
/dev/rmt ????包含有所有的磁带设备文件
设备文件命名规则
默认的情况。操作系统给一个设备文件取名的时候是依据一个标准的命名原则。虽然你可以任意对一个设备文件取名。但是使用一个标准的命名规则会使用定位你的设备文件十分容易。
界面卡号
内核自动对系统中的每个设备和界面卡赋予一个号码。这个号码在ioscan -f输出的“I"这个字段显示。
磁盘,磁带或者CD ROM的设备文件名中的"C"指明这个设备连接的界面卡的数字。ioscan命令显出的所有的磁盘都有一个相同的以”C0"开头的设备文件,这是因为SCSI卡的号码为"0"。
注意每一个设备文件都有一个号码,这个号码只是操作系统专用的一个号码,并不被用来对应设备文件名。
ioscan -fun
SCSI目标地址
设备文件的“t#”部分确定这个设备文件相关联设备的SCSI目标地址。这个SCSI目标地址是通过设备自身上的跳线或者DIP开关来设置的。一个SCSI设备的硬件路径的倒数第二个字符就是这个设备的SCSI目标地址。例如,在上例的ioscan输出中,在8/12.3.0的磁盘的SCSI地址为“3”。8/12.6.0这块磁盘的SCSI目标地址为“6”。
SCSI逻辑单元号
逻辑单元号(LUN)能够被用来识别一个磁带库的机器手,或者是一个磁盘阵列的一个逻辑单元。对大多数的SCSI设备来说,LUN号都是“0”。每一个SCSI设备的LUN号出现在设备硬件路径的最后一个小数点后。
设备存取选项
设备文件名的最后一部分是这个设备文件的存取选项。磁带机设备文件名可能有多个选项。设备和设备的选项是不同的。
磁盘设备文件名
每一个磁盘和CD-ROM都有两个设备文件:
一个块设备文件在/dev/dsk下面
一个字符设备文件在/dev/rdsk下面
磁带设备文件名
磁带设备文件在/dev/rmt目录下,遵循c#t#d#[选项]的命名规则。同磁盘和CD-ROM不同,磁带驱动器通常都支持多个选项。
如何创建一个设备文件
大多数情况,你不需要创建设备文件。当第一次安装操作系统的时候。insf在进行硬件探测的时候会自动创建所有发现的设备的设备文件。每一次系统重启动,insf会创建新连接到系统的设备的设备文件。
在一一些特殊的情况下,你会需要手工创建或是修改设备文件。
自动配置
什么是自动配置
在系统启动的时候,内核会执行一系列系统初始化的工作,包括探测所有的安装在系统中的硬件。在进行硬件探测的时候,内核会确认所有的设备-总线,适配器,设备适配器-这些能够被自动配置的设备。内核绑定一个合适的驱动程序给每一个检测到的设备。
在完成系统初始化后,内核会激活init命令。init进程回读取/etc/inittab文件来激活几个系统启动的命令,包括/sbin/ioinitrc。
第一步,initrc会读取/etc/ioconfig文件的内容,然后传送设备映射信息道内核的数据结构中,io_tree。下一步,ioinit执行insf。insf会为新的设备创建设备文件。它同样会更新/etc/ioconfig文件和内核树。