Linux设备文件/dev/*详解、查询
(2019-01-28 22:57:40)
标签:
it |
分类: Linux操作系统 |
转载:Linux 设备文件/dev/*详解、查询
物理设备,对实际存在的物理硬件的抽象。
虚拟设备,不依赖于特定的物理硬件,仅是内核自身提供的某种功能。
次设备号=文件名
简要说明
0
未命名设备(例如NFS之类非设备的挂载)
0 = 为空设备号保留
参见主设备号为144,145,146的块设备,以了解"扩展区域"(expansion area)
1 char
内存设备
1 = /dev/mem
物理内存的全镜像。可以用来直接存取物理内存。
2 = /dev/kmem
内核看到的虚拟内存的全镜像。可以用来访问内核中的内容(查看内核变量或用作rootkit之类)。
3 = /dev/null
空设备。任何写入都将被直接丢弃(但返回"成功");任何读取都将得到EOF(文件结束标志)。
4 = /dev/port
存取I/O端口
5 = /dev/zero
零流源。任何写入都将被直接丢弃(但返回"成功");任何读取都将得到无限多的二进制零流。
7 = /dev/full
满设备。任何写入都将失败,并把errno设为ENOSPC(没有剩余空间);任何读取都将得到无限多的二进制零流。
这个设备通常被用来测试程序在遇到磁盘无剩余空间错误时的行为。
8 = /dev/random
真随机数发生器。以背景噪声数据或硬件随机数发生器作为熵池,读取时会返回小于熵池噪声总数的随机字节。
若熵池空了,读操作将会被阻塞,直到收集到了足够的环境噪声为止。建议用于需要生成高强度密钥的场合。
[注意]虽然允许写入,但企图通过写入此文件来"预存"随机数是徒劳的,因为写入的数据对输出并无影响。
9 = /dev/urandom
伪随机数发生器。更快,但是不够安全。仅用于对安全性要求不高的场合。
即使熵池空了,读操作也不会被阻塞,而是把已经产生的随机数做为种子来产生新的随机数。
[注意]虽然允许写入,但企图通过写入此文件来"预存"随机数是徒劳的,因为写入的数据对输出并无影响。
10 = /dev/aio
异步I/O通知接口
11 = /dev/kmsg
任何对该文件的写入都将作为printk的输出;而读取则得到printk的输出缓冲区内容。
1 block RAM disk
[已过时,请用TMPFS]
0 = /dev/ram0
第1个 RAM disk
1 = /dev/ram1
第2个 RAM disk
...
[说明]将/dev/ram0用作initrd的做法已过时(因为它仅针对image-initrd格式),当下的主流是cpio-initrd格式。
4 char
TTY(终端)设备
0 = /dev/tty0
当前虚拟控制台
1 = /dev/tty1
第1个虚拟控制台
...
63 = /dev/tty63
第63个虚拟控制台
64 = /dev/ttyS0
第1个UART串口
...
255 = /dev/ttyS191
第192个UART串口
[说明]"UART串口"是指
8250/16450/16550 UART串行控制芯片
4 block
如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,
此时就使用该设备作为动态分配的主设备的别名,并挂载为根文件系统。
0 = /dev/root
5 char
辅助 TTY 设备
0 = /dev/tty
当前 TTY 设备
1 = /dev/console
系统控制台(一般是/dev/tty0)
2 = /dev/ptmx
所有 Unix98 PTY master 的复用器
3 = /dev/ttyprintk
内核通过此设备使用printk发送内嵌的用户消息(依赖于CONFIG_TTY_PRINTK)
64 = /dev/cua0
对应于 ttyS0 的呼出(Callout)设备
...
255 = /dev/cua191
对应于 ttyS191
的呼出(Callout)设备
7 char
虚拟控制台捕捉设备(这些设备既允许读也允许写)
0 = /dev/vcs
当前虚拟控制台(vc)的文本内容
1 = /dev/vcs1
tty1 的文本内容
...
63 = /dev/vcs63
tty63
的文本内容
128 = /dev/vcsa
当前虚拟控制台(vc)的文本/属性内容
129 = /dev/vcsa1
tty1 的文本/属性内容
...
191 = /dev/vcsa63
tty63 的文本/属性内容
7 block
回环设备(用一个普通的文件来模拟一个块设备)
0 = /dev/loop0
第1个回环设备
1 = /dev/loop1
第2个回环设备
...
[提示]对回环设备的绑定由 mount(8) 或
losetup(8) 处理
8 block SCSI
磁盘(0-15)
0 = /dev/sda
第1个 SCSI 磁盘(整个磁盘)
16 = /dev/sdb
第2个 SCSI 磁盘(整个磁盘)
32 = /dev/sdc
第3个 SCSI 磁盘(整个磁盘)
...
240 = /dev/sdp
第16个 SCSI
磁盘(整个磁盘)
分区表示方法如下(以第3个 SCSI 磁盘为例)
33 = /dev/sdc1
第1个分区
34 = /dev/sdc2
第2个分区
...
47 = /dev/sdc15
第15个分区
[提示]对于DOS分区来说,1-4是主分区,5-15是逻辑分区。但对于GPT分区来说,全是主分区,没有逻辑分区的概念。
[提示]目前的内核将SATA/PATA/IED硬盘统一使用
/dev/sd* 来表示,已经不再使用 /dev/hd* 这种过时的设备文件了。
9 block
Metadisk(RAID)设备
0 = /dev/md0
第1组 metadisk
1 = /dev/md1
第2组 metadisk
...
[说明]MD驱动(CONFIG_BLK_DEV_MD)的作用是将同一个文件系统分割到多个物理磁盘上。
10 char
各种杂项设备(含非串口鼠标)
1 = /dev/psaux
PS/2鼠标
128 = /dev/beep
能够让主板的蜂鸣器发出不同频率声音的设备(Fancy Beeper Daemon)
130 = /dev/watchdog
看门狗(CONFIG_WATCHDOG)
131 = /dev/temperature 机器内部温度
135 = /dev/rtc
实时时钟(Real
Time Clock)
143 = /dev/pciconf
PCI配置空间
144 = /dev/nvram
非易失配置RAM
151 = /dev/led
发光二极管(LED)灯
152 = /dev/kpoll
内核轮询(Poll)驱动
156 = /dev/lcd
液晶(LCD)显示屏
161 = /dev/userdma
用户空间DMA访问
162 = /dev/smbus
系统管理总线(System Management
Bus)
164 = /dev/ipmo
Intel的智能平台管理(Intelligent Platform
Management)接口
165 = /dev/vmmon
VMware虚拟机监视器
170 = /dev/thinkpad/thinkpad
Thinkpad设备
173 = /dev/ipmikcs
智能平台管理(Intelligent Platform Management)接口
175 = /dev/agpgart
AGP图形地址重映射表(Graphics Address Remapping
Table)
182 = /dev/perfctr
性能监视计数器
183 = /dev/hwrng
通用硬件随机数发生器
184 = /dev/cpu/microcode
CPU微代码更新接口(依赖于CONFIG_MICROCODE)
186 = /dev/atomicps
进程状态数据的原子快照
188 = /dev/smbusbios
SMBus(系统管理总线) BIOS
189 = /dev/ussp_ctl
用户空间串口控制器
200 = /dev/net/tun
TAP/TUN 网络设备(TAP/TUN以软件的方式实现了网络设备)
TAP模拟了以太网帧(第二层),TUN模拟了IP包(第三层)。
202 = /dev/emd/ctl
增强型 Metadisk RAID (EMD) 控制器
203 = /dev/cuse
用户空间的字符设备(Character device in user-space)
212 = /dev/watchdogs/0 第一只看门狗
213 = /dev/watchdogs/1 第二只看门狗
214 = /dev/watchdogs/2 第三只看门狗
215 = /dev/watchdogs/3 第四只看门狗
220 = /dev/mptctl
Message passing technology
(MPT) control
223 = /dev/input/uinput
用户层输入设备
224 = /dev/tpm
TCPA TPM
driver
227 = /dev/mcelog
X86_64 Machine Check Exception
driver
228 = /dev/hpet
高精度事件定时器(HPET)
229 = /dev/fuse
Fuse(用户空间的虚拟文件系统)
231 = /dev/snapshot
系统内存快照
232 = /dev/kvm
内核虚构机(基于AMD SVM和Intel VT硬件虚拟技术)
234 = /dev/btrfs-control
Btrfs文件系统控制设备
235 = /dev/autofs
Autofs控制设备
236 = /dev/mapper/control
设备映射(Device-Mapper)控制器
237 = /dev/loop-control
回环设备控制器
238 = /dev/vhost-net 用于
virtio net 的宿主内核加速器
11 block SCSI CD-ROM
设备
0 = /dev/scd0
第1个 SCSI CD-ROM
1 = /dev/scd1
第2个 SCSI CD-ROM
...
13 char
核心输入设备
0 = /dev/input/js0
第一个游戏杆(joystick)
1 = /dev/input/js1
第二个游戏杆(joystick)
...
32 = /dev/input/mouse0
第1个鼠标
33 = /dev/input/mouse1
第2个鼠标
...
63 = /dev/input/mice
所有鼠标的合体
64 = /dev/input/event0
第1个事件队列
65 = /dev/input/event1
第2个事件队列
...
14 char
OSS(Open Sound System)兼容设备[已过时]
0 = /dev/mixer
OSS混音控制器(CONFIG_SND_MIXER_OSS)
1 = /dev/sequencer
OSS音序器(CONFIG_SND_SEQUENCER_OSS)
3 = /dev/dsp
OSS数字音频波形输出设备(CONFIG_SND_PCM_OSS)
8 = /dev/sequencer2
第二OSS音序器(CONFIG_SND_SEQUENCER_OSS)
16 = /dev/mixer1
第二OSS混音控制器(CONFIG_SND_MIXER_OSS)
19 = /dev/dsp1
第二OSS数字音频波形输出设备(CONFIG_SND_PCM_OSS)
21 char
通用 SCSI 设备(通常是SCSI光驱)
0 = /dev/sg0
第1个通用 SCSI 设备
1 = /dev/sg1
第2个通用 SCSI 设备
...
[说明]许多发行版还将这些设备命名为 /dev/sga, /dev/sgb, /dev/sgc
...
29 char
通用帧缓冲(frame buffer)设备
0 = /dev/fb0
第1个帧缓冲设备
1 = /dev/fb1
第2个帧缓冲设备
...
31 = /dev/fb31
第32个帧缓冲设备
43 block 网络块设备(Network
block devices)
0 = /dev/nb0
第1个网络块设备
1 = /dev/nb1
第2个网络块设备
...
44 block 闪存转换层(Flash
Translation Layer)文件系统
0 = /dev/ftla
第1个MTD(Memory Technology Device)上的FTL
16 = /dev/ftlb
第2个MTD(Memory Technology Device)上的FTL
32 = /dev/ftlc
第3个MTD(Memory Technology Device)上的FTL
...
240 = /dev/ftlp
第16个MTD(Memory Technology Device)上的FTL
[说明]分区的表示方法与SCSI磁盘相同(最大15个)
65 block SCSI
磁盘(16-31)
0 = /dev/sdq
第17个 SCSI 磁盘(整个磁盘)
16 = /dev/sdr
第18个 SCSI 磁盘(整个磁盘)
32 = /dev/sds
第19个 SCSI 磁盘(整个磁盘)
...
240 = /dev/sdaf
第32个 SCSI
磁盘(整个磁盘)
66 block SCSI
磁盘(32-47)
0 = /dev/sdag
第33个 SCSI 磁盘(整个磁盘)
16 = /dev/sdah
第34个 SCSI 磁盘(整个磁盘)
32 = /dev/sdai
第35个 SCSI 磁盘(整个磁盘)
...
240 = /dev/sdav
第48个 SCSI
磁盘(整个磁盘)
67 block SCSI
磁盘(48-63)
0 = /dev/sdaw
第49个 SCSI 磁盘(整个磁盘)
16 = /dev/sdax
第50个 SCSI 磁盘(整个磁盘)
32 = /dev/sday
第51个 SCSI 磁盘(整个磁盘)
...
240 = /dev/sdbl
第64个 SCSI
磁盘(整个磁盘)
81 char
video4linux
0 = /dev/video0
第1个视频采集设备(摄像头)
...
63 = /dev/video63
第64个视频采集设备(摄像头)
64 = /dev/radio0
第1个无线电设备(收音机之类)
...
127 = /dev/radio63
第64个无线电设备(收音机之类)
224 = /dev/vbi0
第1个垂直中断(vertical blank interrupt)
...
255 = /dev/vbi31
第64个垂直中断(vertical blank
interrupt)
89 char
I2C 总线接口
0 = /dev/i2c-0
第1个 I2C
适配器
1 = /dev/i2c-1
第2个 I2C
适配器
...
90 char
内存技术设备(Memory Technology Device) (RAM, ROM,
Flash)
0 = /dev/mtd0
第1个 MTD (读写)
1 = /dev/mtdr0
第1个 MTD
(只读)
...
30 = /dev/mtd15
第16个 MTD
(读写)
31 = /dev/mtdr15
第16个 MTD
(只读)
93 block NAND闪存转换层(Flash
Translation Layer)文件系统
0 = /dev/nftla
第1个NFTL层
16 = /dev/nftlb
第2个NFTL层
...
240 = /dev/nftlp
第16个NFTL层
[说明]分区的表示方法与SCSI磁盘相同(最大15个)
98 block
用户模式下的虚拟块设备(分区处理方式与 SCSI 磁盘相同)
0 = /dev/ubda
第1个用户模式块设备
16 = /dev/udbb
第2个用户模式块设备
...
0 = /dev/ppp
独立于特定设备的 PPP 接口(CONFIG_PPP)
0 = /dev/evms/block_device
EVMS块设备
1 = /dev/evms/legacyname1
第1个EVMS传统设备
2 = /dev/evms/legacyname2
第2个EVMS传统设备
...
两个范围都可以相互延伸(向上/向下)一直到它们相遇
...
254 = /dev/evms/EVMSname2
第2个EVMS本地设备
255 = /dev/evms/EVMSname1
第1个EVMS本地设备
[说明]"legacyname"来源于普通的块设备名,
例如
/dev/sda5 将会变成 /dev/evms/sda5
0 = /dev/vnet0
第1个虚拟网路
1 = /dev/vnet1
第2个虚拟网路
...
这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。
0 = /dev/pts/0
第1个 Unix98 PTY slave
1 = /dev/pts/1
第2个 Unix98 PTY slave
...
这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。
方法是通过使用适当的
mount 选项(通常是:mode=0620,gid=<"tty"组的gid>)
将 devpts
文件系统挂载到 /dev/pts 目录即可。
0 = mounted device 256
255 = mounted device 511
0 = mounted device 512
255 = mounted device 767
0 = mounted device 768
255 = mounted device 1023
0 = /dev/drbd0
第1个 DRBD
设备
1 = /dev/drbd1
第2个 DRBD
设备
...
0 = /dev/emd/0
第1个存储单元
1 = /dev/emd/0p1
第1个存储单元的第1个分区
2 = /dev/emd/0p2
第1个存储单元的第2个分区
...
15 = /dev/emd/0p15
第1个存储单元的第15个分区
16 = /dev/emd/1
第2个存储单元
32 = /dev/emd/2
第3个存储单元
...
240 = /dev/emd/15
第16个存储单元
0 = /dev/mmcblk0
第1块 SD/MMC 卡
1 = /dev/mmcblk0p1
第1块 SD/MMC 卡的第1个分区
8 = /dev/mmcblk1
第2块 SD/MMC 卡
...
[说明]每个MMC块设备保留的次设备号数量由
CONFIG_MMC_BLOCK_MINORS 决定(默认=8)。
或者也可以通过内核引导参数
mmcblk.perdev_minors 进行修改。
0 = /dev/usb/lp0
第1个USB打印机
...
15 = /dev/usb/lp15
第16个USB打印机
48 = /dev/usb/scanner0
第1个USB扫描仪
...
63 = /dev/usb/scanner15
第16个USB扫描仪
96 = /dev/usb/hiddev0
第1个USB人机界面设备(鼠标/键盘/游戏杆/手写版等)
...
111 = /dev/usb/hiddev15
第16个USB人机界面设备(鼠标/键盘/游戏杆/手写版等)
132 = /dev/usb/idmouse ID
Mouse (指纹扫描仪)
0 = /dev/uba
第1个USB块设备
8 = /dev/ubb
第2个USB块设备
16 = /dev/ubc
第3个USB块设备
...
0 = /dev/profile
Profiling 控制设备
1 = /dev/profile0
CPU 0 的 Profiling 设备
2 = /dev/profile1
CPU 1 的 Profiling 设备
...
0 = /dev/trace
跟踪控制设备
1 = /dev/trace0
CPU 0
的跟踪设备
2 = /dev/trace1
CPU 1
的跟踪设备
...
0 = /dev/nvidia0
第1个 Nvidia 卡
1 = /dev/nvidia1
第2个 Nvidia 卡
...
255 = /dev/nvidiactl
Nvidia卡控制设备
0 = /dev/cpu/0/msr
CPU 0 的 MSRs
1 = /dev/cpu/1/msr
CPU 1 的 MSRs
...
0 = /dev/xvda
第1个 Xen 虚拟磁盘(整块磁盘)
16 = /dev/xvdb
第2个 Xen 虚拟磁盘(整块磁盘)
32 = /dev/xvdc
第3个 Xen 虚拟磁盘(整块磁盘)
...
240 = /dev/xvdp
第16个 Xen
虚拟磁盘(整块磁盘)
[说明]分区的表示方法与SCSI磁盘相同(最大15个)
0 = /dev/cpu/0/cpuid
CPU0的CPUID
1 = /dev/cpu/1/cpuid
CPU1的CPUID
...
0 = /dev/dri/card0
第1个显卡
1 = /dev/dri/card1
第2个显卡
...
0 =
/dev/biometric/sensor0/fingerprint
第1个设备的第1个指纹传感器
1 =
/dev/biometric/sensor0/iris
第1个设备的第1个虹膜传感器
2 =
/dev/biometric/sensor0/retina
第1个设备的第1个视网膜传感器
3 =
/dev/biometric/sensor0/voiceprint
第1个设备的第1个声波传感器
4 =
/dev/biometric/sensor0/facial
第1个设备的第1个面部传感器
5 =
/dev/biometric/sensor0/hand
第1个设备的第1个手掌传感器
...
10 =
/dev/biometric/sensor1/fingerprint
第2个设备的第1个指纹传感器
...
20 =
/dev/biometric/sensor2/fingerprint
第3个设备的第1个指纹传感器
...
设备管理是 Linux 中比较基础的知识,与内核的关系也比较密切。随着 Udev 的广泛使用,Linux
发行版的智能程度越来越高,许多 Linux 新用户对 /dev 目录下的东西变得不再熟悉,有时候遇见问题就会抓狂。
Linux 中的设备按照存取方式的不同,可以分为两种:
字符设备:无缓冲且只能顺序存取
块设备:有缓冲且可以随机(乱序)存取,而按照是否对应物理实体,也可以分为两种:
无论是哪种设备,在 /dev
目录下都有一个对应的文件(节点),并且每个设备文件都必须有主/次设备号,主设备号相同的设备是同类设备,使用同一个驱动程序(虽然目前的内核允许多个驱动共享一个主设备号,但绝大多数设备依然遵循一个驱动对应一个主设备号的原则)。可以通过
cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。
内核能够识别的所有设备都记录在原码树下的 Documentation/devices.txt 文件中。另外,在
http://www.lanana.org/docs/device-list/ 也有一份,貌似已经失去维护。
注意:在 /dev
目录下除了各种设备节点之外还通常还会存在:FIFO管道、Socket、软/硬连接、目录。这些东西并不是设备文件,因此也就没有主/次设备号。
设备文件
了解这些设备的最基本要求就是对每个设备文件的含义了如指掌,下面列出了 Linux-3.13.2
内核中常见的已注册设备及其含义(省略了生僻与罕见的设备)。
----------------------------------------------------------------------
主设备号 设备类型
----------------------------------------------------------------------
108 char 独立于特定设备的 PPP
接口
117 block 企业卷管理系统(Enterprise Volume
Management System)
119 char
VMware虚拟网路控制器
128-135 char Unix98 PTY
master
136-143 char Unix98 PTY
slave
144 block 用于更多非设备型挂载的扩展区域(Expansion
Area)#1
145 block 用于更多非设备型挂载的扩展区域(Expansion
Area)#2
146 block 用于更多非设备型挂载的扩展区域(Expansion
Area)#3
147 block DRBD(Distributed Replicated Block
Device)
153 block EMD(Enhanced Metadisk
RAID)存储单元(分区处理方式与 SCSI 磁盘相同)
179 block MMC(MultiMeidaCard)块设备
180 char USB字符设备
180 block USB块设备
192 char 内核 profiling
接口
193 char 内核事件跟踪接口
195 char Nvidia
图形设备(比如显卡)
202 char
特定于CPU模式的寄存器(model-specific register,MSR)
202 block Xen 虚拟块设备
203 char CPU CPUID
信息
226 char DRI(Direct
Rendering Infrastructure)
232 char 生物识别设备
/dev 目录中的其他内容
这部分详细说明一些应该或可能存在于 /dev
目录中的其他文件。链接最好使用与这里完全相同的格式(绝对路径或相对路径)。究竟是使用硬链接(hard)还是软连接(symbolic)取决于不同的设备,但最好与这里给出示范保持一致。
必须的链接
必须在所有的系统上都存在这些连接:
链接
目标
链接类型
简要说明
------------------------------------------------------------------------
/dev/fd
/proc/self/fd
symbolic
文件描述符
/dev/stdin
fd/0
symbolic
stdin(标准输入)文件描述府
/dev/stdout fd/1
symbolic
stdout(标准输出)文件描述府
/dev/stderr fd/2
symbolic
stderr(标准错误)文件描述府
/dev/nfsd
socksys
symbolic
仅为 iBCS-2
所必须
/dev/X0R
null
symbolic
仅为 iBCS-2
所必须
推荐的链接
推荐在所有的系统上都存在这些连接:
链接
目标
链接类型
简要说明
------------------------------------------------------------------------
/dev/core
/proc/kcore
symbolic
为了向后兼容
/dev/ramdisk ram0
symbolic
为了向后兼容
/dev/ftape
qft0
symbolic
为了向后兼容
/dev/bttv0
video0
symbolic
为了向后兼容
/dev/radio
radio0
symbolic
为了向后兼容
/dev/i2o*
/dev/i2o/*
symbolic
为了向后兼容
/dev/scd?
sr?
hard
代替 SCSI CD-ROM 的名字
本地定义的链接
下面的链接很可能需要根据机器的实际硬件配置创建其中的一部分甚至全部。这些链接仅仅是为了迎合习惯用法,它们既非必须也非推荐。
链接
目标
链接类型
简要说明
------------------------------------------------------------------------
/dev/mouse
鼠标设备
symbolic
当前鼠标设备
/dev/tape
磁带设备
symbolic
当前磁带设备
/dev/cdrom
光盘设备
symbolic
当前光盘设备
/dev/cdwriter 刻录机设备
symbolic
当前刻录机设备
/dev/scanner 扫描仪设备
symbolic
当前扫描仪设备
/dev/modem
调制解调器(猫) symbolic
当前拨号设备
/dev/root
根文件系统设备 symbolic
当前根文件系统设备
/dev/swap
swap设备
symbolic
当前swap设备
/dev/modem
不应当用于能够同时支持接入(dialin)和呼出(dialout)的猫,因为往往会导致锁文件问题。如果存在 /dev/modem
,那么它应当指向一个恰当的主 TTY 设备。
对于SCSI设备,/dev/tape 应该指向 /dev/st* ,而 /dev/cdrom 应该指向 /dev/sr*
;而 /dev/cdwriter 和 /dev/scanner 应当分别指向对应的 /dev/sg* 。
/dev/mouse 可以指向一个主串行 TTY 设备、一个硬件鼠标、或者一个对应鼠标驱动程序的套接字(例如
/dev/gpmdata )。
套接字和管道
持久套接字和命名管道可以存在于 /dev 中。常见的有:
/dev/printer socket
lpd 本地套接字
/dev/log
socket
syslog 本地套接字
/dev/gpmdata socket
gpm 鼠标多路复用器(multiplexer)
/dev/initctl fifo pipe
init
监听它并从中获取信息(用户与 init 进程交互的通道)
挂载点
以下目录被保留用于挂载特殊的文件系统。这些特殊的文件系统只提供内核接口而不提供标准的设备节点。
/dev/pts
devpts
PTY slave 文件系统
/dev/shm
tmpfs
提供对 POSIX 共享内存的直接访问
终端设备
终端(或TTY)设备是一种特殊的字符设备。终端设备是可以在会话中用作控制终端的任何设备,包括:虚拟控制台、串行接口、伪终端(PTY)。
所有终端设备共享一个通用的功能集合(线路规则),这包含常规的终端线路规程以及SLIP和PPP模式。所有的终端设备的命名都很相似。这部分内容将解释命名规则和各种类型的TTY(终端)的使用。需要注意的是这些命名习惯包含了几个历史遗留包袱。其中的一些是Linux所特有的,另一些则是继承自其他系统,还有一些反映了Linux在成长过程中抛弃了原来借用自其它系统的一些习惯。井号(#)在设备名里表示一个无前导零的十进制数。
虚拟控制台和控制台设备
虚拟控制台是在系统视频监视器上显示的全屏终端。虚拟控制台被命名为 /dev/tty# (编号从 /dev/tty1
开始)。/dev/tty0 是当前虚拟控制台。/dev/tty0 用于在不能使用帧缓冲设备(/dev/fb*)的机器上存取系统显卡,但
/dev/console
并不用于此目的。控制台设备(/dev/console)由内核直接管理,用于接收和显示系统消息,以及单用户模式登陆。
串行接口
这里所说的"串行接口"是指 RS-232
串口和任何模拟这种接口的设备,无论是硬件(如调制解调器)还是软件(如ISDN驱动)。Linux中的每一个串口都有两个设备名:主设备或呼入(callin)设备、辅设备或呼出(callout)设备。两者之间使用字母的大小写进行区分。比如,对于任意字母"X",设备名分别为
/dev/ttyX# 与 /dev/cux# 。由于历史原因,/dev/ttyS# 和 /dev/ttyC# 分别等价于
/dev/cua# 和 /dev/cub# 。名称 /dev/ttyQ# 和 /dev/cuq# 被保留为仅供本地使用。
串口的仲裁是通过锁文件(/var/lock/LCK..ttyX#)来提供的。锁文件的内容应该是以ASCII码表示的锁定进程的PID。常见的做法是安装一个诸如
/dev/modem
这样的链接来指向串口。为了确保能够正确的预先锁定这些链接,软件应该追踪符号链接并锁定所有可能的名字。此外,还建议为相应的辅设备安装对应的锁文件。为了避免死锁,建议按以下顺序获取锁,并按相反的顺序释放锁:
符号链接名,如果有(/var/lock/LCK..modem)
"tty"名(/var/lock/LCK..ttyS2)
辅设备名(/var/lock/LCK..cua2)
在符号链接出现嵌套的情况下,锁文件应按照符号链接的解析顺序来安装。
在任何情况下,应用程序都应该等待另一个程序释放锁之后,再持有这个锁。此外,试图为辅设备创建锁文件的应用程序应考虑被用于非串口的TTY端口的可能性(此时不存在辅设备)。
伪终端(PTY)
伪终端既可以用于创建登陆会话,也可以为其他需要通过TTY线路规则(包括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)。