목적
- 별도의 Driver를 구현하지 않고 User 영역에서 연속적인 매크로 블록 할당
요구사항
- 디스크가 EXT4 파일 시스템으로 포맷 되어야 한다.
- 디스크가 EXTENTS 속성으로 마운트 되어야 한다.
- 매크로 블록이 물리적으로 연속 할당되어야 한다. (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
결과
- 거의 모든 파일은 연속된 블록으로 할당된다.
- 낮은 빈도(0.667%)로 인접하지 않은 블록이 존재하지만 일방향으로 증가한다.
- 파일끼리도 물리적으로 인접하다.
- 생성된 파일을 수정해도 파일의 블록 범위는 변하지 않는다.
Reference
- 우분투에서 하드디스크 파티션 및 EXT4로 포맷하기
- 리눅스 대용량 파일 생성
- An analysis of Ext4 for digital forensics
- Make huge files strictly contiguous (fallocate, bigalloc, e4defrag...)
- fallocate / posix_fallocate for new WAL file creation (etc...)
- fallocate man page (preallocation speed is quicker than creating a file)
'Filesystem' 카테고리의 다른 글
EXT4 Extents : 매크로 블록에 쓰여진 데이터의 연속성 검증 (0) | 2015.04.04 |
---|---|
MBR과 GPT (0) | 2015.03.20 |
EXT4에 대한 이해 (Part 1) : Extents (3) | 2015.02.15 |