Номер устройства в выводе команды stat - PullRequest
12 голосов
/ 30 ноября 2010
  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 ]

18 голосов
/ 30 ноября 2010

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

Для вашего примера 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
14 голосов
/ 30 ноября 2010
# 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.

11 голосов
/ 20 июня 2013

Как уже было написано здесь, от 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 -> первый диск, первый раздел).

1 голос
/ 30 ноября 2010

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

Со страницы руководства stat (2) (man 2 stat)

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

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

0 голосов
/ 18 апреля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...