gpt4 book ai didi

Python:检查两个 Linux 路径是否在同一个物理磁盘上

转载 作者:IT王子 更新时间:2023-10-29 01:09:38 25 4
gpt4 key购买 nike

现在我使用 os.stat(path).st_dev 来获取设备 ID。但是同一物理驱动器上的逻辑磁盘的 id 似乎不同。所以它实际上对我不起作用。有没有更好的或直接的解决方案。

最佳答案

查看十六进制输出。 0x 前缀后的第一个数字表示设备驱动程序:

>>> hex(os.stat("/usr").st_dev)
'0x801L'

这是一个“SCSI”磁盘,因为它们的 ID 均为 8。引用:https://www.kernel.org/doc/Documentation/devices.txt .驱动器 ID 和分区号在 st_dev 的剩余部分进行编码。

glibc实现的major ID和minor 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,依此类推。

展示,相同的设备 Controller (SCSI):

>>> int(os.stat("/lib").st_dev >> 8 & 0xff)
8
>>> int(os.stat("/usr").st_dev >> 8 & 0xff)
8

展示,不同的设备 Controller (在本例中为 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)你可以阅读

The st_dev field describes the device on which this file resides. (The major(3) and minor(3) macros may be useful to decompose the device ID in this field.)

这些宏不是由 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

Major ID 8(-> sd,SCSI设备),minor ID 1(-> a1,第一个磁盘,第一个分区)。

关于Python:检查两个 Linux 路径是否在同一个物理磁盘上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com