You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Python os.major()/os.minor()获取块设备主次设备号不正确

问题根因

调用时取错了os.stat()返回结构的字段,两个和设备号相关的字段含义完全不同:

  • st_dev:存储的是当前被查询的文件/目录所在文件系统挂载的设备ID。/dev目录本身通常由devtmpfs文件系统挂载,主设备号为0,所以查询/dev/sda文件的st_dev拿到的是devtmpfs的设备号,自然和sda本身的8:0不匹配。之前查询/etc能拿到正确主设备号8,只是因为/etc存放在sda2分区的文件系统上,刚好场景匹配,属于误打误撞的正确结果。
  • st_rdev:仅对块设备、字符设备这类特殊文件有效,存储的就是设备文件自身对应的硬件/虚拟设备的主次号,也就是需要获取的目标值。普通文件、目录的st_rdev字段没有实际意义。
正确获取方式

查询块/字符设备自身的主次号时,读取st_rdev字段传入os.major()、os.minor()即可,验证命令如下:

python3 -c "import os; dev_stat = os.stat('/dev/sda'); print(os.major(dev_stat.st_rdev), os.minor(dev_stat.st_rdev))"

执行后会正确返回8 0,和ls -l、stat命令的返回结果完全一致。

对应Shell逻辑参考

Shell的stat命令字段逻辑和Python完全对应:

  • 查询普通文件/目录时,默认输出的设备号对应st_dev字段,即文件所在文件系统的设备ID
  • 对设备文件使用stat -c%t:%T <设备路径>时,读取的就是对应st_rdev字段的主次设备号,和Python字段一一对应。

内容的提问来源于stack exchange,提问作者Hkoof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:48:13