ルートディレクトリを探検する
# ls -ail /mnt/floppy/
total 18
2 drwxr-xr-x 4 root root 1024 Aug 12 23:54 .
832321 drwxr-xr-x 4 root root 4096 Apr 30 09:22 ..
12 drwxr-xr-x 2 root root 1024 Aug 12 23:55 hyoshiok
11 drwx------ 2 root root 12288 Aug 12 23:50 lost+found
# cd hyoshiok
# ls -ail
total 3
12 drwxr-xr-x 2 root root 1024 Aug 12 23:55 .
2 drwxr-xr-x 4 root root 1024 Aug 12 23:54 ..
14 -rw-r--r-- 1 root root 10 Aug 12 23:55 testここでhyoshiokディレクトリのi-node番号が12(一番左端の数字)でtestというファイルのi-node番号が14だということがわかる。
そして . (root directory) の i-node 番号は2である。
# od -txz -Ad /dev/fd0 * 0005120 00000000 00000000 411b83ba 411b83ba >...........A...A< 0005136 411b83ba 00000000 00000000 00000000 >...A............< 0005152 00000000 00000000 00000000 00000000 >................< * 0005248 000041ed 00000400 411b8fd6 411b849a >.A.........A...A< 0005264 411b849a 00000000 00040000 00000002 >...A............< 0005280 00000000 00000000 0000001c 00000000 >................< 0005296 00000000 00000000 00000000 00000000 >................< *
i-nodeの大きさは128バイトで、i-nodeブロックは5120バイトから始まるので、5120+128*(i-node番号-1)=5120+128*1=5248が、root directoryのi-nodeである。
/* linux/include/linux/ext2_fs.h */
/*
* Structure of an inode on the disk
*/
struct ext2_inode {
__u16 i_mode; /* File mode */
__u16 i_uid; /* Low 16 bits of Owner Uid */
__u32 i_size; /* Size in bytes */
__u32 i_atime; /* Access time */
__u32 i_ctime; /* Creation time */
__u32 i_mtime; /* Modification time */
__u32 i_dtime; /* Deletion Time */
__u16 i_gid; /* Low 16 bits of Group Id */
__u16 i_links_count; /* Links count */
__u32 i_blocks; /* Blocks count */
__u32 i_flags; /* File flags */
union {
struct {
__u32 l_i_reserved1;
} linux1;
struct {
__u32 h_i_translator;
} hurd1;
struct {
__u32 m_i_reserved1;
} masix1;
} osd1; /* OS dependent 1 */
__u32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
__u32 i_generation; /* File version (for NFS) */
__u32 i_file_acl; /* File ACL */
__u32 i_dir_acl; /* Directory ACL */
__u32 i_faddr; /* Fragment address */
union {
struct {
__u8 l_i_frag; /* Fragment number */
__u8 l_i_fsize; /* Fragment size */
__u16 i_pad1;
__u16 l_i_uid_high; /* these 2 fields */
__u16 l_i_gid_high; /* were reserved2[0] */
__u32 l_i_reserved2;
} linux2;
struct {
__u8 h_i_frag; /* Fragment number */
__u8 h_i_fsize; /* Fragment size */
__u16 h_i_mode_high;
__u16 h_i_uid_high;
__u16 h_i_gid_high;
__u32 h_i_author;
} hurd2;
struct {
__u8 m_i_frag; /* Fragment number */
__u8 m_i_fsize; /* Fragment size */
__u16 m_pad1;
__u32 m_i_reserved2[2];
} masix2;
} osd2; /* OS dependent 2 */
};
ここで__u8,__u16,__u32はそれぞれ符号のない8ビット、16ビット、32ビットのデータ型である。
ダンプと見比べてみるとi_size=0x400,i_atime/i_ctime/i_mtime/i_dtime=411b8fd6 411b849a 411b849a 00000000, i_blocks=00000002, i_block=0x1cとなる。
debugfsでi-node番号2を表示するのは下記の通りである。上記のダンプと比較してみよう。
# debugfs /dev/fd0 debugfs 1.32 (09-Nov-2002) debugfs: stat <2> Inode: 2 Type: directory Mode: 0755 Flags: 0x0 Generation: 0 User: 0 Group: 0 Size: 1024 File ACL: 0 Directory ACL: 0 Links: 4 Blockcount: 2 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x411b849a -- Thu Aug 12 23:54:18 2004 atime: 0x411b8fd6 -- Fri Aug 13 00:42:14 2004 mtime: 0x411b849a -- Thu Aug 12 23:54:18 2004 BLOCKS: (0):28 TOTAL: 1
第28ブロックに . (root directory)の実体がある。