当我ls -l /dev
在 Ubuntu 上运行时,我得到如下输出:
$ ls -l /dev
total 0
crw-r--r-- 1 root root 10, 235 Aug 24 16:36 autofs
drwxr-xr-x 2 root root 340 Aug 24 16:40 block
crw------- 1 root root 10, 234 Aug 24 16:36 btrfs-control
drwxr-xr-x 2 root root 2660 Aug 24 16:37 char
第 5列10, 235
显示主设备号和次设备号,指定使用哪个设备驱动程序来管理文件。
当我在 macOS 上运行相同的命令时,我得到以下输出:
% ls -l /dev
total 1
crw-rw-rw- 1 root wheel 0x16000000 14 Aug 22:16 aes_0
crw------- 1 root wheel 0x15000001 14 Aug 22:16 afsc_type5
brw------- 1 root operator 0x2000000 24 Aug 19:39 apfs-raw-device.2.0
crw------- 1 root wheel 0xb000001 14 Aug 22:16 auditpipe
我得到的不是主/次编号,而是一个十六进制数。我的问题是 -这些十六进制数代表什么?
我尝试/研究过什么
不同的文件共享相同的十六进制数。所以它似乎不代表主/次编号,因为据我所知,该组合应该是唯一的?
brw-r----- 1 root operator 0x1000001 14 Aug 22:16 disk0s1 crw-r----- 1 root operator 0x1000001 14 Aug 22:16 rdisk0s1
ChatGPT 试图说服我,十六进制数是主数和次数的打包格式,但对于如何解释它却不太清楚。如果我将 32 位分成两半,将前 16 位解释为主数,将后 16 位解释为次数,则主数似乎异常大(例如
0x1d000000
给出7424
为主数)。coreutils
在我的 Mac 上安装该包并使用ls
后,我得到了熟悉的主/次要对。$ /opt/homebrew/Cellar/coreutils/9.5/libexec/gnubin/ls -l /dev total 1 crw-rw-rw- 1 root wheel 22, 0 Aug 14 22:16 aes_0 crw------- 1 root wheel 21, 1 Aug 14 22:16 afsc_type5 brw------- 1 root operator 2, 0 Aug 24 21:02 apfs-raw-device.2.0 crw------- 1 root wheel 11, 1 Aug 14 22:16 auditpipe ... brw-r----- 1 root operator 1, 1 Aug 14 22:16 disk0s1 ... crw-r----- 1 root operator 1, 1 Aug 14 22:16 rdisk0s1
如果我们相信Apple 提供的 XNU 源代码中https://github.com/apple-oss-distributions/xnu/blob/xnu-10063.141.1/bsd/sys/types.h#L161
major()
处的、minor()
、makedev()
宏,则次要编号存储在返回的结构中字段的最低 24 位中,而主编号存储在最高 8 位中(其余,总共 32 位)。st_rdev
lstat()
这与您使用 macos 和 GNU 的 ls 获得的结果一致:
0x16000000 和 0x15000001 只是
st_rdev
十六进制的原始值。请注意,在任何情况下,输出中“设备信息”字段
ls -l
的格式都是由 POSIX定义的“实现”。虽然大多数其他系统分别显示主要和次要,但它们的格式因实现而异,有些像 GNU 一样分成两个字段,有些则不,或者不总是,有些则使用 0 填充... 这是几乎不可能可靠(和可移植)ls
解析输出的众多原因之一。ls