APUE - 4.14 File Systems

i-nodeについてきちんと理解したかったので、本日は4.14 File Systems。

f:id:kotaroito2002:20140303220618p:plain

Figure 4.14 Cylinder group's i-nodes and data blocks in more detail

i-nodeとは?

ファイル種別、アクセス権限、サイズ、データブロックへのポインタなど、ファイルに関するメタ情報。また、そのデータ構造のこと。

概ねstat(2)で得られる情報だと思えばよい。データブロックへのポインタは分からないが。

struct stat {
    dev_t     st_dev;     /* ファイルがあるデバイスの ID */
    ino_t     st_ino;     /* inode 番号 */
    mode_t    st_mode;    /* アクセス保護 */
    nlink_t   st_nlink;   /* ハードリンクの数 */
    uid_t     st_uid;     /* 所有者のユーザ ID */
    gid_t     st_gid;     /* 所有者のグループ ID */
    dev_t     st_rdev;    /* デバイス ID (特殊ファイルの場合) */
    off_t     st_size;    /* 全体のサイズ (バイト単位) */
    blksize_t st_blksize; /* ファイルシステム I/O でのブロックサイズ */
    blkcnt_t  st_blocks;  /* 割り当てられた 512B のブロック数 */
    time_t    st_atime;   /* 最終アクセス時刻 */
    time_t    st_mtime;   /* 最終修正時刻 */
    time_t    st_ctime;   /* 最終状態変更時刻 */
};

i-node番号

$ ls -il tmp/test 
61305470 drwxr-xr-x  4 kotaroito  kotaroito  136  3  3 22:32 .
25404252 drwxr-xr-x  8 kotaroito  kotaroito  272  3  3 22:32 ..
61305474 -rw-r--r--  2 kotaroito  kotaroito    0  3  3 22:32 test
61305474 -rw-r--r--  2 kotaroito  kotaroito    0  3  3 22:32 test2
  • 先頭の数字がi-node番号になる。
  • ファイルだけでなく、ディレクトリにもi-node番号がある。
  • test2はtestをハードリンクしたので、i-node番号は同じ。stat構造体のst_nlinkは2になる。

stat(2)

こんな感じで使えばok。

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
    struct stat  statbuf;

    stat("testfile", &statbuf);
    printf("%lld\n", statbuf.st_ino);
    printf("%d\n",   statbuf.st_nlink);
    printf("%lld\n", statbuf.st_size);
    printf("%d\n",   statbuf.st_blksize);
    printf("%lld\n", statbuf.st_blocks);
}

VFSとvnode

VFS(Virtual File System)は異なるファイルシステムext2, ext3など)を統一的に扱うためのレイヤ。vnode(virtual node)はカーネルメモリ内でファイルを示す、抽象オブジェクト。

Resources