stat命令输出中的设备编号

Ank*_*wal 13 linux

  stat test.log 
  File: `test.log'
  Size: 573         Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d  Inode: 7091301     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/   abc)   Gid: ( 1001/   abc)
Access: 2010-11-29 17:56:22.000000000 -0800
Modify: 2010-11-29 17:56:22.000000000 -0800
Change: 2010-11-29 17:56:22.000000000 -0800 
Run Code Online (Sandbox Code Playgroud)

在上面的stat o/p中,Device条目表示什么?

pax*_*blo 18

它是主要和次要设备编号组合成文件所在设备的一个值(十六进制和十进制).

对于您的示例,804h主要设备8,次要设备4.如果您df .在该文件所在的目录中运行,您将获得设备名称,例如/dev/sda1.如果您这样做ls -al /dev/sda1,它会显示设备编号.这是一个例子:

pax$ stat newfile # note device 801h, hex 801 = 2049 decimal
  File: 'newfile'
  Size: 2097152     Blocks: 4096       IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2888080     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     pax)   Gid: ( 1000/     pax)
Access: 2010-11-29 07:32:22.011271661 +0800
Modify: 2010-08-30 15:43:14.286796827 +0800
Change: 2010-08-30 15:43:14.286796827 +0800

pax$ df . # to get current device mount
Filesystem           1K-blocks Used Available Use% Mounted on
/dev/sda1            470301088 182471788 263939332  41% /

pax$ ls -al /dev/sda1 # to get major/minor = 8/1
brw-rw---- 1 root disk 8, 1 2010-11-30 07:02 /dev/sda1
Run Code Online (Sandbox Code Playgroud)

  • @Simon,主要数字和次要数字各为八位,因此,如果主要数字为“17”,次要数字为“35”,则您将得到“1123h”:“17 == 11h”和“35 == 23h”。因此,仅当次要编号小于“16 == 10h”时,“0”才位于它们之间。 (2认同)

Hua*_*Lei 14

# stat tool
  File: `tool'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d      Inode: 671689      Links: 3

# ls -l /dev/sda* 
brw-rw---- 1 root disk 8, 0 2010-08-16 14:43 /dev/sda
brw-rw---- 1 root disk 8, 1 2010-08-16 14:43 /dev/sda1
brw-rw---- 1 root disk 8, 2 2010-08-16 14:43 /dev/sda2
brw-rw---- 1 root disk 8, 5 2010-08-16 14:43 /dev/sda5
Run Code Online (Sandbox Code Playgroud)

在示例中,"工具"(801h)位于/ dev/sda1(主设备号为8,次设备号为1),这是/ dev/sda中的第一个分区.

  • 应该补充一点,`/ 2049d`是十进制的相同值. (6认同)
  • 只是为了澄清; 8只碰巧在没有转换的情况下对应,因为它低于10,否则如果你有像fe01h这样的东西,你会将"fe"从十六进制转换为dec并得到"254". (3认同)

Jan*_*cke 11

正如已经写在这里,来自man 2 stat,

st_dev字段描述了此文件所在的设备.(主要(3)和次要(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))
Run Code Online (Sandbox Code Playgroud)

你可以轻松地在Python中做些什么

>>> import os
>>> minor = int(os.stat("/lib").st_dev & 0xff)
>>> major = int(os.stat("/lib").st_dev >> 8 & 0xff)
>>> major, minor
(8, 1)
Run Code Online (Sandbox Code Playgroud)

主要ID标识设备驱动程序,次要ID对物理磁盘以及分区进行编码.对于SCSI磁盘,主要ID始终为8.第一个磁盘上的分区的次要ID介于1和15之间.第二个磁盘上的分区的次要ID介于17和31之间,依此类推.参考:https://www.mjmwired.net/kernel/Documentation/devices.txt

因此,

>>> major, minor
(8, 1)
Run Code Online (Sandbox Code Playgroud)

意思是sda1:( sd主要8 - > SCSI),a1(次要1 - >第一个磁盘,第一个分区).