minix ファイルシステムフォーマットの分析

参考

https://www.zybuluo.com/harpsword/note/207478
https://blog.csdn.net/hejinjing_tom_com/article/details/52319189
http://www.cnblogs.com/zhangchaoyang/articles/1896605.html
https ://www.cnblogs.com/codestub/archive/2011/08/31/2160739.html
http://bachue.is-programmer.com/user_files/Bachue/File/Linux%200.11 ファイル システム実装.pdf 
http : //www.voidcn.com/article/p-vizxcuae-dd.html 
https://blog.csdn.net/ac_dao_di/article/details/54670516 
http://www.rutk1t0r.org/2016/12/22 / Linux カーネル 0-11 完全に注釈付き-Come-Minix/ 

https://blog.csdn.net/fukai555/article/details/42060837

準備する

disk という名前の 128 KB ファイルを作成し、そのファイルを minix ファイル システムにフォーマットします。minix ファイル システムには 3 つのバージョンがあります。ここでのデフォルトはバージョン 1 です:

$ dd if=/dev/zero of=disk bs=1K count=128
$ mkfs.minix  disk
64 inodes
128 blocks
Firstdatazone=6 (6)
Zonesize=1024
Maxsize=268966912

ディスクの読み書きの最小単位はブロックであり、一般的なディスクのブロック サイズは 512 バイト、Linux で定義されているブロック サイズは 1024 バイトです。
上記は 128 の 1KB ディスク ブロックに分割されています。ZoneSize
>= BlockSize、ここではすべて 1024、
最初のデータ ゾーンはインデックス 6 のゾーンから始まり、
最大ファイル サイズは 268966912 に達します。

いくつかのディレクトリとテキスト ファイルを作成します。

$ mkdir mnt
$ mount disk -o loop -t minix mnt
.......

$ tree
mnt/
├── document
│   └── uname.txt
├── number.txt
└── text.txt

hexdump -C ディスクは次のように表示されます。

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| 引导块1K
*
00000400  40 00 80 00 01 00 01 00  06 00 00 00 00 1c 08 10  |@...............| 超级块
00000410  8f 13 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000800  3f 00 00 00 00 00 00 00  fe ff ff ff ff ff ff ff  |?...............| inode bitmap
00000810  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000c00  3f 00 00 00 00 00 00 00  00 00 00 00 00 00 00 f8  |?...............| zone bitmap
00000c10  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00001000  ed 41 e8 03 a0 00 00 00  1b 92 f3 5b e8 03 06 00  |.A.........[....| inode1
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001020  b4 81 e8 03 0a 00 00 00  ec 91 f3 5b e8 01 07 00  |...........[....| inode2
00001030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001040  b4 81 e8 03 08 00 00 00  0f 92 f3 5b e8 01 08 00  |...........[....| inode3
00001050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001060  fd 41 e8 03 60 00 00 00  35 92 f3 5b e8 02 09 00  |.A..`...5..[....| inode4
00001070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001080  b4 81 e8 03 72 00 00 00  35 92 f3 5b e8 01 0a 00  |....r...5..[....| inode5
00001090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001800  01 00 2e 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| ZONE 6 
00001810  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001820  01 00 2e 2e 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001830  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001840  02 00 6e 75 6d 62 65 72  2e 74 78 74 00 00 00 00  |..number.txt....|
00001850  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001860  03 00 74 65 78 74 2e 74  78 74 00 00 00 00 00 00  |..text.txt......|
00001870  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001880  04 00 64 6f 63 75 6d 65  6e 74 00 00 00 00 00 00  |..document......|
00001890  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001c00  31 32 33 34 35 36 37 38  39 0a 00 00 00 00 00 00  |123456789.......| ZONE7
00001c10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000  61 62 63 64 65 66 67 0a  00 00 00 00 00 00 00 00  |abcdefg.........| ZONE8
00002010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002400  04 00 2e 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| ZONE9
00002410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00002420  01 00 2e 2e 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00002430  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00002440  05 00 75 6e 61 6d 65 2e  74 78 74 00 00 00 00 00  |..uname.txt.....|
00002450  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002800  4c 69 6e 75 78 20 75 62  75 6e 74 75 20 34 2e 31  |Linux ubuntu 4.1| ZONE10
00002810  35 2e 30 2d 33 36 2d 67  65 6e 65 72 69 63 20 23  |5.0-36-generic #|
00002820  33 39 7e 31 36 2e 30 34  2e 31 2d 55 62 75 6e 74  |39~16.04.1-Ubunt|
00002830  75 20 53 4d 50 20 54 75  65 20 53 65 70 20 32 35  |u SMP Tue Sep 25|
00002840  20 30 38 3a 35 39 3a 32  33 20 55 54 43 20 32 30  | 08:59:23 UTC 20|
00002850  31 38 20 78 38 36 5f 36  34 20 78 38 36 5f 36 34  |18 x86_64 x86_64|
00002860  20 78 38 36 5f 36 34 20  47 4e 55 2f 4c 69 6e 75  | x86_64 GNU/Linu|
00002870  78 0a 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |x...............|
00002880  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00020000

0.ブートブロック

最初の 1KB はブート領域で、システム起動時のブート コードを格納するために使用されますが、使用されずすべて 0 です。

 

1.スーパーブロック

minix ファイル システムのスーパーブロックは 1 KB を占有します。

00000400  40 00 80 00 01 00 01 00  06 00 00 00 00 1c 08 10  |@...............| 超级块
00000410  8f 13 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
struct minix_super_block {
    __u16 s_ninodes;  //0x0040,  64个索引节点
    __u16 s_nzones;   //0x0080, 128个zone, 每个1K
    __u16 s_imap_blocks;  //0x0001, inode 位图点用一个块(1KB)
    __u16 s_zmap_blocks;  //0x0001,  zone位图占用一个块(1KB)
    __u16 s_firstdatazone;  //0x0006第一个数据ZONE索引号
    __u16 s_log_zone_size;  //0x0000,  log2(zone/block), zone与block 都为1024
    __u32 s_max_size;  //0x10081c00,   十进制268966912, 文件最大尺寸
    __u16 s_magic;   //0x138f(MINIX1.0文件系统)
    __u16 s_state;
    __u32 s_zones;
};

2. i ノードビットマップ

    3f 00 00 00 00 00 00 00 
    0011_1111   ......

Bit0 は予約されていますが、1 に設定されます。Bit1 はファイル システムのルート ディレクトリを示し、合計 5 つの i ノード (ルート ディレクトリ、ドキュメント、および 3 つのファイル) を占有します。

 

3. ゾーンビットマップ

    3f 00 00 00 00 00 00 00  00 00 00 00 00 00 00 f8 
    0011_1111   ......

Bit0 は予約されていますが 1 に設定されます。Bit1 はファイル システムのルート ディレクトリ データ領域 (複数のディレクトリ エントリを格納) を表し、合計 5 つのゾーンを占有します。前のスーパー ブロックの firstdatazone は 6 なので、ここでの bit1 は対応します、bit2 は DataZone 6 に対応し、bit2 は 7 に対応します。、bit3 は 8 に対応します...

4. i ノード

00001000  ed 41 e8 03 a0 00 00 00  1b 92 f3 5b e8 03 06 00  |.A.........[....| inode1
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001020  b4 81 e8 03 0a 00 00 00  ec 91 f3 5b e8 01 07 00  |...........[....| inode2
00001030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001040  b4 81 e8 03 08 00 00 00  0f 92 f3 5b e8 01 08 00  |...........[....| inode3
00001050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001060  fd 41 e8 03 60 00 00 00  35 92 f3 5b e8 02 09 00  |.A..`...5..[....| inode4
00001070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001080  b4 81 e8 03 72 00 00 00  35 92 f3 5b e8 01 0a 00  |....r...5..[....| inode5
00001090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

32 バイトが i ノード、最初の 2 行がルート ディレクトリの i ノード、inode 番号は 1、inode 0 はアイドルを意味します。

struct minix_inode {
    __u16 i_mode;  //0x41ed,   040755, 目录文件, rwxr-xr-x
    __u16 i_uid;      //0x03e8,  1000
    __u32 i_size;    //000000a0, 160
    __u32 i_time;   //0x5bf3921b
    __u8  i_gid;      //0xE8,  232
    __u8  i_nlinks;  //0x03,  自身引用,上级目录引用,document引用
    __u16 i_zone[9];  //0x06, 0x00..... 目前只占用了6号ZONE,存储目录项
};

stat デバイスのルート ディレクトリ (現在のディレクトリ) 出力の検証:

konga@ubuntu:~/work/temp/mnt$ stat . 
  File: '.'
  Size: 160           Blocks: 2          IO Block: 1024   directory
Device: 700h/1792d    Inode: 1           Links: 3
Access: (0755/drwxr-xr-x)  Uid: ( 1000/   konga)   Gid: (  232/ UNKNOWN)
Access: 2018-11-20 12:48:28.000000000 +0800
Modify: 2018-11-20 12:48:27.000000000 +0800
Change: 2018-11-20 12:48:27.000000000 +0800
 Birth: -

次の 2 行、inode は 2、コンテンツ分析:

struct minix_inode {
    __u16 i_mode;  // 0x81b4,   0100664 常规文件 rw-rw-r--
    __u16 i_uid;      // 0x03e8,  1000
    __u32 i_size;    // 0000000a,   10
        __u32 i_time;    // 0x5bf391ec
    __u8  i_gid;       // 0xE8,  232
    __u8  i_nlinks;  // 0x01,  没有其他硬链接
    __u16 i_zone[9];  //0x07, 0x00..... 目前只占用了7号ZONE,存储目录项
};
konga@ubuntu:~/work/temp/mnt$ stat number.txt 
  File: 'number.txt'
  Size: 10            Blocks: 2          IO Block: 1024   regular file
Device: 700h/1792d    Inode: 2           Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   konga)   Gid: ( 1000/   konga)
Access: 2018-11-20 12:47:40.000000000 +0800
Modify: 2018-11-20 12:47:40.000000000 +0800
Change: 2018-11-20 12:47:40.000000000 +0800
 Birth: -


5. データ

最初のデータ ZONE は 6 番目のブロックから始まります。ここでの最初の 1KB は、現在のファイル システムのルート ディレクトリのデータ領域で、ゾーン ビットマップの bit1 に対応します。ZONE7 は、i_zone[9] レコードが占有している番号.txt に対応します。 by inode2 1 つのブロックにファイルの内容が格納されます。

00001800  01 00 2e 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| ZONE 6 
00001810  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001820  01 00 2e 2e 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001830  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001840  02 00 6e 75 6d 62 65 72  2e 74 78 74 00 00 00 00  |..number.txt....|
00001850  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001860  03 00 74 65 78 74 2e 74  78 74 00 00 00 00 00 00  |..text.txt......|
00001870  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001880  04 00 64 6f 63 75 6d 65  6e 74 00 00 00 00 00 00  |..document......|
00001890  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001c00  31 32 33 34 35 36 37 38  39 0a 00 00 00 00 00 00  |123456789.......| ZONE7
00001c10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

ZONE6 にはディレクトリ エントリが格納されます。ここでは 32 バイトがプロジェクト エントリです。 

struct minix_dir_entry {
    __u16 inode; 
    char name[0];
};

最初の 2 つのディレクトリ項目は、現在のディレクトリ "." と上位レベルのディレクトリ ".." です。

おすすめ

転載: blog.csdn.net/konga/article/details/84224023