stat命令输出中的设备编号

时间:2010-11-30 01:58:49

标签: 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 

在上面的统计信息中, 设备 条目表示什么?

5 个答案:

答案 0 :(得分:17)

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

对于您的示例,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

答案 1 :(得分: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

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

答案 2 :(得分:11)

正如此处所写,来自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

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

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

因此,

>>> major, minor
(8, 1)

表示sda1sd(主要8 - > SCSI),a1(次要1 - >第一个磁盘,第一个分区)。

答案 3 :(得分:1)

stat命令只是stat()系统调用的前端。

来自stat(2)手册页(man 2 stat

  

st_dev字段描述了设备   该文件所在的位置。 (该   major(3)和minor(3)宏可能是   用于分解设备ID   这个领域。)

从0804十六进制表示法得到major = 8(/ dev / sd *)minor = 4。即/ dev / sda4

答案 4 :(得分:-4)

在此804h中指定主要编号,即关联正确的驱动程序代码,而2052d是次要编号,将每个驱动程序映射到特定设备实例。 MAJOR(),MINOR()宏可用于将设备主要和次要编号组合在一起,形成设备编号。