はわわーっ

はわわわわっ

ext4のめもその2

http://yomi322.hateblo.jp/entry/2015/06/28/094928のつづき。

ディレクトリエントリを見るところから。

% sudo hexdump -C -s 0x2421000 /dev/dm-0 | head
02421000  02 00 00 00 0c 00 01 02  2e 00 00 00 02 00 00 00  |................|
02421010  0c 00 02 02 2e 2e 00 00  0b 00 00 00 14 00 0a 02  |................|
02421020  6c 6f 73 74 2b 66 6f 75  6e 64 00 00 01 00 2c 00  |lost+found....,.|
02421030  0c 00 04 02 62 6f 6f 74  01 00 e4 00 0c 00 03 02  |....boot........|
02421040  65 74 63 00 01 00 26 00  10 00 05 02 6d 65 64 69  |etc...&.....medi|
02421050  61 00 00 00 01 00 a2 00  0c 00 03 02 76 61 72 00  |a...........var.|
02421060  01 00 5e 00 0c 00 03 02  62 69 6e 00 01 00 24 00  |..^.....bin...$.|
02421070  0c 00 03 02 64 65 76 00  01 00 58 00 0c 00 04 02  |....dev...X.....|
02421080  68 6f 6d 65 01 00 c4 00  0c 00 03 02 6c 69 62 00  |home........lib.|
02421090  01 00 28 00 10 00 05 02  6c 69 62 36 34 00 00 00  |..(.....lib64...|

エントリの構造体は

Offset  Size	Name
0x0     __le32  inode
0x4     __le16  rec_len
0x6     __u8    name_len
0x7     __u8    file_type
0x8     char    name[EXT4_NAME_LEN]

最後のnameは4バイトアラインされるようになっているらしい。余ったところは0x00で埋まってるらしい。
上で見えてる範囲では、.、..、lost+found、bootとかが見えている。

とりあえず、etcの中を見てみる。inodeは0xe40001。
このinodeが入っているブロックグループは(0xe40001 - 1) / 0x2000 = 1824。
inodeのインデックスは(0xe40001 - 1) % 0x2000 = 0

ブロックグループ1824のinode tableは59768864(0x3900020)ブロックにあったので、etcのinodeは0x3900020 * 0x1000 + 0 = 0x3900020000

% sudo hexdump -C -s 0x3900020000 /dev/dm-0 | head
3900020000  ed 41 00 00 00 30 00 00  b5 73 8f 55 64 e4 8d 55  |.A...0...s.Ud..U|
3900020010  64 e4 8d 55 00 00 00 00  00 00 87 00 18 00 00 00  |d..U............|
3900020020  00 10 08 00 2f 09 00 00  0a f3 02 00 04 00 00 00  |..../...........|
3900020030  00 00 00 00 00 00 00 00  01 00 00 00 20 20 90 03  |............  ..|
3900020040  01 00 00 00 02 00 00 00  c4 21 90 03 00 00 00 00  |.........!......|
3900020050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
3900020060  00 00 00 00 e0 85 48 e1  00 00 00 00 00 00 00 00  |......H.........|
3900020070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
3900020080  1c 00 00 00 0c e9 c6 40  0c e9 c6 40 d4 84 08 14  |.......@...@....|
3900020090  29 c9 73 55 50 94 a3 1d  00 00 00 00 00 00 00 00  |).sUP...........|

ルートディレクトリの時と同じようにi_blockをみると、この中身は0x3902020ブロックにある。

% sudo hexdump -C -s 0x3902020000 /dev/dm-0 | head
3902020000  01 00 e4 00 0c 00 01 02  2e 00 00 00 02 00 00 00  |................|
3902020010  f4 0f 02 02 2e 2e 00 00  00 00 00 00 01 08 00 00  |................|
3902020020  fc 01 02 00 01 00 00 00  98 6d f5 85 02 00 00 00  |.........m......|
3902020030  4e 65 74 77 6f 72 6b 4d  61 6e 61 67 65 72 00 00  |NetworkManager..|
3902020040  04 00 e4 00 10 00 06 02  55 50 6f 77 65 72 00 00  |........UPower..|
3902020050  05 00 e4 00 0c 00 03 02  58 31 31 00 06 00 e4 00  |........X11.....|
3902020060  0c 00 04 02 61 63 70 69  07 00 e4 00 14 00 0c 02  |....acpi........|
3902020070  61 6c 74 65 72 6e 61 74  69 76 65 73 08 00 e4 00  |alternatives....|
3902020080  0c 00 03 02 61 70 6d 00  09 00 e4 00 10 00 08 02  |....apm.........|
3902020090  61 70 70 61 72 6d 6f 72  0a 00 e4 00 14 00 0a 02  |apparmor........|

ちゃんと/etcの中が見えてるっぽい。

あとはファイルの中身を見てみる。

% stat /etc/issue
  File: ‘/etc/issue’
  Size: 26        	Blocks: 8          IO Block: 4096   regular file
Device: fc00h/64512d	Inode: 14942368    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-06-28 13:10:39.912025688 +0900
Modify: 2015-02-03 18:14:47.000000000 +0900
Change: 2015-06-07 13:31:56.244313909 +0900
 Birth: -

なのでinode 14942368をみてみる。

% echo $(( (14942368 - 1) / 0x2000 ))
1824
% echo $(( (14942368 - 1) % 0x2000 ))
159

なので、0x3900020 * 0x1000 + 159 * 0x100 = 0x3900029f00をみる。

% sudo hexdump -C -s 0x3900029f00 /dev/dm-0 | head  
3900029f00  a4 81 00 00 1a 00 00 00  bf 73 8f 55 3c c9 73 55  |.........s.U<.sU|
3900029f10  87 91 d0 54 00 00 00 00  00 00 01 00 08 00 00 00  |...T............|
3900029f20  00 00 08 00 01 00 00 00  0a f3 01 00 04 00 00 00  |................|
3900029f30  00 00 00 00 00 00 00 00  01 00 00 00 23 80 90 03  |............#...|
3900029f40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
3900029f60  00 00 00 00 ab 87 48 e1  00 00 00 00 00 00 00 00  |......H.........|
3900029f70  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
3900029f80  1c 00 00 00 d4 bc 3f 3a  00 00 00 00 60 a1 71 d9  |......?:....`.q.|
3900029f90  3c c9 73 55 d4 bc 3f 3a  00 00 00 00 00 00 00 00  |<.sU..?:........|

で、i_blockをみて

% sudo hexdump -C -s 0x3908023000 /dev/dm-0 | head
3908023000  55 62 75 6e 74 75 20 31  34 2e 30 34 2e 32 20 4c  |Ubuntu 14.04.2 L|
3908023010  54 53 20 5c 6e 20 5c 6c  0a 0a 00 00 00 00 00 00  |TS \n \l........|
3908023020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
3908024000  55 62 75 6e 74 75 20 31  34 2e 30 34 2e 32 20 4c  |Ubuntu 14.04.2 L|
3908024010  54 53 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |TS..............|
3908024020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
3908025000  64 62 75 73 20 7b 6d 61  73 6b 20 7b 61 63 71 75  |dbus {mask {acqu|
3908025010  69 72 65 20 73 65 6e 64  20 72 65 63 65 69 76 65  |ire send receive|

になっていて、ファイルの中身も見れた。


あとは、1ブロックに収まらない容量のファイルだとどうなるかも調べておかないとなぁ。