在Linux系统中,设备号是内核用于标识和管理硬件设备的唯一标识符,由主设备号(Major Number)和次设备号(Minor Number)组成,主设备号用于标识设备类型(如磁盘、终端等),对应设备的驱动程序;次设备号用于区分同一类型下的不同设备实例(如不同磁盘分区、多个串口等),查看设备号是系统管理和驱动开发中的基础操作,本文将详细介绍多种查看设备号的方法及适用场景。
通过lsblk
命令查看块设备设备号
lsblk
(list block devices)是Linux中查看块设备信息的常用命令,以树状结构展示磁盘、分区等设备信息,其中包含主设备号(MAJ)和次设备号(MIN)。
基本用法
lsblk
常用参数
-l
:以列表形式输出(默认为树状结构);-f
:显示文件系统信息(如UUID、挂载点);-o
:指定输出列,如lsblk -o NAME,MAJ:MIN,FSTYPE,MOUNTPOINT
。
输出示例
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 50G 0 part / └─sda2 8:2 0 50G 0 part /home sr0 11:0 1 1024M 0 rom
MAJ:MIN
列直接显示主设备号和次设备号,如sda
的主设备号为8,次设备号为0;sda1
的主设备号为8,次设备号为1。
适用场景
适用于快速查看磁盘、分区、光驱等块设备的设备号,尤其适合需要同时了解设备挂载点、文件系统信息的场景。
通过blkid
命令查看块设备属性
blkid
主要用于查看块设备的属性(如UUID、文件系统类型),但也可通过解析设备路径间接获取设备号。
基本用法
blkid /dev/sda
输出示例
/dev/sda: UUID="12345678-1234-1234-1234-1234567890ab" TYPE="ext4"
虽然blkid
不直接显示设备号,但结合ls -l
可查看设备文件的设备号:
ls -l /dev/sda
输出:
brw-rw---- 1 root disk 8, 0 Jan 1 10:00 /dev/sda
8, 0
分别表示主设备号和次设备号。
适用场景
适用于需要同时获取块设备属性(如UUID)和设备号的场景,尤其当设备已挂载或格式化时。
通过fdisk
命令查看磁盘分区设备号
fdisk
是磁盘分区管理工具,可查看磁盘及分区的详细信息,包括设备号。
基本用法
sudo fdisk -l
输出示例
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors Disk model: Virtual Disk Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512/512 bytes I/O size (minimum/optimal): 512/512 bytes Disklabel type: gpt Device Start End Sectors Size Type /dev/sda1 2048 104857599 104855552 50G Linux filesystem /dev/sda2 104857600 209715199 104857600 50G Linux filesystem
结合lsblk
或ls -l
可进一步确认分区的设备号,如/dev/sda1
的主设备号与sda
相同(8),次设备号为1。
适用场景
适用于磁盘分区管理场景,尤其当需要查看分区表结构及设备号对应关系时。
通过dmesg
命令查看内核日志中的设备号
dmesg
用于显示内核环缓冲区中的消息,设备驱动加载或设备注册时,内核会输出包含设备号的信息。
基本用法
dmesg | grep "device"
输出示例
[ 0.123456] sd 0:0:0:0: [sda] 209715200 512-byte logical blocks: 107 GB/100 GiB (1000*1000*1000 bytes) [ 0.234567] sd 0:0:0:0: [sda] Attached SCSI disk [ 1.345678] device-mapper: verity: 8:0: Using device 8:1 for hash device
sd 0:0:0:0
中的0:0
对应主设备号和次设备号(需结合/proc/devices
进一步确认)。
适用场景
适用于调试驱动问题或查看设备动态注册时的设备号信息,尤其适合字符设备或驱动开发场景。
通过/proc/devices
查看已注册设备的主设备号
/proc/devices
是内核导出的虚拟文件,记录了当前已注册的字符设备和块设备的主设备号及设备名称。
查看字符设备
cat /proc/devices | grep "Character"
查看块设备
cat /proc/devices | grep "Block"
输出示例
Character devices: 4 tty 5 /dev/tty 10 misc 189 ptm Block devices: 8 loop 8 sd 11 sr 259 dm
左侧数字为主设备号,右侧为设备类型或名称,块设备sd
(磁盘)的主设备号为8,字符设备tty
(终端)的主设备号为4。
获取次设备号
/proc/devices
不显示次设备号,需结合ls -l /dev
查看具体设备文件的设备号:
ls -l /dev/ttyS0
输出:
crw-rw---- 1 root dialout 4, 64 Jan 1 10:00 /dev/ttyS0
4
是主设备号(与/proc/devices
中的tty
一致),64
是次设备号。
适用场景
适用于查看内核中已注册的设备类型及主设备号,尤其适合驱动开发时确认设备号是否被占用。
通过udevadm
查看设备详细信息
udevadm
是udev的管理工具,可查询设备的详细属性,包括设备号。
基本用法
udevadm info --query=all --name=/dev/sda
输出示例
P: /devices/pci0000:00/0000:00:07.0/virtio0/block/sda N: sda L: 0 S: disk E: DEVNAME=/dev/sda E: DEVPATH=/devices/pci0000:00/0000:00:07.0/virtio0/block/sda E: DEVTYPE=disk E: MAJOR=8 E: MINOR=0 E: SUBSYSTEM=block
MAJOR=8
和MINOR=0
分别表示主设备号和次设备号。
适用场景
适用于需要获取设备完整属性(如设备路径、子系统、设备号)的场景,尤其适合udev规则编写或设备调试。
查看字符设备号的特殊方法
字符设备通常位于/dev
目录下(如/dev/tty
、/dev/null
),可通过ls -l
直接查看设备号:
ls -l /dev/null
输出:
crw-rw-rw- 1 root root 1, 3 Jan 1 10:00 /dev/null
1
是主设备号(字符设备misc
的主设备号为1),3
是次设备号。
适用场景
适用于查看终端、串口、字符型设备文件的设备号,操作简单直观。
不同查看方法的对比总结
以下表格总结了上述方法的适用场景及特点:
方法 | 适用设备类型 | 是否显示次设备号 | 优点 | 缺点 |
---|---|---|---|---|
lsblk |
块设备 | 是 | 直观,可同时查看挂载信息 | 不适用于字符设备 |
blkid +ls -l |
块设备 | 是 | 可获取设备属性及设备号 | 需组合命令 |
fdisk -l |
块设备(分区) | 间接(需结合其他) | 可查看分区结构 | 不直接显示设备号 |
dmesg |
字符/块设备 | 间接(需解析) | 可查看动态注册信息 | 日志量大,需过滤 |
/proc/devices |
字符/块设备 | 仅主设备号 | 显示内核已注册设备类型 | 无次设备号,需结合ls -l |
udevadm |
字符/块设备 | 是 | 属性全面,适合调试 | 命令较长 |
ls -l /dev/xxx |
字符设备 | 是 | 简单直接 | 需已知设备文件路径 |
相关问答FAQs
Q1: 如何通过设备号(如主设备号8,次设备号0)定位对应的设备文件?
A: 可通过find
命令在/dev
目录下搜索设备号匹配的文件:
find /dev -type b -printf "%M %n %pn" 2>/dev/null | grep "8, 0"
或使用stat
命令查看设备文件的设备号:
find /dev -name "sda" -exec stat -c "%N %t %T" {} ;
%t
和%T
分别表示主设备号和次设备号(十六进制),可通过printf "%d %d" 0x$t 0x$T
转换为十进制。
Q2: 主设备号和次设备号在驱动开发中有什么作用?如何申请设备号?
A: 主设备号用于关联设备驱动程序(如注册驱动时指定主设备号),次设备号用于区分驱动管理的多个设备实例(如同一驱动的多个磁盘分区)。
申请设备号可通过register_chrdev()
(字符设备)或alloc_blkdev()
(块设备)动态申请,或通过mknod
手动创建设备文件(需指定主次设备号),静态分配可通过查看/proc/devices
选择未被占用的主设备号,动态分配则由内核自动分配并返回设备号。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20068.html