Номер устройства в выводе команды stat

  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 

В статусе o/p выше, что означает запись Устройство?

Ответ 1

# 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

В примере "инструмент" (801h) находится в /dev/sda 1 (основной номер устройства - 8, младший номер устройства - 1), этот первый раздел в/dev/sda.

Ответ 2

Это номер основного и младшего устройства, объединенный в одно значение (в шестнадцатеричном и десятичном) устройства, на котором находится файл.

В вашем примере 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

Ответ 3

Как уже было написано здесь, из man 2 stat,

Поле st_dev описывает устройство, на котором находится этот файл. (The мажорные (3) и второстепенные (3) макросы могут быть полезны для разложения идентификатора устройства в этом поле.)

Эти макросы не определены 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)

Основной идентификатор идентифицирует драйвер устройства, младший идентификатор кодирует физический диск, а также раздел. В случае дисков SCSI основной идентификатор всегда 8. Разделы на первом диске имеют младший идентификатор от 1 до 15. Разделы на втором диске имеют младший идентификатор от 17 до 31 и т.д. Ссылка: https://www.mjmwired.net/kernel/Documentation/devices.txt

Следовательно,

>>> major, minor
(8, 1)

означает sda1: sd (основной 8 → SCSI), a1 (младший 1 → первый диск, первый раздел).

Ответ 4

Команда stat - это просто интерфейс системного вызова stat().

Из справочной страницы stat (2) (man 2 stat)

Поле st_dev описывает устройство на котором находится этот файл. (The основные (3) и второстепенные (3) макросы могут быть полезно разложить идентификатор устройства в это поле.)

Из шестнадцатеричной нотации 0804 вы получаете major = 8 (/dev/sd *) minor = 4. то есть/dev/sda4

Ответ 5

В этом 804h указывается основное число, то есть связать правильный код драйвера, а 2052d - это небольшое число, сопоставляющее каждый драйвер с конкретным экземпляром устройства. MAJOR(), MINOR() будут использоваться для получения основного и младшего числа устройств вместе, они образуют номер устройства.