file /dev/*
将一堆文件的描述打印为“块特殊(M/N)”和“字符特殊(M/N)”,其中M和N是数字。例如:
$ file /dev/null
/dev/null: character special (1/3)
man file
似乎没有记录这些,但模糊地引用了man stat
,这似乎将这些称为主要和次要设备类型。apropos 'device type'
什么也没找到。那么这些数字意味着什么呢?
答案1
Unix 上的设备具有类型(例如字符或块)、主设备号(通常指驱动程序)和次设备号(通常指实例)。
因此,例如:
% ls -l /dev/vda
brw-rw---- 1 root disk 253, 0 Feb 3 09:09 /dev/vda
这是一个块设备,主设备 253,次设备 0。
如果我们看一下,/proc/devices
我们会发现它以类似的内容结尾
Block devices:
2 fd
259 blkext
9 md
253 virtblk
254 mdp
所以我们可以看到253是“virtblk”。这是有道理的,因为这是一个带有虚拟磁盘的虚拟机!
对于该驱动程序来说,次设备号指的是设备中的块设备和分区
% ls -l /dev/vd*
brw-rw---- 1 root disk 253, 0 Feb 3 09:09 /dev/vda
brw-rw---- 1 root disk 253, 1 Feb 3 09:09 /dev/vda1
brw-rw---- 1 root disk 253, 2 Feb 3 09:09 /dev/vda2
brw-rw---- 1 root disk 253, 3 Feb 3 09:09 /dev/vda3
brw-rw---- 1 root disk 253, 16 Feb 3 09:09 /dev/vdb
brw-rw---- 1 root disk 253, 32 Feb 3 09:09 /dev/vdc
brw-rw---- 1 root disk 253, 33 Feb 3 09:09 /dev/vdc1
有一些特殊的驱动程序不涉及“真实”硬件。例如
% ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Feb 3 09:09 /dev/null
这是一个字符设备,主要 1,次要 3。 /proc/devices
告诉我们驱动程序 1
1 mem
我们可以看到这个“mem”驱动程序也处理一些其他设备
% ls -l /dev | grep ' 1, '
crw-rw-rw- 1 root root 1, 7 Feb 3 09:09 full
crw-r--r-- 1 root root 1, 11 Feb 3 09:09 kmsg
crw-r----- 1 root kmem 1, 1 Feb 3 09:09 mem
crw-rw-rw- 1 root root 1, 3 Feb 3 09:09 null
crw------- 1 root root 1, 12 Feb 3 09:09 oldmem
crw-r----- 1 root kmem 1, 4 Feb 3 09:09 port
crw-rw-rw- 1 root root 1, 8 Feb 3 09:09 random
crw-rw-rw- 1 root root 1, 9 Feb 3 09:09 urandom
crw-rw-rw- 1 root root 1, 5 Feb 3 09:09 zero
答案2
每个设备节点的类型(块或字符)和数字(称为主设备号和次设备号)用作内核的标识符。
在 Linux 上,维护了设备的规范列表及其功能的简要说明在内核中。您可以在那里看到主编号通常标识驱动程序(例如TTY 设备驱动程序)和次要编号标识该驱动程序管理的设备。