Filesystem

EXT4 Extents : 블록 연속 할당 실험

behonestar 2015. 2. 16. 11:05

목적

  1. 별도의 Driver를 구현하지 않고 User 영역에서 연속적인 매크로 블록 할당


요구사항

  1. 디스크가 EXT4 파일 시스템으로 포맷 되어야 한다.
  2. 디스크가 EXTENTS 속성으로 마운트 되어야 한다.
  3. 매크로 블록이 물리적으로 연속 할당되어야 한다. (128MB, 256MB, ...)


실험과정

  • 디스크 파티션 제거/생성

sudo fdisk -l

sudo fdisk /dev/sdb

d /* 파티션 1,2 제거 */

1

d

2

n /* 파티션 1 생성 */

p

1
w


  • 디스크 마운트 (extents 옵션은 /etc/mke2fs.conf에 의해 기본으로 활성화된다.)

sudo mkfs.ext4 /dev/sdb1
sudo mkdir /mnt/mymount
sudo mount -v -t ext4 /dev/sdb1 /mnt/mymount


  • 파일 할당

#!/bin/bash
for((i=0;i<100;i++));do
        sudo fallocate -l 128M /mnt/mymount/MB$i.txt
done


  • 결과물을 파일로 출력

#!/bin/bash
rm result.txt
for((i=0;i<100;i++));do
        sudo xfs_io -f -c "fiemap -v" /mnt/mymount/MB$i.txt >> result.txt
done

cat result.txt | grep ] > result2.txt


  • 블록 주소 연속성 조사
/mnt/mymount/MB0.txt:
 EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
   0: [0..16383]:      278528..294911   16384 0x800 >>>>>>>> +1
   1: [16384..32767]:  294912..311295   16384 0x800 >>>>>>>> +1
   2: [32768..49151]:  311296..327679   16384 0x800 >>>>>>>> +1
   3: [49152..65535]:  327680..344063   16384 0x800 >>>>>>>> +1
   4: [65536..81919]:  344064..360447   16384 0x800 >>>>>>>> +1
   5: [81920..98303]:  360448..376831   16384 0x800 >>>>>>>> +1
   6: [98304..114687]: 376832..393215   16384 0x800 >>>>>>>> +1
   7: [114688..131071]: 393216..409599   16384 0x800 >>>>>>>> +1
   8: [131072..147455]: 409600..425983   16384 0x800 >>>>>>>> +1
   9: [147456..163839]: 425984..442367   16384 0x800 >>>>>>>> +1
  10: [163840..180223]: 442368..458751   16384 0x800 >>>>>>>> +1
  11: [180224..196607]: 458752..475135   16384 0x800 >>>>>>>> +1
  12: [196608..212991]: 475136..491519   16384 0x800 >>>>>>>> +1
  13: [212992..229375]: 491520..507903   16384 0x800 >>>>>>>> +1
  14: [229376..245759]: 507904..524287   16384 0x800 >>>>>>>> +1
  15: [245760..262143]: 524288..540671   16384 0x801 >>>>>>>> +1
/mnt/mymount/MB1.txt:
 EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
   0: [0..16383]:      540672..557055   16384 0x800 >>>>>>>> +1
   1: [16384..32767]:  557056..573439   16384 0x800 >>>>>>>> +1
   2: [32768..49151]:  573440..589823   16384 0x800 >>>>>>>> +1
   3: [49152..65535]:  589824..606207   16384 0x800 >>>>>>>> +1
   4: [65536..81919]:  606208..622591   16384 0x800 >>>>>>>> +1
   5: [81920..98303]:  622592..638975   16384 0x800 >>>>>>>> +1
...



  • 생성된 파일을 0으로 채운 후 블록 주소 변화 확인

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PREPATH "/mnt/mymount"
int main(void)
{
        FILE *fp = NULL;
        int i = 0;
        char buf[256] = {0};
        char *p = NULL;
        long filesize = 0;
        for(i = 0; i < 100; i++)
        {
                snprintf(buf, sizeof(buf), "%s/MB%d.txt", PREPATH, i);
                printf("open %s\n", buf);
                fp = fopen(buf, "r+");
                if(filesize == 0)
                {
                        fseek(fp, 0, SEEK_END);
                        filesize = ftell(fp);
                        fseek(fp, 0, SEEK_SET);
                        p = (char *)malloc(sizeof(char) * filesize);
                        memset(p, 0, sizeof(char) * filesize);
                }
                if(fp == NULL)
                {
                        printf("file %s open fail\n", buf);
                        if(!p) free(p);
                        return 0;
                }
                fwrite(p, 1, sizeof(char) * filesize, fp);
                fclose(fp);
        }
        if(!p) free(p);
        printf("filesize : %ld\n", filesize);
        return 0;
}


<Zerofill 이전>

/mnt/mymount/MB0.txt:
 EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
   0: [0..7]:          278528..278535       8   0x0
   1: [8..16383]:      278536..294911   16376 0x800
   2: [16384..32767]:  294912..311295   16384 0x800
   3: [32768..49151]:  311296..327679   16384 0x800
   4: [49152..65535]:  327680..344063   16384 0x800
   5: [65536..81919]:  344064..360447   16384 0x800
   6: [81920..98303]:  360448..376831   16384 0x800
   7: [98304..114687]: 376832..393215   16384 0x800
   8: [114688..131071]: 393216..409599   16384 0x800
   9: [131072..147455]: 409600..425983   16384 0x800
  10: [147456..163839]: 425984..442367   16384 0x800
  11: [163840..180223]: 442368..458751   16384 0x800
  12: [180224..196607]: 458752..475135   16384 0x800
  13: [196608..212991]: 475136..491519   16384 0x800
  14: [212992..229375]: 491520..507903   16384 0x800
  15: [229376..245759]: 507904..524287   16384 0x800
  16: [245760..262143]: 524288..540671   16384 0x800
  17: [262144..278527]: 540672..557055   16384 0x800
  18: [278528..294911]: 557056..573439   16384 0x800
  19: [294912..311295]: 573440..589823   16384 0x800
  20: [311296..327679]: 589824..606207   16384 0x800
  21: [327680..344063]: 606208..622591   16384 0x800
  22: [344064..360447]: 622592..638975   16384 0x800
  23: [360448..376831]: 638976..655359   16384 0x800
  24: [376832..393215]: 655360..671743   16384 0x800
  25: [393216..409599]: 671744..688127   16384 0x800
  26: [409600..425983]: 688128..704511   16384 0x800
  27: [425984..442367]: 704512..720895   16384 0x800
  28: [442368..458751]: 720896..737279   16384 0x800
  29: [458752..475135]: 737280..753663   16384 0x800
  30: [475136..491519]: 753664..770047   16384 0x800
  31: [491520..507903]: 770048..786431   16384 0x800
  32: [507904..524287]: 802816..819199   16384 0x801


<Zerofill 이후>

/mnt/mymount/MB0.txt:
 EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
   0: [0..262143]:     278528..540671   262144   0x0
   1: [262144..507903]: 540672..786431   245760   0x0
   2: [507904..524287]: 802816..819199   16384   0x1


결과

  1. 거의 모든 파일은 연속된 블록으로 할당된다.
  2. 낮은 빈도(0.667%)로 인접하지 않은 블록이 존재하지만 일방향으로 증가한다.
  3. 파일끼리도 물리적으로 인접하다.
  4. 생성된 파일을 수정해도 파일의 블록 범위는 변하지 않는다.


Reference

  1. 우분투에서 하드디스크 파티션 및 EXT4로 포맷하기 
  2. 리눅스 대용량 파일 생성
  3. An analysis of Ext4 for digital forensics
  4. Make huge files strictly contiguous (fallocate, bigalloc, e4defrag...)
  5. fallocate / posix_fallocate for new WAL file creation (etc...)
  6. fallocate man page (preallocation speed is quicker than creating a file)