主,副号码是唯一的吗


11

这个major, minor数字是唯一的吗?

我们有任何引用和参考吗?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 

maj是硬件,minor是主要硬件的子部门
Kiwy 2014年

Answers:


20

Linux编程接口 §14.1

每个设备文件都有一个主要ID号和一个次要ID号。主ID标识设备的一般类别,内核使用它来查找此类设备的适当驱动程序。次要ID唯一标识通用类别中的特定设备。ls -l命令显示设备文件的主要和次要ID。

[...]

每个设备驱动程序都使用特定的主要设备ID注册其关联,并且该关联提供了设备专用文件和设备之间的连接。当内核查找设备驱动程序时,设备文件的名称无关紧要。

另请参见本旧版(2001)Linux设备驱动程序(2e)一章

即,目的是为每种设备类型提供main:minor到device:instance的唯一映射。严格来说,您可以有两个不同的设备,它们具有相同的主音:次音,只要一个是char而一个是block:

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

在Linux上,任何时候任何一个系统上的main:minor编号对于每种类型的设备都是唯一的。但是,数字可能会随着时间而变化,并且在不同的Linux系统(甚至相同的发行版,内核和硬件)上不必相同。请注意,字符设备和块设备具有不同的编号空间,例如,将主块1分配给RAM磁盘,将主块1分配给一组包含空值和零的内核设备。

从历史上看,设备专业(通常)是通过注册表静态分配(尽管仍未维护,但仍在内核源中存在Documentation/devices.txt)。如今,许多设备是动态分配的,这是由udev管理的,并且可以在中查看映射/proc/devices。固定设备仍然存在incude/uapi/linux/major.h(最近从中移出include/major.h

现在,尽管main:minor组合唯一地标识了特定的设备实例,但是没有什么可以阻止您创建引用同一设备的多个设备节点(文件)。它们甚至不必在其中创建/dev(但它们必须在支持创建设备节点的文件系统上,并且未随该nodev选件挂载)。

通常的用途是在chroot中创建重复的零,空和随机设备:

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

名称只是别名,内核并不关心大多数名称或位置,它关心的是主要数字,因此它可以选择正确的驱动程序,而驱动程序(通常)关心的是次要数字,因此可以选择正确的实例。

大多数名称只是约定俗成的(尽管有些是由POSIX定义的)。另请注意,一台设备可以注册多个主号码,请在sd中检查驱动程序/proc/devices;驱动程序模块名称(.ko)不必与设备名称相同,也不必与中的设备节点相同/dev,并且单个驱动程序模块可以管理多个逻辑/物理设备或设备名称。


回顾一下:您可能有两个或多个设备节点(在/dev/其他地方或其他地方),它们具有相同的major:minor数字,但是如果它们是相同的类型,则它们指的是同一设备。您可以拥有一个可以处理多个主要实例的驱动程序,但是在内核和该驱动程序内部,对于每种类型(字符或块),主要:次要编号用于表示特定的设备(主要)和特定的实例(次要)。

您不能有两个具有相同类型和主要:次要类型的设备节点,并且不能期望它们访问两个不同的逻辑或物理设备。当访问设备时,内核根据类型和主设备号(而不是基于设备节点名称)选择一个驱动程序,按照惯例,次设备号确定性地选择特定的实例或子功能。


更新 在Poul-Henning Kamp的2002年BSDCon演讲中可以找到一些有趣的历史和* BSD观点:https : //www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

如果您将时间带回到1978年(由阿尔卡特朗讯提供,贝尔系统技术期刊, 1978年7月至8月),那么“ Unix时间共享系统 ”就可以清楚地说明它(p1937):

设备的特征是主要设备号,次要设备号和类别(块或字符)。对于每个类,设备驱动程序中都有一系列入口点。当调用特定设备驱动程序的代码时,主要设备号用于索引数组。次设备号作为参数传递给设备驱动程序。次要号除了由驾驶员赋予它的意义外没有其他意义。通常,驱动程序使用次设备号访问几个相同的物理设备之一。


因此,我们是否可以拥有两个具有相同对或MAJ:Min编号的设备
Dipak Ingole 2014年

1
是的,有限制。更新。
ms.spuratic 2014年

2

通过创建设备文件时mknode,将提供majorminor数字。这些就是Linux识别与设备文件关联的基础硬件设备的方式。在大多数情况下,它们的major编号标识驱动程序,而minor区分驱动程序控制的不同设备。

因此,每个设备的编号必须唯一,否则将无法为所有设备创建正确的设备文件。


0

不,在Linux上它们并不总是唯一的。

Linux正在使用devpts虚拟文件系统提供伪终端(pty),并且该虚拟文件系统可以在不同的位置多次安装,这在设置chroot或命名空间容器时非常实用。虽然major:minor元组在devpts文件系统实例上是唯一的,但在运行的系统上不是唯一的:

# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

在上面的示例中,该script(1)命令创建一个伪终端并在其中运行外壳程序。很明显,第一个script过程创建的伪终端与第二个过程创建的伪终端不同,但是它们具有相同的名称和主要,次要数字。

为了唯一地标识伪device:inode终端,您需要使用它们的元组,或者将设备编号(devpts文件系统的)与它们的组合major:minor。问题是/proc/PID/stat(第7 proc(5)页,请参见联机帮助页;这是诸如此类的工具lsofps从中获取其信息的工具)的“ tty”字段仅包含st_rdevtty的(包装好的major:minor);如果那是一个pty奴隶,则没有devpts提供它的文件系统的指示。相同的问题会影响TIOCGDEVioctl 可获得的设备号。

AFAICS没有可靠的方法来识别Linux上进程的控制终端。否则将提出更正和建议!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.