inode

INODE(7)                 Руководство программиста Linux                 INODE(7)



ИМЯ
       inode - описание файловой иноды

ОПИСАНИЕ
       Для каждого файла существует инода (inode), содержащая метаданные файла.
       Приложение может получить эти метаданные с помощью stat(2) (и подобных
       вызовов), который возвращает структуру stat, и statx(2), который
       возвращает структуру statx.

       В следующем списке показана информация, которую, обычно, можно найти или
       которая относится к файловой иноде в полях соответствующей структуры,
       возвращаемой stat(2) и statx(2):

       Устройство, на котором находится инода
              stat.st_dev; statx.stx_dev_minor и statx.stx_dev_major

              Каждая инода (а также связанный с ней файл) располагается в
              файловой системе, которая находится на устройстве. Это устройство
              опознаётся по комбинации своих основного (определяет общий класс
              устройства) и вспомогательного (определяет конкретный экземпляр в
              общем классе) идентификаторов.

       Номер иноды
              stat.st_ino; statx.stx_ino

              Каждый файл в файловой системе имеет уникальный номер иноды. Для
              номеров инод гарантируется уникальность только внутри файловой
              системы (т. е., одинаковые номера инод могут использоваться в
              разных файловых системах, из-за чего жёсткие ссылки не могут
              пересекать границы файловой системы). В этом поле содержится номер
              иноды файла.

       Тип файла и режим
              stat.st_mode; statx.stx_mode

              Описание типа файла и режим приведены ниже.

       Счётчик ссылок
              stat.st_nlink; statx.stx_nlink

              Это поле содержит количество жёстких ссылок на файл.
              Дополнительные ссылки на существующий файл созданы с помощью
              link(2).

       Пользовательский идентификатор
              st_uid stat.st_uid; statx.stx_uid

              В этом поле содержится идентификатор пользователя, которому
              принадлежит файл. При создании файла идентификатору пользователя
              файла присваивается идентификатор эффективного пользователя
              создающего процесса. Идентификатор пользователя файла можно
              изменить с помощью chown(2).

       Идентификатор группы
              stat.st_gid; statx.stx_gid

              В этом поле содержится идентификатор группы, которой принадлежит
              файл. При создании файла идентификатору группы файла присваивается
              идентификатор группы родительского каталога или  идентификатор
              эффективной группы создающего процесса, в зависимости от наличия
              бита set-group-ID на родительском каталоге (смотрите ниже).
              Идентификатор группы файла можно изменить с помощью chown(2).

       Устройство, представляемое этой инодой
              stat.st_rdev; statx.stx_rdev_minor и statx.stx_rdev_major

              Если этот файл (инода) представляет устройство, то инода хранит
              основной и вспомогательный идентификатор этого устройства.

       Размер файла
              stat.st_size; statx.stx_size

              Размер файла (если он обычный или является символьной ссылкой) в
              байтах. Размер символьной ссылки равен длине пути файла, на
              который она ссылается, без конечного нулевого байта.

       Предпочтительный размер блока для ввода/вывода
              stat.st_blksize; statx.stx_blksize

              «Предпочтительный» размер блока для эффективного ввода/вывода в
              файловой системе (запись в файл более мелкими порциями может
              привести к неэффективному чтению/изменению/повторной записи).

       Количество блоков, выделенных файлу
              stat.st_blocks; statx.stx_size

              Количество блоков (по 512 байт), выделенных для файла (может быть
              меньше, чем st_size/512, когда в файле есть пропуски (holes)).

              В стандарте POSIX.1 отмечено, что размер единиц значения st_blocks
              структуры stat стандартом не определяется. Во многих реализациях
              он равен 512 байт; в некоторых системах используются другой —
              1024. Кроме этого, размер единиц может отличаться для разных
              файловых систем.

       Метка времени последнего доступа (atime)
              stat.st_atime; statx.stx_atime

              Метка времени последнего доступ к файлу. Изменяется при доступе к
              файлу, например, при выполнении execve(2), mknod(2), pipe(2),
              utime(2) и read(2) (при чтении ненулевого количества байт). Другие
              интерфейсы, например mmap(2), могут изменять метку, но могут и не
              делать этого.

              Некоторые типы файловых систем позволяют выполнить монтирование
              таким образом, что факт доступа к файлу или каталогу не вызовет
              изменение метки atime (смотрите описание noatime, nodiratime и
              relatime в mount(8) и связанную с ними информацию в mount(2)).
              Также, поле метка atime не обновляется, если файл открыт с флагом
              O_NOATIME; смотрите open(2).

       Метка времени создания файла (btime)
              (не возвращается в структуре stat); statx.stx_btime

              Метка времени создания файла. Устанавливается при создании файла и
              после этого не изменяется.

              Метка btime отсутствовала в системах UNIX и в настоящее время не
              поддерживается в большинстве файловых систем Linux.

       Метка времени последнего изменения (mtime)
              stat.st_mtime; statx.stx_mtime

              Метка времени последнего изменения файла. Изменяется при изменении
              файла, например, при выполнении mknod(2), truncate(2), utime(2) и
              write(2) (если записано не менее одного байта). Кроме того, у
              каталога метка mtime изменяется при создании и удалении файлов в
              этом каталоге. Метка mtime не изменяется при изменении владельца,
              группы, количества жёстких ссылок или режима доступа.

       Метка времени последнего изменения состояния (ctime)
              stat.st_ctime; statx.stx_ctime

              Метка времени последнего изменения состояния файла. Изменяется при
              записи или установке информации иноды (т. е., владельце, группе,
              количестве ссылок, режиме и т. д.).

       За начальное значение полей меток времени принимается Эпоха, 1970-01-02
       00:00:00 +0000, UTC (смотрите time(7)).

       Метки времени наносекундной точности поддерживаются в XFS, JFS, Btrfs и
       ext4 (начиная с Linux 2.6.23). Метки времени наносекундной точности не
       поддерживаются в ext2, ext3 и Reiserfs. Для возвращать метки времени
       наносекундной точности поля меток времени в структурах stat и statx
       определены как структуры, включающие наносекундную составляющую.
       Подробности приведены в stat(2) и statx(2). Для файловых систем, не
       поддерживающих субсекундные метки времени, наносекундные поля в
       возвращаемых структурах stat и statx имеют значение 0.

   Тип файла и режим
       Поле stat.st_mode statx(2) — поле statx.stx_mode ) содержит тип файл и
       режим.

       В POSIX относятся к битам stat.st_mode равным маске S_IFMT (смотрите
       ниже) как к типу файла (file type), 12 битам, соответствующим маске
       07777, как к битам режима файла (file mode bits) и наименее значащим 9
       битам (0777) как к битам доступа к файлу (file permission bits).

       Следующие значения масок определены для типа файла:

           S_IFMT     0170000   битовая маска битового поля для типа файла

           S_IFSOCK   0140000   сокет
           S_IFLNK    0120000   символьная ссылка
           S_IFREG    0100000   обычный файл
           S_IFBLK    0060000   блочное устройство
           S_IFDIR    0040000   каталог
           S_IFCHR    0020000   символьное устройство
           S_IFIFO    0010000   FIFO

       Таким образом, чтобы проверить обычный файл (например) на возможность
       записи:

           stat(pathname, &sb);
           if ((sb.st_mode & S_IFMT) == S_IFREG) {
               /* обработка обычного файла */
           }

       Так как приведённое выше тестирование имеет общий вид, в POSIX определены
       дополнительные макросы, которые позволяют тестировать тип файла в st_mode
       более краткой записью:

           S_ISREG(m)  обычный файл?

           S_ISDIR(m)  каталог?

           S_ISCHR(m)  символьное устройство?

           S_ISBLK(m)  блочное устройство?

           S_ISFIFO(m) FIFO (именованный канал)?

           S_ISLNK(m)  символьная ссылка? (нет в POSIX.1-1996.)

           S_ISSOCK(m) сокет? (нет в POSIX.1-1996.)

       The preceding code snippet could thus be rewritten as:

           stat(pathname, &sb);
           if (S_ISREG(sb.st_mode)) {
               /* обработка обычного файла */
           }

       Определений большинства показанных ранее макросов тестирования типа файла
       доступно, если определён любой из следующих макросов тестирования
       свойств: _BSD_SOURCE (в glibc 2.19 и старее), _SVID_SOURCE (в glibc 2.19
       и старее) или _DEFAULT_SOURCE (в glibc 2.20 и новее). Также, определение
       всех макросов, за исключением S_IFSOCK и S_ISSOCK(), доступны при наличии
       _XOPEN_SOURCE.

       Определение S_IFSOCK также можно получить определив _XOPEN_SOURCE со
       значением 500 или более или (начиная с glibc 2.24) определением
       _XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED одновременно.

       Определение S_ISSOCK() доступно, если определён любой из следующих
       макросов тестирования свойств: _BSD_SOURCE (в glibc 2.19 и старее),
       _DEFAULT_SOURCE (в glibc 2.20 и новее), _XOPEN_SOURCE со значением 500
       или более или _POSIX_C_SOURCE со значением 200112L или более или (начиная
       с glibc 2.24) _XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED одновременно.

       Следующие значения масок определены для компонента режима доступа к файлу
       в поле st_mode:

           S_ISUID     04000   бит set-user-ID (смотрите execve(2))
           S_ISGID     02000   бит set-group-ID (смотрите далее)
           S_ISVTX     01000   закрепляющий бит (смотрите далее)

           S_IRWXU     00700   владелец имеет права на чтение, запись и выполнение
           S_IRUSR     00400   владелец имеет право на чтение
           S_IWUSR     00200   владелец имеет право на запись
           S_IXUSR     00100   владелец имеет право на выполнение

           S_IRWXG     00070   группа имеет права на чтение, запись и выполнение
           S_IRGRP     00040   имеет право на чтение
           S_IWGRP     00020   группа имеет право на запись
           S_IXGRP     00010   группа имеет право на выполнение

           S_IRWXO     00007   все остальные (вне группы) имеют права на чтение,
                               запись и выполнение
           S_IROTH     00004   все остальные имеют право на чтение
           S_IWOTH     00002   все остальные имеют право на запись
           S_IXOTH     00001   все остальные имеют право на выполнение

       Бит set-group-ID (S_ISGID) имеет несколько специальных применений. Для
       каталога он указывает, что используется семантика BSD: файлы, создаваемые
       в каталоге, наследуют ID группы этого каталога, а не фактический ID
       группы создающего процесса, а для подкаталогов данного каталога также
       будет установлен бит S_ISGID. Для исполняемого файла бит set-group-ID
       заставляет изменить фактический ID группы процесса, который выполняет
       файл, согласно правилам, описанным в execve(2). Если файл не имеет бита
       выполнения группой (S_IXGRP), то бит set-group-ID означает обязательную
       (mandatory) блокировку файла/записей.

       Закрепляющий (sticky) бит (S_ISVTX) на каталоге означает, что файлы в
       этом каталоге могут быть удалены или переименованы только владельцем
       файла, владельцем каталога и привилегированным процессом.

СООТВЕТСТВИЕ СТАНДАРТАМ
       Если вам нужно получить определение типа blkcnt_t или blksize_t из
       <sys/stat.h>, то определите _XOPEN_SOURCE со значением 500 или больше (до
       включения каких-либо заголовочных файлов).

       В POSIX.1-1990 не описаны константы S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG,
       S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, вместо них указано
       использовать макросы S_ISDIR() и т.п. Константы S_IF* определены в
       POSIX.1-2001 и новее.

       Макросы S_ISLNK() и S_ISSOCK() не описаны в POSIX.1-1996, но есть в
       POSIX.1-2001; первый взят из SVID 4, последний из SUSv2.

       В UNIX V7 (и более поздних системах) есть S_IREAD, S_IWRITE, S_IEXEC, для
       которых в POSIX есть синонимы S_IRUSR, S_IWUSR, S_IXUSR.

ЗАМЕЧАНИЯ
       Для псевдо-файлов, автоматически генерируемых ядром, размер файла
       (statst_size; statx.stx_size) возвращается не точным. Например, для
       многих файлов каталога /proc возвращается значение 0, а для различных
       файлов из каталога /sys возвращается размер 4096 байт, даже когда
       содержимое файла меньше этого значения. Из таких файлов нужно просто
       считать все возможные байты (и добавлять '\0' в возвращаемый буфер, если
       он считается строкой).

СМОТРИТЕ ТАКЖЕ
       stat(1), stat(2), statx(2), symlink(7)



Linux                              2019-05-09                           INODE(7)