查看十六进制输出。 0x 前缀后的第一个数字表示设备驱动程序:
>>> hex(os.stat("/usr").st_dev)
'0x801L'
这是一个“SCSI”磁盘,因为它们的 ID 都是 8。参考:https://www.kernel.org/doc/Documentation/devices.txt。驱动器 ID 和分区号编码在 st_dev 的其余部分。
glibc 实现的主要 ID 和次要 ID 的确切转换如下:
>>> minor = int(os.stat("/lib").st_dev & 0xff)
>>> major = int(os.stat("/lib").st_dev >> 8 & 0xff)
>>> major, minor
(8, 1)
表示主编号 8(SCSI 主机适配器),次编号 1。次编号编码驱动器编号以及分区。从here 也可以推断,第一个磁盘上的所有分区都有一个介于 1 和 15 之间的次要 ID。第二个磁盘上的所有分区都有一个介于 17 和 31 之间的次要 ID,依此类推。
展示柜,相同的设备控制器 (SCSI):
>>> int(os.stat("/lib").st_dev >> 8 & 0xff)
8
>>> int(os.stat("/usr").st_dev >> 8 & 0xff)
8
Showcase,不同的设备控制器(本例为NFS挂载):
>>> int(os.stat("/home/*****").st_dev >> 8 & 0xff)
0
背景:
你从中得到什么,例如
>>> os.stat("/usr").st_dev
2049L
对应于stat程序的十进制Device输出:
$ stat /usr
File: `/usr'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1308164 Links: 11
然后您可以从man 2 stat(或例如http://linux.die.net/man/2/stat)阅读
st_dev 字段描述了该文件所在的设备。 (这
major(3) 和 minor(3) 宏可能有助于分解设备 ID
在这个领域。)
这些宏不是由 POSIX 定义的,而是在 glibc 中实现的,如下所示:
https://github.com/jeremie-koenig/glibc/blob/master-beware-rebase/sysdeps/generic/sys/sysmacros.h
实际的C实现是:
#define major(dev) ((int)(((unsigned int) (dev) >> 8) & 0xff))
#define minor(dev) ((int)((dev) & 0xff))
正如我在上面所做的那样,这可以很容易地翻译成 Python。对于这些宏,很明显十六进制表示法比十进制表示法更直观:
>>> hex(os.stat("/usr").st_dev)
'0x801L'
从这里您已经可以看到 8 和 1 分别是主要设备 ID 和次要设备 ID。我们也可以这样检查:
$ pwd
/usr
$ df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/disk/by-uuid/cba70a49-04a7-40a6-8a53-465f817e51cd 29G 8.6G 19G 32% /
这是磁盘,其实对应的是/dev/sda1:
$ ls -al /dev/disk/by-uuid/cba70a49-04a7-40a6-8a53-465f817e51cd
0 lrwxrwxrwx 1 root root 10 May 6 16:33 /dev/disk/by-uuid/cba70a49-04a7-40a6-8a53-465f817e51cd -> ../../sda1
主要 ID 8(-> sd,SCSI 设备),次要 ID 1(-> a1,第一个磁盘,第一个分区)。