APUE - 4.14 File Systems
i-nodeについてきちんと理解したかったので、本日は4.14 File Systems。
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)はカーネルメモリ内でファイルを示す、抽象オブジェクト。