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

时间:2013-06-20 09:52:16

标签: python linux disk-partitioning

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

1 个答案:

答案 0 :(得分:6)

查看十六进制输出。 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

展示,不同的设备控制器(在这种情况下为NFS安装):

>>> int(os.stat("/home/*****").st_dev >> 8 & 0xff)
0

<强>背景

你从中获得了什么。

>>> os.stat("/usr").st_dev
2049L

对应Device程序的小数stat输出:

$ 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( - &gt; sd,SCSI设备),次要1( - &gt; a1,第一个磁盘,第一个分区。