Filesystem

EXT4 Extents : 매크로 블록에 쓰여진 데이터의 연속성 검증

behonestar 2015. 4. 4. 17:19

목적


매크로 블록(128MiB)에 데이터를 기록했을 때 데이터가 물리적으로 연속적인 주소에 쓰여지는지 검증



매크로 블록 생성 후 데이터 기록


mount.c

1. 파티션 생성

2. 파티션 포맷 (EXT4 + Extents 속성)

3. 마운트 (EXT4)

4. 매크로 블록 생성 (MB00000.IFS ~ MB00xxx.IFS, SPARE.IFS)

5. 데이터 기록

1) Block
  > Size  : 32KiB
  > Data : [0x00 ... 0xFF] x 128 반복
2) Macro Block
  > Size  : 131072KiB
  > Data : Block x 4096개


void _sst_mb_verify_write_read(char *mnt_path)
{
    unsigned char mbpath[128] = {0};
    unsigned char block[BLOCK_SIZE_BYTE] = {0};
    unsigned char tmp[BLOCK_SIZE_BYTE] = {0};

    int ret = 0;
    int fd = 0;
    int i = 0, j = 0;

    for(i = 0; i < BLOCK_SIZE_BYTE; i++)
        block[i] = i % 256;
   
    for(i = 0; i < 3; i++)
    {
        snprintf(mbpath, sizeof(mbpath), "%s/MB%05d.IFS", mnt_path, i);
        fd = open(mbpath, O_RDWR, 0755);
        if(!fd)
            return;
           
        for(j = 0; j < 4096; j++) //32KiB * 4096 = 128MiB
        {
            ret = write(fd, block, BLOCK_SIZE_BYTE);
            if(ret == -1)
            {
                printf("%s() : macro block write failure. %d(%s)\n",
                            __FUNCTION__, errno, strerror(errno));
                close(fd);
                return;
            }
        }
        close(fd);
    }



매크로 블록 덤프하여 데이터 검증



1. 매크로 블록의 Block Range 확인

$ sudo xfs_io -f -c "fiemap -v" /mnt/mymount/MB00001.IFS

/mnt/mymount/MB00001.IFS:
 EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
   0: [0..262143]:     1048576..1310719 262144   0x1


2. 매크로 블록의 inode 번호 '13' 확인

$ ls -li | grep MB00001.IFS

13 -rwxr-xr-x 1 root root 134217728 25 16:03 MB00001.IFS
 ^


3. MB00001.IFS의 inode 주소 추출

$ sudo fsstat /dev/sdb1

FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext3 ---------> fsstat은 EXT4 100% 지원하지 않아서 이렇게 표시됨
...
CONTENT INFORMATION
--------------------------------------------
Block Range: 0 - 61048999
Block Size: 4096
Free Blocks: 3052450
BLOCK GROUP INFORMATION
--------------------------------------------
Number of Block Groups: 1864
Inodes per group: 8192
Blocks per group: 32768

Group: 0:
  Inode Range: 1 - 8192 ----------> MB00001의 inode 주소는 13이므로 Group 0에 속한다.
  Block Range: 0 - 32767
  Layout:
    Super Block: 0 - 0
    Group Descriptor Table: 1 - 15
    Data bitmap: 1025 - 1025
    Inode bitmap: 1041 - 1041
    Inode Table: 1057 - 1568 ------> Group 0의 inode Table의 블록 주소는 1057
    Data Blocks: 1569 - 32767
  Free Inodes: 6441 (78%)
  Free Blocks: 23497 (71%)
  Total Directories: 2
...

> inode 13 ⊂ Block Group 0
> Block Group 0의 inode는 1부터 시작
> Block Group 0의 inode table은 1057 블록부터 시작
> inode 13은 1057 블록부터 12번째 위치한 inode
 > 12 inode / 16 inode per block = 0.75 (inode table로부터 0.75번째 블록에 inode 위치)
  > 전제1. EXT4 inode size : 256 bytes

  > 전제2. EXT4 Block size : 4096 bytes
  > 전제3. inode per block : 16개 (4096 / 256)
 > 4096 * 0.75 = 3072 Byte

 1057 블록으로부터 3072 Byte 위치에 inode 위치


4. inode 정보로부터 데이터 블록의 물리적 주소 추출

$ sudo blkcat -h /dev/sdb1 1057
...
3072 ed810000 00000008 a45d1255 b55d1255 .... .... .].U .].U
3088 b55d1255 00000000 00000100 00000400 .].U .... .... ....
3104 00000800 01000000 0af30100 04000000 .... .... .... ....
3120 00000000 00000000 00800000 00000200 .... .... .... ....
...

00000008
> Bytes 4-7     : 파일 사이즈 (0x08000000 = 128MiB)

0af30100 04000000
> Bytes 40-41 : 매직 넘버 (0xF30A)
> Bytes 42-43 : Extents 개수 (0x0001 = 1)
> Bytes 44-45 : 최대 Extents 개수 (0x0004 = 4)
> Bytes 46-47 : 트리의 Depth (0x0000)

00000000 00800000 00000200
> Bytes 52-55 : Logical Block Number (0x0000)
> Bytes 56-57 : Number of Blocks in extent (0x8000 = 32768개)
> Bytes 58-59 : Upper 16 bits of physical block address (0x0000)
> Bytes 60-63 : Lower 32 bits of physical block address (0x00020000 = 131072)


5. 131072 블록 덤프

$ sudo blkcat -h /dev/sdb1 131072

0       00010203 04050607 08090a0b 0c0d0e0f     .... .... .... ....
16      10111213 14151617 18191a1b 1c1d1e1f     .... .... .... ....
32      20212223 24252627 28292a2b 2c2d2e2f      !"# $%&' ()*+ ,-./
48      30313233 34353637 38393a3b 3c3d3e3f     0123 4567 89:; <=>?
64      40414243 44454647 48494a4b 4c4d4e4f     @ABC DEFG HIJK LMNO
80      50515253 54555657 58595a5b 5c5d5e5f     PQRS TUVW XYZ[ \]^_
96      60616263 64656667 68696a6b 6c6d6e6f     `abc defg hijk lmno
112     70717273 74757677 78797a7b 7c7d7e7f     pqrs tuvw xyz{ |}~.
128     80818283 84858687 88898a8b 8c8d8e8f     .... .... .... ....
144     90919293 94959697 98999a9b 9c9d9e9f     .... .... .... ....
160     a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf     .... .... .... ....
176     b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf     .... .... .... ....
192     c0c1c2c3 c4c5c6c7 c8c9cacb cccdcecf     .... .... .... ....
208     d0d1d2d3 d4d5d6d7 d8d9dadb dcdddedf     .... .... .... ....
224     e0e1e2e3 e4e5e6e7 e8e9eaeb ecedeeef     .... .... .... ....
240     f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff     .... .... .... ....
256     00010203 04050607 08090a0b 0c0d0e0f     .... .... .... ....
272     10111213 14151617 18191a1b 1c1d1e1f     .... .... .... ....
288     20212223 24252627 28292a2b 2c2d2e2f      !"# $%&' ()*+ ,-./
304     30313233 34353637 38393a3b 3c3d3e3f     0123 4567 89:; <=>?
320     40414243 44454647 48494a4b 4c4d4e4f     @ABC DEFG HIJK LMNO
336     50515253 54555657 58595a5b 5c5d5e5f     PQRS TUVW XYZ[ \]^_
352     60616263 64656667 68696a6b 6c6d6e6f     `abc defg hijk lmno
368     70717273 74757677 78797a7b 7c7d7e7f     pqrs tuvw xyz{ |}~.
384     80818283 84858687 88898a8b 8c8d8e8f     .... .... .... ....
400     90919293 94959697 98999a9b 9c9d9e9f     .... .... .... ....
416     a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf     .... .... .... ....
432     b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf     .... .... .... ....
448     c0c1c2c3 c4c5c6c7 c8c9cacb cccdcecf     .... .... .... ....
464     d0d1d2d3 d4d5d6d7 d8d9dadb dcdddedf     .... .... .... ....
480     e0e1e2e3 e4e5e6e7 e8e9eaeb ecedeeef     .... .... .... ....
496     f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff     .... .... .... ....
512     00010203 04050607 08090a0b 0c0d0e0f     .... .... .... ....
528     10111213 14151617 18191a1b 1c1d1e1f     .... .... .... ....
544     20212223 24252627 28292a2b 2c2d2e2f      !"# $%&' ()*+ ,-./
560     30313233 34353637 38393a3b 3c3d3e3f     0123 4567 89:; <=>?
576     40414243 44454647 48494a4b 4c4d4e4f     @ABC DEFG HIJK LMNO
592     50515253 54555657 58595a5b 5c5d5e5f     PQRS TUVW XYZ[ \]^_
608     60616263 64656667 68696a6b 6c6d6e6f     `abc defg hijk lmno
624     70717273 74757677 78797a7b 7c7d7e7f     pqrs tuvw xyz{ |}~.
640     80818283 84858687 88898a8b 8c8d8e8f     .... .... .... ....
656     90919293 94959697 98999a9b 9c9d9e9f     .... .... .... ....
672     a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf     .... .... .... ....
688     b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf     .... .... .... ....
...

> 데이터가 연속적으로 쓰여진 것을 확인할 수 있다.



'Filesystem' 카테고리의 다른 글

MBR과 GPT  (0) 2015.03.20
EXT4 Extents : 블록 연속 할당 실험  (0) 2015.02.16
EXT4에 대한 이해 (Part 1) : Extents  (3) 2015.02.15