linux设备号详解

简介:
[原文]

linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设 备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:fifo管道、socket、软/硬连接、目录。这些东西没有主/次设备号。
$ 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)。
linux内核所能识别的所有 设备都记录在
http://www.lanana.org/docs/device-list/
而内核原码树中的 documentation/devices.txt 可能不是最新版本。
了解这些设备的最基本要求就是对 每个设备文件的含义了如指掌,下面就医列表的形式列出常见的设备文件以及相应的含义(比较偏僻的就省略了):
代 码:----------------------------------------------------------------------
主 设备号        设备类型
               次设备号=文件名          简要说明
----------------------------------------------------------------------
 0                未命名设备(例如:挂载的非设备)
                 0 = 未空设备号保留
 1 char        内存设备
                 1 = /dev/mem                直接存取物理内存
                 2 = /dev/kmem                存取经过内核虚拟之后的内存
                 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 的输出
 1 block        ram disk
                 0 = /dev/ram0                第1个 ram disk (initrd只能使用ram0)
                 1 = /dev/ram1                第2个 ram disk
                   ...
               200 = /dev/ram200        第200个 ram disk
 4 char        tty(终端)设备
                 0 = /dev/tty0                当前虚拟控制台
                 1 = /dev/tty1                第1个虚拟控制台
                   ...
                63 = /dev/tty63        第63个虚拟控制台
 4 block        如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,
               此时就使用该设备作为动态分配的主(major)设备的别名
                 0 = /dev/root
 5 char        其他 tty 设备
                 0 = /dev/tty                当前 tty 设备
                 1 = /dev/console        系统控制台
                 2 = /dev/ptmx                所有 pty master 的复用器
 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        回环设备(用一个普通的磁盘文件来模拟一个块设备)
               对回环设备的绑定由 mount(8) 或 losetup(8) 处理
                 0 = /dev/loop0        第1个回环设备
                 1 = /dev/loop1        第2个回环设备
                   ...
 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个分区
               对于linux/i386来说,分区1-4是主分区,5-15是逻辑分区。
 9 block        metadisk(raid)设备
                 0 = /dev/md0                第1组 metadisk
                 1 = /dev/md1                第2组 metadisk
                   ...
               metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。
10 char        非串口鼠标,各种杂项设备和特性
                 1 = /dev/psaux        ps/2鼠标
               131 = /dev/temperature        机器内部温度
               134 = /dev/apm_bios        apm(高级电源管理) bios
               135 = /dev/rtc                实时时钟(real time clock)
               144 = /dev/nvram        非易失配置 ram
               162 = /dev/smbus        系统管理总线(system management bus)
               164 = /dev/ipmo                intel的智能平台管理(intelligent platform management)接口
               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微代码更新接口
               186 = /dev/atomicps        进程状态数据的原子快照
               188 = /dev/smbusbios        smbus(系统管理总线) bios
               200 = /dev/net/tun        tap/tun 网络设备(tap/tun以软件的方式实现了网络设备)
                                       tap模拟了以太网帧(第二层),tun模拟了ip包(第三层)。
               202 = /dev/emd/ctl        增强型 metadisk raid (emd) 控制器
               220 = /dev/mptctl        message passing technology (mpt) control
               223 = /dev/input/uinput        用户层输入设备驱动支持
               227 = /dev/mcelog        x86_64 machine check exception driver
               228 = /dev/hpet                hpet driver
               229 = /dev/fuse                fuse(用户空间的虚拟文件系统)
               231 = /dev/snapshot        系统内存快照
               232 = /dev/kvm                基于内核的虚构机(基于amd svm和intel vt硬件虚拟技术)
11 block        scsi cd-rom 设备
                 0 = /dev/scd0                第1个 scsi cd-rom
                 1 = /dev/scd1                第2个 scsi cd-rom
                   ...
代码:
13 char        核心输入设备
                32 = /dev/input/mouse0                第1个鼠标
                33 = /dev/input/mouse1                第2个鼠标
                   ...
                62 = /dev/input/mouse30        第31个鼠标
                63 = /dev/input/mice                所有鼠标的统一
                64 = /dev/input/event0                第1个事件队列
                65 = /dev/input/event1                第2个事件队列
                   ...
                95 = /dev/input/event1                第32个事件队列
21 char        通用 scsi 设备(通常是scsi光驱)
                 0 = /dev/sg0                第1个通用 scsi 设备
                 1 = /dev/sg1                第2个通用 scsi 设备
                   ...
29 char        通用帧缓冲(frame buffer)设备
                 0 = /dev/fb0                第1个帧缓冲设备
                 1 = /dev/fb1                第2个帧缓冲设备
                   ...
                31 = /dev/fb31                第32个帧缓冲设备
30 char        ibcs-2 兼容设备
                 0 = /dev/socksys        套接字访问接口
                 1 = /dev/spx                svr3 本地 x 接口
                32 = /dev/inet/ip        网络访问接口
                33 = /dev/inet/icmp
                34 = /dev/inet/ggp
                35 = /dev/inet/ipip
                36 = /dev/inet/tcp
                37 = /dev/inet/egp
                38 = /dev/inet/pup
                39 = /dev/inet/udp
                40 = /dev/inet/idp
                41 = /dev/inet/rawip
               此外,ibcs-2 还需要下面的连接必须存在
               /dev/ip -> /dev/inet/ip
               /dev/icmp -> /dev/inet/icmp
               /dev/ggp -> /dev/inet/ggp
               /dev/ipip -> /dev/inet/ipip
               /dev/tcp -> /dev/inet/tcp
               /dev/egp -> /dev/inet/egp
               /dev/pup -> /dev/inet/pup
               /dev/udp -> /dev/inet/udp
               /dev/idp -> /dev/inet/idp
               /dev/rawip -> /dev/inet/rawip
               /dev/inet/arp -> /dev/inet/udp
               /dev/inet/rip -> /dev/inet/udp
               /dev/nfsd -> /dev/socksys
               /dev/x0r -> /dev/null
代码: 36 char        netlink 支持
                 0 = /dev/route        路由, 设备更新, kernel to user
                 3 = /dev/fwmonitor        firewall packet 复制
59 char        sf 防火墙模块
                 0 = /dev/firewall        与 sf 内核模块通信
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 磁盘(整个磁盘)
89 char        i2c 总线接口
                 0 = /dev/i2c-0        第1个 i2c 适配器
                 1 = /dev/i2c-1        第2个 i2c 适配器
                   ...
98 block        用户模式下的虚拟块设备(分区处理方式与 scsi 磁盘相同)
                 0 = /dev/ubda                第1个用户模式块设备
                16 = /dev/udbb                第2个用户模式块设备
                   ...
103 block        审计(audit)设备
                 0 = /dev/audit        审计(audit)设备
128-135 char        unix98 pty master
               这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。
136-143 char        unix98 pty slave
               这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。
               方法是通过使用适当的 mount 选项(通常是:mode=0620,gid=)
               将 devpts 文件系统挂载到 /dev/pts 目录即可。
                 0 = /dev/pts/0        第1个 unix98 pty slave
                 1 = /dev/pts/1        第2个 unix98 pty slave
                   ...
代码:153 block        enhanced metadisk raid (emd) 存储单元(分区处理方式与 scsi 磁盘相同)
                 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个存储单元
180 char        usb 字符设备
                96 = /dev/usb/hiddev0        第1个usb人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)
                   ...
               111 = /dev/usb/hiddev15        第16个usb人机界面设备
180 block        usb 块设备(u盘之类)
                 0 = /dev/uba                第1个usb 块设备
                 8 = /dev/ubb                第2个usb 块设备
                16 = /dev/ubc                第3个usb 块设备
                    ...
192 char        内核 profiling 接口
                 0 = /dev/profile        profiling 控制设备
                 1 = /dev/profile0        cpu 0 的 profiling 设备
                 2 = /dev/profile1        cpu 1 的 profiling 设备
                   ...
193 char        内核事件跟踪接口
                 0 = /dev/trace        跟踪控制设备
                 1 = /dev/trace0        cpu 0 的跟踪设备
                 2 = /dev/trace1        cpu 1 的跟踪设备
                   ...
195 char        nvidia 图形设备(比如显卡)
                 0 = /dev/nvidia0                第1个 nvidia 卡
                 1 = /dev/nvidia1                第2个 nvidia 卡
                   ...
               255 = /dev/nvidiactl                nvidia 卡控制设备
202 char        特定于cpu模式的寄存器(model-specific register,msr)
                 0 = /dev/cpu/0/msr                cpu 0 的 msrs
                 1 = /dev/cpu/1/msr                cpu 1 的 msrs
                   ...
203 char        cpu cpuid 信息
                 0 = /dev/cpu/0/cpuid                cpu 0 的 cpuid
                 1 = /dev/cpu/1/cpuid                cpu 1 的 cpuid
                   ...
代 码:===================================================================
这 部分详细说明一些应该或可能存在于 /dev 目录之外的文件。
链接最好使用与这里完全相同的格式(绝对路径或相对路径)。
究竟是使用硬 链接(hard)还是软连接(symbolic)取决于不同的设备。
       必须的链接
必须在所有的系统上都存在这些连接:
链 接                目标                链接类型        简要说明
/dev/fd                /proc/self/fd        symbolic        文件描述府
/dev/stdin        fd/0                symbolic        标准输入文件描述府
/dev/stdout        fd/1                symbolic        标准输出文件描述符
/dev/stderr        fd/2                symbolic        标准错误文件描述符
/dev/nfsd        socksys                symbolic        仅为 ibcs-2 所必须
/dev/x0r        null                symbolic        仅为 ibcs-2 所必须
[注意] /dev/x0r 是 --
       推荐的链接
推荐在所有的系统上都存在这些连接:
链接                目标                链接类型        简要说明
/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        mouse port        symbolic        当前鼠标
/dev/tape        tape device        symbolic        当前磁带
/dev/cdrom        cd-rom device        symbolic        当前cd-rom
/dev/cdwriter        cd-writer        symbolic        当前cd-writer
/dev/scanner        scanner                symbolic        当前扫描仪
/dev/modem        modem port        symbolic        当前调制解调器
/dev/root        root device        symbolic        当前根文件系统所在设备
/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 中。常见的有:
/dev/printer        socket                lpd 本地套接字
/dev/log        socket                syslog 本地套接字
/dev/gpmdata        socket                gpm 鼠标多路复用器(multiplexer)
/dev/gpmctl        socket                (lfs-livecd中出现)
/dev/initctl        fifo pipe        init 监听它并从中获取信息(用户与 init 进程交互的通道)
       挂载点
以下名称被保留用于挂载特殊的文件系统。
这 些特殊的文件系统只提供内核界面而不提供标准的设备节点。
/dev/pts        devpts                pty slave 文件系统
/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)。
===============================
你 可能会很奇怪,为什么没有 /dev/hda 这样的设备,难道不常用么?
原因在于从 2.6.19 开始,内核引入了新的ata驱动,将sata/ide硬盘同意使用 /dev/sd? 来表示了,所以 /dev/hd? 就没有存在的必要了
相关文章
|
1月前
|
Shell Linux C语言
【Shell 命令集合 设备管理 】Linux 创建设备文件 MAKEDEV命令 使用指南
【Shell 命令集合 设备管理 】Linux 创建设备文件 MAKEDEV命令 使用指南
35 0
|
1月前
|
Linux C语言 SoC
嵌入式linux总线设备驱动模型分析
嵌入式linux总线设备驱动模型分析
32 1
|
1月前
|
监控 Linux Shell
【Shell 命令集合 网络通讯 】Linux管理终端设备的登录过程 getty命令 使用指南
【Shell 命令集合 网络通讯 】Linux管理终端设备的登录过程 getty命令 使用指南
33 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 磁盘管理 】Linux losetup命令使用教程 将一个文件或设备与一个回环设备(loop device)进行关联
【Shell 命令集合 磁盘管理 】Linux losetup命令使用教程 将一个文件或设备与一个回环设备(loop device)进行关联
43 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘管理 】Linux 从远程磁带设备中删除文件或目录rmt命令使用教程
【Shell 命令集合 磁盘管理 】Linux 从远程磁带设备中删除文件或目录rmt命令使用教程
27 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 磁盘管理 】Linux 控制光驱或可移动媒体设备的弹出和关闭操作 eject命令使用教程
【Shell 命令集合 磁盘管理 】Linux 控制光驱或可移动媒体设备的弹出和关闭操作 eject命令使用教程
36 1
|
1月前
|
监控 Linux Shell
【Shell 命令集合 磁盘维护 】Linux 交换分区的特殊文件或设备 swapon命令使用指南
【Shell 命令集合 磁盘维护 】Linux 交换分区的特殊文件或设备 swapon命令使用指南
38 1
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建一个用作交换空间(swap space)的特殊文件或设备 mkswap命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建一个用作交换空间(swap space)的特殊文件或设备 mkswap命令使用教程
33 0
|
1月前
|
安全 Shell Linux
【Shell 命令集合 网络通讯 】Linux 打开终端设备 mingetty命令 使用指南
【Shell 命令集合 网络通讯 】Linux 打开终端设备 mingetty命令 使用指南
39 0
|
15天前
|
网络协议 Linux SDN
虚拟网络设备与Linux网络协议栈
在现代计算环境中,虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用🔧,特别是在容器化和虚拟化技术广泛应用的今天🌐。而Linux网络协议栈则是操作系统处理网络通信的核心💻,它支持广泛的协议和网络服务🌍,确保数据正确地在网络中传输。本文将深入分析虚拟网络设备与Linux网络协议栈的关联,揭示它们如何共同工作以支持复杂的网络需求。