![如何为未命名/非设备安装分配次设备号(主设备号 0)?](https://linux22.com/image/176500/%E5%A6%82%E4%BD%95%E4%B8%BA%E6%9C%AA%E5%91%BD%E5%90%8D%2F%E9%9D%9E%E8%AE%BE%E5%A4%87%E5%AE%89%E8%A3%85%E5%88%86%E9%85%8D%E6%AC%A1%E8%AE%BE%E5%A4%87%E5%8F%B7%EF%BC%88%E4%B8%BB%E8%AE%BE%E5%A4%87%E5%8F%B7%200%EF%BC%89%EF%BC%9F.png)
我通常了解整个主要/次要设备编号对于给定设备的工作原理(如果我离这里很远,请纠正我),以及主要设备编号本质上与一类设备相关(是块设备)或字符设备/特殊字符),而次要编号与该设备下的特定类型设备相关。根据这个数字,内核能够确定需要使用什么设备驱动程序来与该设备交互。在文件系统级别,设备号存储在 inode stat 结构中,因此当您以用户身份统计文件时,它将以 2 字节值的形式返回设备 ID,其中高字节和低字节分别代表主设备和低设备。分别为次要数字。 stat 结构有 2 个成员用于以这种形式指定设备 ID - st_dev 和 st_rdev,其中 st_dev 与相应文件所在的设备相关(对于存储设备上的普通文件,st_dev 将是主要/次要文件所在分区的设备)。
但是,如果文件是非设备挂载,或者特殊字符,或者其他什么,st_dev 中的主设备号将设置为 0,次设备号将设置为某物相反,st_rdev 可能会也可能不会填充设备类型(取决于相应的文件系统是否实现这一点)。所以我的问题是,什么在此实例中填充次设备号,它如何知道要使用什么值/为什么要使用它所使用的值?
例如
stat /etc/passwd
=> 设备:801h,未设置“设备类型”——预计主编号 8 与 SCSI 设备相关,次编号 1 与该文件的第一个分区 (sda1) 相关
stat /dev/sda1
=> 设备:6h,设备类型:8,1 -- 这里设备 (st_dev) 的主设备号为 0(这是预期的),次设备号为 6 - 为什么是 6?
stat /dev/null
-- 再次强调 6 的次要版本
stat /proc/version
-- 4 的次要版本
我缺少什么?
我意识到我在这里引用了结构,这个问题可能更好地放在堆栈溢出中,但我觉得这更像是一个低级 Linux 问题,而不是明确的开发问题 - 不过很高兴重新定位它。
答案1
在我的系统上,/proc
是6h
,并且/dev
是5h
。
快速测试:
# for x in a b c d e f g h i j; do mkdir $x; mount -t tmpfs tmpfs $x; done
# stat */.
给了中间缺失的数字(它被使用33h
了)。似乎只是动态分配,并在安装时使用第一个空闲号码。3dh
35h
/run/user/1000/gvfs
请注意,这些数字会被重用,因此至少在这种情况下,您无法可靠地使用它st_dev
来检测某个路径上的文件系统是否发生了更改。