inode(7)

NAZWA
inode - informacja o i-węźle pliku

OPIS
Każdy plik posiada i-węzeł z metadanymi o pliku. Aplikacja może pobrać te metadane za pomocą stat(2) (lub powiązanych wywołań), które zwraca strukturę stat albo za pomocą statx(2), które zwraca strukturę statx.

Poniższa lista zawiera informacje zwykle dostępne w i-węźle pliku lub z nim powiązane, wraz z nazwami pól struktur zwracanych przez stat(2) i statx(2):

Urządzenie, na którym występuje i-węzeł
    stat.st_dev; statx.stx_dev_minor i statx.stx_dev_major

    Każdy i-węzeł (oraz powiązany plik) występuje w systemie plików umieszczonym na urządzeniu. Urządzenie jest identyfikowane przez zestaw: identyfikatora głównego (opisującego ogólną klasę urządzenia) oraz identyfikatora pobocznego (opisującego konkretne wystąpienie w klasie ogólnej).

Numer i-węzła
    stat.st_ino; statx.stx_ino

    Każdy plik w systemie plików posiada unikatowy numer i-węzła. Numery i-węzłów są jednak unikatowe tylko w zakresie danego systemu plików (tj. ten sam numer i-węzła może być używany w różnych systemach plików, co stanowi powód, dla którego dowiązania zwykłe nie mogą wykraczać poza swój system plików). To pole zawiera numer i-węzła pliku.

Typ i tryb pliku
    stat.st_mode; statx.stx_mode

    Zob. opis typu i trybu pliku, poniżej.

Liczba dowiązań
    stat.st_nlink; statx.stx_nlink

    Pole zawiera liczbę dowiązań zwykłych (twardych) do pliku. Dodatkowe dowiązania do istniejącego pliku tworzy się za pomocą link(2).

Identyfikator użytkownika
    stat.st_uid; statx.stx_uid

    Pole zapisuje identyfikator użytkownika właściciela pliku. W przypadku nowo tworzonych plików, identyfikatorem użytkownika w pliku będzie efektywny identyfikator użytkownika tworzącego procesu. Identyfikator użytkownika pliku można zmienić za pomocą chown(2).

Identyfikator grupy
    stat.st_gid; statx.stx_gid

    I-węzeł zapisuje identyfikator grupy właściciela pliku. W przypadku nowo tworzonych plików, identyfikator grupy pliku jest albo identyfikatorem grupy katalogu nadrzędnego albo efektywnym identyfikatorem grupy procesu tworzącego, w zależności od tego, czy bit ustawienia grupy podczas wykonania (sgid) jest ustawiony na katalogu nadrzędnym (zob. niżej). Identyfikator grupy pliku można zmienić za pomocą chown(2).

Urządzenie reprezentowane przez ten i-węzeł
    stat.st_rdev; statx.stx_rdev_minor i statx.stx_rdev_major

    Jeśli ten plik (i-węzeł) reprezentuje urządzenie, to i-węzeł zapisuje główny i poboczny identyfikator tego urządzenia.

Rozmiar pliku
    stat.st_size; statx.stx_size

    To pole ujawnia rozmiar pliku (jeśli jest zwykłym plikiem lub dowiązaniem symbolicznym) w bajtach. Rozmiarem dowiązania symbolicznego jest długość ścieżki, którą zawiera dowiązanie, bez końcowego bajtu null.

Preferowany rozmiar bloku do wejścia/wyjścia
    stat.st_blksize; statx.stx_blksize

    Pole ujawnia „preferowany” rozmiar bloku w celu uzyskania wydajnego wejścia/wyjścia systemu plików (zapis do pliku w mniejszych fragmentach spowoduje nieefektywną sekwencję odczyt-modyfikacja-nadpis).

Liczba bloków przypisanych do pliku
    stat.st_blocks; statx.stx_blocks

    Pole wskazuje liczbę bloków przypisanych do pliku, w 512 bajtowych jednostkach (może być mniejsze niż st_size/512 gdy plik ma dziury).

    Standard POSIX.1 zauważa, że jednostka st_blocks będącego składową struktury stat, nie jest zdefiniowana standardem. W wielu implementacjach jest to 512 bajtów; na kilku systemach korzysta się z innej jednostki np. 1024. Co więcej, jednostka może się różnić w zależności od systemu plików.

Znacznik czasowy ostatniego dostępu (atime — ang. access time)
    stat.st_atime; statx.stx_atime

    Znacznik czasowy ostatniego dostępu do pliku. Zmienia się przy uzyskaniu dostępu do pliku, np. przez execve(2), mknod(2), pipe(2), utime(2) i read(2) (dla więcej niż zera bajtów). Inne interfejsy, takie jak mmap(2), mogą nie aktualizować znacznika czasu atime.

    Niektóre typy systemu plików zezwalają na montowanie w sposób, w którym dostęp do pliku i/lub katalogu nie powoduje aktualizacji znacznika czasu atime (zob. noatime, nodiratime i relatime w podręczniku mount(8) oraz powiązane informacje w podręczniku mount(2)). Dodatkowo, znacznik atime nie jest aktualizowany, gdy plik otwarto ze znacznikiem O_NOATIME; zob. open(2).

Znacznik czasowy utworzenia pliku (btime — ang. birth time)
    (nie jest zwracany w strukturze stat); statx.stx_btime

    Znacznik czasowy utworzenia pliku. Jest ustawiany przy utworzeniu pliku i nie ulega później zmianie.

    Znacznik czasowy btime nie był historycznie obecny w systemach UNIX i nie jest obecnie obsługiwany przez większość linuksowych systemów plików.

Znacznik czasowy ostatniej modyfikacji (mtime)
    stat.st_mtime; statx.stx_mtime

    Znacznik czasowy ostatniej modyfikacji pliku. Zmienia się przy modyfikacji pliku, np. za pomocą mknod(2), truncate(2), utime(2) i write(2) (więcej niż zera bajtów). Co więcej znacznik czasowy mtime katalogu jest zmieniany przy tworzeniu i kasowaniu plików w tym katalogu. Znacznik czasowy mtime nie jest zmieniany przy zmianie właściciela, grupy, liczby dowiązań zwykłych lub trybu.

Znacznik czasowy ostatniej zmiany statusu (ctime — ang. change time)
    stat.st_ctime; statx.stx_ctime

    Znacznik czasu ostatniej zmiany statusu pliku. Zmienia się przy zapisywaniu lub ustawianiu informacji i-węzła (tj. właściciela, grupy, liczby dowiązań, trybu itd.).

Pola znaczników czasu zgłaszają czas mierzony od Epoki tj. 1970-01-01 00:00:00 +0000, UTC (zob. time(7)).

Nanosekundowe znaczniki czasowe są obsługiwane w systemach plików XFS, JFS, Btrfs i ext4 (od Linuksa 2.6.23). Znaczniki nanosekundowe nie są obsługiwane w ext2, ext3 i Reiserfs. Aby zwrócić znaczniki czasu z nanosekundową precyzją, pola znacznika czasu w strukturach stat i statx są zdefiniowane jako struktury zawierające cząstkę nanosekund. Więcej szczegółów w podręcznikach stat(2) i statx(2). W systemach plików nieobsługujących znaczników czasowych dokładniejszych niż sekunda, pola nanosekund w strukturach stat i statx są zwracane z wartością 0.

  Typ i tryb pliku
Pole stat.st_mode (w przypadku statx(2): pole statx.stx_mode) zawiera typ i tryb pliku.

POSIX odnosi się do bitów stat.st_mode związanych z maską S_IFMT (zob. niżej) jako typu pliku, 12 bitów odnoszących się do maski 07777 jako bitów trybu pliku, a najmniej znaczących 9 bitów (0777) jako bitów uprawnień pliku.

Zdefiniowano następujące wartości maski dla typu pliku
S_IFMT | 0170000 | maska bitowa dla pola bitów typu pliku
S_IFSOCK | 0140000 | gniazdo
S_IFLNK | 0120000 | dowiązanie symboliczne
S_IFREG | 0100000 | zwykły plik
S_IFBLK | 0060000 | urządzenie blokowe
S_IFDIR | 0040000 | katalog
S_IFCHR | 0020000 | urządzenie znakowe
S_IFIFO | 0010000 | FIFO

Zatem aby sprawdzić, czy plik jest np. zwykłym plikiem, można użyć:

    stat(pathname, &sb);
    if ((sb.st_mode & S_IFMT) == S_IFREG) {
        /* Obsługa zwykłego pliku */
    }

Ze względu na powszechność testów w powyższej postaci, POSIX zdefiniował dodatkowe makra, aby umożliwić spójniejsze zapisywanie testów typu pliku st_mode:

    S_ISREG(m)
        czy to zwykły plik?

    S_ISDIR(m)
        katalog?

    S_ISCHR(m)
        urządzenie znakowe?

    S_ISBLK(m)
        urządzenie blokowe?

    S_ISFIFO(m)
        FIFO (potok nazwany)?

    S_ISLNK(m)
        dowiązanie symboliczne? (nie występuje w POSIX.1-1996)

    S_ISSOCK(m)
        gniazdo? (nie występuje w POSIX.1-1996)

Wcześniejszy wycinek kodu można zatem przepisać jako:

    stat(pathname, &sb);
    if (S_ISREG(sb.st_mode)) {
        /* Obsługa zwykłego pliku */
    }

Definicje większości z powyższych makr testujących typ pliku są udostępniane, jeśli włączono dowolny z następujących testowych makr funkcji: _BSD_SOURCE (w glibc 2.19 i wcześniejszych), _SVID_SOURCE (w glibc 2.19 i wcześniejszych) lub _DEFAULT_SOURCE (w glibc 2.20 i późniejszych). Dodatkowo, definicje wszystkich powyższych makr poza S_IFSOCK i S_ISSOCK() są udostępniane, jeśli zdefiniowano _XOPEN_SOURCE.

Definicja S_IFSOCK może być również ujawniona przez zdefiniowanie _XOPEN_SOURCE z wartością 500 lub większą albo (od glibc 2.24) przez zdefiniowanie zarówno _XOPEN_SOURCE jak i _XOPEN_SOURCE_EXTENDED.

Definicja S_ISSOCK() jest ujawniana, gdy zdefiniowane dowolne z następujących testowych makr funkcji: _BSD_SOURCE (w glibc 2.19 i wcześniejszych), _DEFAULT_SOURCE (w glibc 2.20 i późniejszych), _XOPEN_SOURCE z wartością 500 lub większą, _POSIX_C_SOURCE z wartością 200112L lub większą albo (od glibc 2.24) przez zdefiniowanie zarówno _XOPEN_SOURCE jak i _XOPEN_SOURCE_EXTENDED.

W komponencie trybu pliku pola st_mode zdefiniowano następujące wartości masek:
S_ISUID | 04000 | bit set-user-ID (zob. execve(2))
S_ISGID | 02000 | bit set-group-ID (zob. niżej)
S_ISVTX | 01000 | bit lepkości (zob. niżej)
S_IRWXU | 00700 | właściciel ma uprawnienia odczytu, zapisu i wykonania
S_IRUSR | 00400 | właściciel ma uprawnienie odczytu
S_IWUSR | 00200 | właściciel ma uprawnienie zapisu
S_IXUSR | 00100 | właściciel ma uprawnienie wykonania
S_IRWXG | 00070 | grupa ma uprawnienia odczytu, zapisu i wykonania
S_IRGRP | 00040 | grupa ma uprawnienie odczytu
S_IWGRP | 00020 | grupa ma uprawnienie zapisu
S_IXGRP | 00010 | grupa ma uprawnienie wykonania
S_IRWXO | 00007 | inni (poza grupą) mają uprawnienia odczytu, zapisu i wykonania
S_IROTH | 00004 | inni mają uprawnienie odczytu
S_IWOTH | 00002 | inni mają uprawnienie zapisu
S_IXOTH | 00001 | inni mają uprawnienie wykonania

Bit set-group-ID (S_ISGID) ma kilka specjalnych zastosowań. W przypadku katalogu wskazuje, że dla danego katalogu ma być używana semantyka BSD: tworzone w nim pliki dziedziczą identyfikator tworzącego procesu, a tworzone w nim katalogi dziedziczą również ustawienie bitu S_ISGID. W przypadku pliku wykonywalnego, bit set-group-ID powoduje zmianę efektywnego identyfikatora grupy procesu, który wykonuje plik, zgodnie z opisem w podręczniku execve(2). W przypadku pliku, który nie posiada ustawionego bitu wykonania dla grupy (S_IXGRP), bit set-group-ID wskazuje obowiązkowe blokowanie pliku/rekordu.

Bit lepkości (S_ISVTX) w przypadku katalogu oznacza, że wobec pliku w tym katalogu, jedynie: właściciel pliku, właściciel katalogu lub proces uprzywilejowany może zmienić nazwę pliku lub go usunąć.

STANDARDY
POSIX.1-2008.

HISTORIA
POSIX.1-2001.

POSIX.1-1990 nie opisuje stałych S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO i S_ISVTX, lecz określa użycie makr S_ISDIR() itd.

Makra S_ISLNK() i S_ISSOCK() nie występowały w POSIX.1-1996; pierwsze pochodzi z SVID 4, drugie z SUSv2.

UNIX V7 (i późniejsze systemy) posiadały S_IREAD, S_IWRITE, S_IEXEC w miejscu określonych przez POSIX synonimów S_IRUSR, S_IWUSR i S_IXUSR.

UWAGI
Zgłaszany przez jądro rozmiar pliku (stat.st_size; statx.stx_size) nie jest prawidłowy, w przypadku pseudoplików generowanych automatycznie przez jądro. Przykładowo zwracana jest wartość 0 wobec wielu plików w katalogu /proc, natomiast wiele plików w katalogu /sys zgłasza rozmiar 4096 bajtów nawet, gdy zawartość pliku jest mniejsza. W przypadku ww. plików powinno się próbować odczytać tak wiele bajtów, jak to możliwe (i dodać „\0” do zwracanego bufora, jeśli ma być interpretowany jako łańcuch tekstowy).

ZOBACZ TAKŻE
stat(1), stat(2), statx(2), symlink(7)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.