Linux设备文件简介(转载)

Linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设 备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件, 又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 Documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:FIFO管道、Socket、软/硬连接、目录。这些东西没有主/次设备号。

Linux内核所能识别的所有设备都记录在
http://www.lanana.org/docs/device-list/
而内核原码树中的 Documentation/devices.txt 可能不是最新版本。

了解这些设备的最基本要求就是对每个设备文件的含义了如指掌,下面列出常见的设备文件以及相应的含义(比较偏僻的就省略了)。

  1. ----------------------------------------------------------------------
  2. 主设备号 设备类型
  3. 次设备号=文件名 简要说明
  4. ----------------------------------------------------------------------
  5. 0        未命名设备(例如:挂载的非设备)
  6. 0 = 为空设备号保留
  7. 1 char    内存设备
  8. 1 = /dev/mem        直接存取物理内存
  9. 2 = /dev/kmem        存取经过内核虚拟之后的内存
  10. 3 = /dev/null        空设备。任何写入都将被直接丢弃,任何读取都将得到EOF。
  11. 4 = /dev/port        存取 I/O 端口
  12. 5 = /dev/zero        零字节源,只能读取到无限多的零字节。
  13. 7 = /dev/full        满设备。任何写入都将失败,并把errno设为ENOSPC以表示没有剩余空间。
  14. 8 = /dev/random    随机数发生器。完全由用户的输入来产生随机数。
  15. 如果用户停止所有动作,则停止产生新的随机数。
  16. 9 = /dev/urandom    更快,但是不够安全的随机数发生器。尽可能由用户的输入来产生随机数,
  17. 如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。
  18. 10 = /dev/aio        异步 I/O 通知接口
  19. 11 = /dev/kmsg        任何对该文件的写入都将作为 printk 的输出
  20. 1 block    RAM disk
  21. 0 = /dev/ram0        第1个 RAM disk (initrd只能使用ram0)
  22. 1 = /dev/ram1        第2个 RAM disk
  23. ...
  24. 200 = /dev/ram200    第200个 RAM disk
  25. 4 char    TTY(终端)设备
  26. 0 = /dev/tty0        当前虚拟控制台
  27. 1 = /dev/tty1        第1个虚拟控制台
  28. ...
  29. 63 = /dev/tty63    第63个虚拟控制台
  30. 4 block    如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,
  31. 此时就使用该设备作为动态分配的主(major)设备的别名
  32. 0 = /dev/root
  33. 5 char    其他 TTY 设备
  34. 0 = /dev/tty        当前 TTY 设备
  35. 1 = /dev/console    系统控制台(一般是/dev/tty0)
  36. 2 = /dev/ptmx        所有 PTY master 的复用器
  37. 7 char    虚拟控制台捕捉设备(这些设备既允许读也允许写)
  38. 0 = /dev/vcs        当前虚拟控制台(vc)的文本内容
  39. 1 = /dev/vcs1        tty1 的文本内容
  40. ...
  41. 63 = /dev/vcs63    tty63 的文本内容
  42. 128 = /dev/vcsa        当前虚拟控制台(vc)的文本/属性内容
  43. 129 = /dev/vcsa1    tty1 的文本/属性内容
  44. ...
  45. 191 = /dev/vcsa63    tty63 的文本/属性内容
  46. 7 block    回环设备(用一个普通的磁盘文件来模拟一个块设备)
  47. 对回环设备的绑定由 mount(8) 或 losetup(8) 处理
  48. 0 = /dev/loop0    第1个回环设备
  49. 1 = /dev/loop1    第2个回环设备
  50. ...
  51. 8 block    SCSI 磁盘(0-15)
  52. 0 = /dev/sda        第1个 SCSI 磁盘(整个磁盘)
  53. 16 = /dev/sdb        第2个 SCSI 磁盘(整个磁盘)
  54. 32 = /dev/sdc        第3个 SCSI 磁盘(整个磁盘)
  55. ...
  56. 240 = /dev/sdp        第16个 SCSI 磁盘(整个磁盘)
  57. 分区表示方法如下(以第3个 SCSI 磁盘为例)
  58. 33 = /dev/sdc1        第1个分区
  59. 34 = /dev/sdc2        第2个分区
  60. ...
  61. 47 = /dev/sdc15    第15个分区
  62. 对于Linux/i386来说,分区1-4是主分区,5-15是逻辑分区。
  63. 9 block    Metadisk(RAID)设备
  64. 0 = /dev/md0        第1组 metadisk
  65. 1 = /dev/md1        第2组 metadisk
  66. ...
  67. metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。
  68. 10 char    非串口鼠标,各种杂项设备和特性
  69. 1 = /dev/psaux    PS/2鼠标
  70. 131 = /dev/temperature    机器内部温度
  71. 134 = /dev/apm_bios    APM(高级电源管理) BIOS
  72. 135 = /dev/rtc        实时时钟(Real Time Clock)
  73. 144 = /dev/nvram    非易失配置 RAM
  74. 162 = /dev/smbus    系统管理总线(System Management Bus)
  75. 164 = /dev/ipmo        Intel的智能平台管理(Intelligent Platform Management)接口
  76. 173 = /dev/ipmikcs    智能平台管理(Intelligent Platform Management)接口
  77. 175 = /dev/agpgart    AGP图形地址重映射表(Graphics Address Remapping Table)
  78. 182 = /dev/perfctr    性能监视计数器
  79. 183 = /dev/hwrng    通用硬件随机数发生器
  80. 184 = /dev/cpu/microcode CPU微代码更新接口
  81. 186 = /dev/atomicps    进程状态数据的原子快照
  82. 188 = /dev/smbusbios    SMBus(系统管理总线) BIOS
  83. 200 = /dev/net/tun    TAP/TUN 网络设备(TAP/TUN以软件的方式实现了网络设备)
  84. TAP模拟了以太网帧(第二层),TUN模拟了IP包(第三层)。
  85. 202 = /dev/emd/ctl    增强型 Metadisk RAID (EMD) 控制器
  86. 220 = /dev/mptctl    Message passing technology (MPT) control
  87. 223 = /dev/input/uinput    用户层输入设备驱动支持
  88. 227 = /dev/mcelog    X86_64 Machine Check Exception driver
  89. 228 = /dev/hpet        HPET driver
  90. 229 = /dev/fuse        Fuse(用户空间的虚拟文件系统)
  91. 231 = /dev/snapshot    系统内存快照
  92. 232 = /dev/kvm        基于内核的虚构机(基于AMD SVM和Intel VT硬件虚拟技术)
  93. 11 block    SCSI CD-ROM 设备
  94. 0 = /dev/scd0        第1个 SCSI CD-ROM
  95. 1 = /dev/scd1        第2个 SCSI CD-ROM
  96. ...
  97. 13 char    核心输入设备
  98. 32 = /dev/input/mouse0        第1个鼠标
  99. 33 = /dev/input/mouse1        第2个鼠标
  100. ...
  101. 62 = /dev/input/mouse30    第31个鼠标
  102. 63 = /dev/input/mice        所有鼠标的统一
  103. 64 = /dev/input/event0        第1个事件队列
  104. 65 = /dev/input/event1        第2个事件队列
  105. ...
  106. 95 = /dev/input/event1        第32个事件队列
  107. 21 char    通用 SCSI 设备(通常是SCSI光驱)
  108. 0 = /dev/sg0        第1个通用 SCSI 设备
  109. 1 = /dev/sg1        第2个通用 SCSI 设备
  110. ...
  111. 29 char    通用帧缓冲(frame buffer)设备
  112. 0 = /dev/fb0        第1个帧缓冲设备
  113. 1 = /dev/fb1        第2个帧缓冲设备
  114. ...
  115. 31 = /dev/fb31        第32个帧缓冲设备
  116. 30 char    iBCS-2 兼容设备
  117. 0 = /dev/socksys    套接字访问接口
  118. 1 = /dev/spx        SVR3 本地 X 接口
  119. 32 = /dev/inet/ip    网络访问接口
  120. 33 = /dev/inet/icmp
  121. 34 = /dev/inet/ggp
  122. 35 = /dev/inet/ipip
  123. 36 = /dev/inet/tcp
  124. 37 = /dev/inet/egp
  125. 38 = /dev/inet/pup
  126. 39 = /dev/inet/udp
  127. 40 = /dev/inet/idp
  128. 41 = /dev/inet/rawip
  129. 此外,iBCS-2 还需要下面的连接必须存在
  130. /dev/ip -> /dev/inet/ip
  131. /dev/icmp -> /dev/inet/icmp
  132. /dev/ggp -> /dev/inet/ggp
  133. /dev/ipip -> /dev/inet/ipip
  134. /dev/tcp -> /dev/inet/tcp
  135. /dev/egp -> /dev/inet/egp
  136. /dev/pup -> /dev/inet/pup
  137. /dev/udp -> /dev/inet/udp
  138. /dev/idp -> /dev/inet/idp
  139. /dev/rawip -> /dev/inet/rawip
  140. /dev/inet/arp -> /dev/inet/udp
  141. /dev/inet/rip -> /dev/inet/udp
  142. /dev/nfsd -> /dev/socksys
  143. /dev/X0R -> /dev/null
  144. 36 char    Netlink 支持
  145. 0 = /dev/route    路由, 设备更新, kernel to user
  146. 3 = /dev/fwmonitor    Firewall packet 复制
  147. 59 char    sf 防火墙模块
  148. 0 = /dev/firewall    与 sf 内核模块通信
  149. 65 block    SCSI 磁盘(16-31)
  150. 0 = /dev/sdq        第17个 SCSI 磁盘(整个磁盘)
  151. 16 = /dev/sdr        第18个 SCSI 磁盘(整个磁盘)
  152. 32 = /dev/sds        第19个 SCSI 磁盘(整个磁盘)
  153. ...
  154. 240 = /dev/sdaf        第32个 SCSI 磁盘(整个磁盘)
  155. 66 block    SCSI 磁盘(32-47)
  156. 0 = /dev/sdag        第33个 SCSI 磁盘(整个磁盘)
  157. 16 = /dev/sdah        第34个 SCSI 磁盘(整个磁盘)
  158. 32 = /dev/sdai        第35个 SCSI 磁盘(整个磁盘)
  159. ...
  160. 240 = /dev/sdav        第48个 SCSI 磁盘(整个磁盘)
  161. 89 char    I2C 总线接口
  162. 0 = /dev/i2c-0    第1个 I2C 适配器
  163. 1 = /dev/i2c-1    第2个 I2C 适配器
  164. ...
  165. 98 block    用户模式下的虚拟块设备(分区处理方式与 SCSI 磁盘相同)
  166. 0 = /dev/ubda        第1个用户模式块设备
  167. 16 = /dev/udbb        第2个用户模式块设备
  168. ...
  169. 103 block    审计(Audit)设备
  170. 0 = /dev/audit    审计(Audit)设备
  171. 128-135 char    Unix98 PTY master
  172. 这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。
  173. 136-143 char    Unix98 PTY slave
  174. 这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。
  175. 方法是通过使用适当的 mount 选项(通常是:mode=0620,gid=<"tty"组的gid>)
  176. 将 devpts 文件系统挂载到 /dev/pts 目录即可。
  177. 0 = /dev/pts/0    第1个 Unix98 PTY slave
  178. 1 = /dev/pts/1    第2个 Unix98 PTY slave
  179. ...
  180. 153 block    Enhanced Metadisk RAID (EMD) 存储单元(分区处理方式与 SCSI 磁盘相同)
  181. 0 = /dev/emd/0    第1个存储单元
  182. 1 = /dev/emd/0p1    第1个存储单元的第1个分区
  183. 2 = /dev/emd/0p2    第1个存储单元的第2个分区
  184. ...
  185. 15 = /dev/emd/0p15    第1个存储单元的第15个分区
  186. 16 = /dev/emd/1    第2个存储单元
  187. 32 = /dev/emd/2    第3个存储单元
  188. ...
  189. 240 = /dev/emd/15    第16个存储单元
  190. 180 char    USB 字符设备
  191. 96 = /dev/usb/hiddev0    第1个USB人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)
  192. ...
  193. 111 = /dev/usb/hiddev15    第16个USB人机界面设备
  194. 180 block    USB 块设备(U盘之类)
  195. 0 = /dev/uba        第1个USB 块设备
  196. 8 = /dev/ubb        第2个USB 块设备
  197. 16 = /dev/ubc        第3个USB 块设备
  198. ...
  199. 192 char    内核 profiling 接口
  200. 0 = /dev/profile    Profiling 控制设备
  201. 1 = /dev/profile0    CPU 0 的 Profiling 设备
  202. 2 = /dev/profile1    CPU 1 的 Profiling 设备
  203. ...
  204. 193 char    内核事件跟踪接口
  205. 0 = /dev/trace    跟踪控制设备
  206. 1 = /dev/trace0    CPU 0 的跟踪设备
  207. 2 = /dev/trace1    CPU 1 的跟踪设备
  208. ...
  209. 195 char    Nvidia 图形设备(比如显卡)
  210. 0 = /dev/nvidia0        第1个 Nvidia 卡
  211. 1 = /dev/nvidia1        第2个 Nvidia 卡
  212. ...
  213. 255 = /dev/nvidiactl        Nvidia 卡控制设备
  214. 202 char    特定于CPU模式的寄存器(model-specific register,MSR)
  215. 0 = /dev/cpu/0/msr        CPU 0 的 MSRs
  216. 1 = /dev/cpu/1/msr        CPU 1 的 MSRs
  217. ...
  218. 203 char    CPU CPUID 信息
  219. 0 = /dev/cpu/0/cpuid        CPU 0 的 CPUID
  220. 1 = /dev/cpu/1/cpuid        CPU 1 的 CPUID
  221. ...

有没有感到很奇怪?为什么没有 /dev/hda 这样的设备,难道不常用么?原因在于从 2.6.19
版本开始,内核引入了新的ATA驱动,将SATA/PATA硬盘统一使用 /dev/sd? 来表示了,所以 /dev/hd?
就没有存在的必要了。具体说来也就是你在编译内核的时候不要再使用"ATA/ATAPI/MFM/RLL
support"下面的驱动,而是使用更新的"Serial ATA and Parallel ATA drivers"驱动。

               链接、套接字、管道、挂载点

这部分详细说明一些应该或可能存在于 /dev 目录之外的文件。链接最好使用与这里完全相同的格式(绝对路径或相对路径)。究竟是使用硬链接(hard)还是软连接(symbolic)取决于不同的设备。

必须的链接

必须在所有的系统上都存在这些连接:

  1. 链接        目标        链接类型    简要说明
  2. /dev/fd        /proc/self/fd    symbolic    文件描述府
  3. /dev/stdin    fd/0        symbolic    标准输入文件描述府
  4. /dev/stdout    fd/1        symbolic    标准输出文件描述符
  5. /dev/stderr    fd/2        symbolic    标准错误文件描述符
  6. /dev/nfsd    socksys        symbolic    仅为 iBCS-2 所必须
  7. /dev/X0R    null        symbolic    仅为 iBCS-2 所必须
  8. [注意] /dev/X0R 是 <字母 X>-<数字 0>-<字母 R>
 推荐的链接

推荐在所有的系统上都存在这些连接:

  1. 链接        目标        链接类型    简要说明
  2. /dev/core    /proc/kcore    symbolic    为了向后兼容
  3. /dev/ramdisk    ram0        symbolic    为了向后兼容
  4. /dev/ftape    qft0        symbolic    为了向后兼容
  5. /dev/bttv0    video0        symbolic    为了向后兼容
  6. /dev/radio    radio0        symbolic    为了向后兼容
  7. /dev/i2o*    /dev/i2o/*    symbolic    为了向后兼容
  8. /dev/scd?    sr?        hard        代替 SCSI CD-ROM 的名字
 
本地定义的链接

下面的链接很可能需要根据机器的实际硬件配置创建其中的一部分甚至全部。这些链接仅仅是为了迎合习惯用法,它们既非必须也非推荐。

  1. 链接        目标        链接类型    简要说明
  2. /dev/mouse    mouse port    symbolic    当前鼠标
  3. /dev/tape    tape device    symbolic    当前磁带
  4. /dev/cdrom    CD-ROM device    symbolic    当前CD-ROM
  5. /dev/cdwriter    CD-writer    symbolic    当前CD-writer
  6. /dev/scanner    scanner        symbolic    当前扫描仪
  7. /dev/modem    modem port    symbolic    当前调制解调器
  8. /dev/root    root device    symbolic    当前根文件系统所在设备
  9. /dev/swap    swap device    symbolic    当前swap所在设备

/dev/modem 不应当用于能够同时支持呼入和呼出的modem,因为往往会导致锁文件问题。如果存在 /dev/modem ,那么它应当指向一个恰当的主 TTY 设备。

对于SCSI设备,/dev/tape 和 /dev/cdrom 应该分别指向"cooked"设备 /dev/st* 和 /dev/sr* ;而 /dev/cdwriter 和 /dev/scanner 应当分别指向恰当的 /dev/sg* 。

/dev/mouse 可以指向一个主串行 TTY 设备、一个硬件鼠标、或者一个对应鼠标驱动程序的套接字(例如 /dev/gpmdata)。

套接字和管道

持久套接字和命名管道可以存在于 /dev 中。常见的有:

  1. /dev/printer    socket        lpd 本地套接字
  2. /dev/log    socket        syslog 本地套接字
  3. /dev/gpmdata    socket        gpm 鼠标多路复用器(multiplexer)
  4. /dev/gpmctl    socket        (LFS-LiveCD中出现)
  5. /dev/initctl    fifo pipe    init 监听它并从中获取信息(用户与 init 进程交互的通道)
 
 挂载点

以下名称被保留用于挂载特殊的文件系统。这些特殊的文件系统只提供内核界面而不提供标准的设备节点。

  1. /dev/pts    devpts        PTY slave 文件系统
  2. /dev/shm    tmpfs        提供对 POSIX 共享内存的直接访问
                           终端设备

终端(或TTY)设备是一种特殊的字符设备。终端设备是可以在会话中扮演控制终端角色的任何设备,包括:虚拟控制台、串行接口(已废弃)、伪终端(PTY)。

所有的终端设备共享一个通用的功能集合:line discipline,它既包含通用的终端 line
discipline
也包含SLIP和PPP模式。所有的终端设备的命名都很相似。这部分内容将解释命名规则和各种类型的TTY(终端)的使用。需要注意的是这些命名习惯包含
了几个历史遗留包袱。其中的一些是Linux所特有的,另一些则是继承自其他系统,还有一些反映了Linux在成长过程中抛弃了原来借用自其它系统的一些
习惯。井号(#)在设备名里表示一个无前导零的十进制数。

虚拟控制台(Virtual console)和控制台设备(console device)

虚拟控制台是在系统视频监视器上全屏显示的终端。虚拟控制台被命名为编号从 /dev/tty1 开始的
/dev/tty# 。/dev/tty0 是当前虚拟控制台。/dev/tty0
用于在不能使用帧缓冲设备(/dev/fb*)的机器上存取系统视频卡,注意,不要将 /dev/console 用于此目的。/dev/console
由内核管理,系统消息将被发送到这里。单用户模式下必须允许 login 使用 /dev/console 。

串行接口

这里所说的"串行接口"是指 RS-232
串行接口和任何模拟这种接口的设备,不管是在硬件(例如调制解调器)还是在软件(例如ISDN驱动)中模拟。在linux中的每一个串行接口都有两个设备
名:主设备或呼入(callin)设备、交替设备或呼出(callout)设备。设备类型之间使用字母的大小写进行区分。比如,对于任意字母
X,"tty"设备名为 /dev/ttyX# ,而"cu"设备名则为 /dev/cux# 。由于历史原因,/dev/ttyS# 和
/dev/ttyC# 分别等价于 /dev/cua# 和 /dev/cub# 。名称 /dev/ttyQ# 和 /dev/cuq#
被保留为本地使用。

伪终端(PTY)

伪终端用于创建登陆会话或提供其它功能,比如通过 TTY line discipline
(包括SLIP或者PPP功能)来处理任意的数据生成。每一个 PTY 都有一个master端和一个slave端。按照 System
V/Unix98 的 PTY 命名方案,所有master端共享同一个 /dev/ptmx
设备节点(打开它内核将自动给出一个未分配的PTY),所有slave端都位于 /dev/pts 目录下,名为 /dev/pts/#
(内核会根据需要自动生成和删除它们)。

一旦master端被打开,相应的slave设备就可以按照与 TTY 设备完全相同的方式使用。master设备与slave设备之间通过内核进行连接,等价于拥有 TTY 功能的双向管道(pipe)。

上一篇:[BZOJ 1857] 传送带


下一篇:JS_Detail和Discipline