Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:检查两个Linux路径是否在同一个物理磁盘上_Python_Linux_Disk Partitioning - Fatal编程技术网

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

Python:检查两个Linux路径是否在同一个物理磁盘上,python,linux,disk-partitioning,Python,Linux,Disk Partitioning,目前,我使用os.stat(path).st_dev获取设备id。但是同一物理驱动器上的逻辑磁盘的id似乎不同。所以它实际上对我不起作用。是否有更好或直接的解决方案。查看十六进制输出。0x前缀后的第一个数字表示设备驱动程序: >>> hex(os.stat("/usr").st_dev) '0x801L' 这是一个“SCSI”磁盘,因为它们都有ID 8。参考文献:。驱动器ID和分区号编码在st\u dev的其余部分 由glibc实现的主ID和次ID的精确转换如下: >&

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

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

>>> hex(os.stat("/usr").st_dev)
'0x801L'
这是一个“SCSI”磁盘,因为它们都有ID 8。参考文献:。驱动器ID和分区号编码在
st\u 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次要编号编码驱动器编号和分区。也可以从中推断,第一个磁盘上的所有分区的次要ID都在1到15之间。第二个磁盘上的所有分区都有一个介于17和31之间的次要ID,依此类推

Showcase,相同的设备控制器(SCSI):

Showcase,不同的设备控制器(本例中为NFS装载):

背景: 你从中得到了什么

>>> os.stat("/usr").st_dev
2049L
对应于
stat
程序的十进制
设备
输出:

$ stat /usr
  File: `/usr'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 1308164     Links: 11
man 2 stat
(或例如),您可以阅读

st_dev字段描述此文件所在的设备。(修订) 主要(3)和次要(3)宏可能有助于分解设备ID 在这个领域。)

这些宏不是由POSIX定义的,而是由glibc实现的,如下所示:

实际的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
,第一个磁盘,第一个分区)。

嘿,很抱歉回复太晚。正如您所说,主ID对应于物理磁盘号,这个概念已经解释得很清楚了。现在我有了以下观察:-我的机器上有两个物理磁盘:--/dev/sdb/带有logicals/dev/sdb1/和/dev/sdb2/-/dev/sdc/带有logicals/dev/sdc1,但是
ls-l/dev
给了我以下信息:-
brw rw--。1根磁盘8,7月16日2 18:32 sdb brw rw----。1根磁盘8,7月17日2 18:33 sdb1 brw rw--。1根磁盘8,7月18日2 18:35 sdb2 brw rw--。1根磁盘8,32 Jul 2 18:32 sdc brw rw----。1根磁盘8,33 Jul 2 18:36 sdc1
因此,我发现它们的主要编号是相同的。我糊涂了(…我认为主要编号适用于设备驱动程序,由该设备驱动程序管理的所有设备都将具有相同的主要编号。您在此处找到了良好的参考。重要引用:“由同一设备驱动程序控制的所有设备都有一个通用的主设备编号。次设备编号用于区分不同的设备及其控制器。”所有SCSI驱动器的主编号为8。次编号基于驱动器编号,该编号乘以16,而不是像IDE驱动器那样乘以64。然后将分区编号添加到该编号中以获得次编号。“我已更新了答案。我想现在我也清楚了:-)。这很简单。实际上,最好的参考是,虽然您可能会得到一个对许多情况都有用的答案,但请注意,对于这个问题可能没有一个完全通用的答案,您可能需要重新思考您认为需要它的确切原因。例如,您可能有一个文件系统,它存在于另一个系统上的环回挂载文件中位于LVM2逻辑卷中的文件系统,该逻辑卷在几个“物理磁盘”上分条,这些“物理磁盘”实际上是8个单独硬盘驱动器上的RAID10 md设备,恰好也是硬件RAID设备。。。
$ 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% /
$ 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