Linux stat命令输出中的设备编号

Linux stat命令输出中的设备编号,linux,Linux,在上面的统计o/p中,设备条目表示什么?它是主要和次要设备编号,组合成文件所在设备的一个值(十六进制和十进制) 例如,804h是主设备8,次设备4。如果在该文件所在的目录中运行df.,将获得设备名称,如/dev/sda1。如果您随后执行ls-al/dev/sda1,它将显示设备编号。下面是一个例子: stat test.log File: `test.log' Size: 573 Blocks: 8 IO Block: 4096 regular

在上面的统计o/p中,设备条目表示什么?

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

例如,
804h
是主设备8,次设备4。如果在该文件所在的目录中运行
df.
,将获得设备名称,如
/dev/sda1
。如果您随后执行
ls-al/dev/sda1
,它将显示设备编号。下面是一个例子:

  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 

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

从stat(2)手册页(
man 2 stat

st_dev字段描述设备 此文件所在的位置。(修订) 大(3)和小(3)宏可能是 用于在中分解设备ID 此字段。)

从0804十六进制符号中可以得到major=8(/dev/sd*)minor=4。i、 e./dev/sda4

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

在示例中,“工具”(801h)位于
/dev/sda1
(主设备编号为8,次设备编号为1)。这是man 2 stat的
/dev/sda
中的第一个分区:

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

这些宏不是由POSIX定义的,而是在中的glibc中实现的。这些宏的C实现是:

# 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
然后,您可以轻松地在Python中执行以下操作:

导入操作系统 >>>minor=int(os.stat(“/lib”).st_dev&0xff) >>>major=int(os.stat(“/lib”).st_dev>>8&0xff) >>>大调,小调 (8, 1) 主ID标识设备驱动程序,次ID编码物理磁盘和分区。对于SCSI磁盘,主ID始终为8。第一个磁盘上的分区的次要ID介于1和15之间。第二个磁盘上的分区的次要ID介于17和31之间,依此类推

参考:

因此,

#define major(dev) ((int)(((unsigned int) (dev) >> 8) & 0xff))
#define minor(dev) ((int)((dev) & 0xff))

sda1
sd
(专业8→ SCSI),
a1
(小调1→ 第一个磁盘,第一个分区)。

主/次编号=>驱动器/分区的映射不能保证为真,但内核没有理由更改它,因此您可以依赖它it@PaulBetts,如果主/次映射不正确,那么这对
stat
o/p和其他方面有什么影响。请详细说明您的意见好吗?因此,将“主要/次要”视为“驱动程序/设备实例”,它实际上与PnP/内核驱动程序设备映射有关,而不是与经典硬盘设置的任何存储子系统有关,我们不能说主ID对应于“物理磁盘”,而次ID对应于分区吗?这将记录在哪里?只是为了澄清;8只会在没有转换的情况下对应,因为它低于10,否则如果你有像fe01h这样的东西,你会将“fe”从十六进制转换为dec,得到“254”。应该加上,
/2049d
是相同的十进制值。另外:如果你装载整个磁盘,没有分区表,那么,
sda
会是
800h
吗?了解数字8和1在此上下文中的含义肯定很有趣。似乎设备编号可能并不总是2字节。我正在运行ZFSOnLinux,我只看到了
16h/22d
,这实际上并没有告诉我任何事情,因为我找不到22个主设备或22个次设备。这是否意味着当设备值为十六进制格式时,主版本和次版本总是用0(零)分隔?Simon,主版本和次版本的数字都是8位,如果主修科目为
17
,辅修科目为
35
,您将获得
1123h
17==11h
35==23h
。因此,只有当次数小于
16==10h
时,
0
才在它们之间。
>>> major, minor
(8, 1)