Making a Filesystem Inside a File
한국어 원문으로 표시합니다.
목표
평범한 파일 위에 진짜 ext4 파일시스템을 만들어, 슈퍼블록을 읽고 조정하고 내용을 들여다봅니다. 마지막에는 그 파일시스템을 마운트하는 fstab 줄을 UUID 로 작성합니다.
왜 중요한가
mkfs 는 대상이 블록 장치인지 평범한 파일인지 구분하지 않습니다. 그저 정해진 구조를 써 넣을 뿐입니다. 이 성질 덕분에 특권 없이도 파일시스템 내부를 학습할 수 있고, 실무에서도 이미지 파일을 만들어 검사하는 일이 흔합니다. 특히 inode 개수는 포맷 시점에 고정되어 나중에 늘릴 수 없다는 사실과 예약 블록 기본 5% 가 대용량 디스크에서 얼마나 낭비인지는 숫자로 봐야 실감이 납니다.
이 환경에는 mount 권한이 없으므로 실제로 붙이지는 않습니다. 대신 fstab 을 정확히 쓰는 것을 채점합니다 — 현장에서도 사고는 mount 명령이 아니라 fstab 한 줄에서 납니다.
단계
/root/disk디렉터리를 만들고/root/disk/lab.img를 256MiB 희소 파일로 만드세요. 그리고 논리 크기와 실제 점유 크기를 각각 한 줄씩/root/disk/sparse.txt에 적으세요(단위는 바이트, 논리 크기가 먼저).- 그 파일을 라벨
LABHUB로 ext4 포맷하세요. - 파일시스템 UUID 만 한 줄로
/root/disk/uuid.txt에 적으세요. - 슈퍼블록에서 블록 크기 / inode 개수 / 예약 블록 개수 세 값을 뽑아
/root/disk/super.txt에 다음 형식으로 적으세요.BLOCK_SIZE=<값>/INODE_COUNT=<값>/RESERVED_BLOCKS=<값> - 예약 블록 비율을 1% 로 낮추고, 변경 후의 예약 블록 개수를
/root/disk/reserved-after.txt에 숫자 한 줄로 적으세요. 4번보다 작아야 합니다. debugfs로 이미지 루트에data디렉터리를 만들고, 루트 목록을/root/disk/rootls.txt로 저장하세요. 목록에lost+found와data가 모두 있어야 합니다./root/disk/fstab.line에 이 파일시스템을/mnt/labdata에 마운트하는 fstab 줄을 한 줄 작성하세요. 장치는UUID=표기, 타입은ext4, 옵션에는defaults,noatime,nofail이 모두 포함, dump 는0, pass 는2여야 합니다./root/disk/report.txt를 다음 5줄로 만드세요.LABEL=LABHUB/UUID=<3번 값>/BLOCK_SIZE=<4번 값>/INODE_COUNT=<4번 값>/MOUNTPOINT=/mnt/labdata
참고
truncate -s 256M <파일>,mkfs.ext4 -F -L LABHUB <파일>,blkid <파일>,dumpe2fs -h <파일>,tune2fs -m 1 <파일>순서입니다.- 실제 점유 크기는
du -B1 <파일>, 논리 크기는du -B1 --apparent-size <파일>또는stat -c %s입니다. debugfs -w -R 'mkdir /data' <파일>로 쓰기 작업을,debugfs -R 'ls -l /' <파일>로 조회를 합니다.- 흔한 실수 1:
mkfs.ext4가 "not a block special device" 로 물어볼 때-F없이 넘어가지 못하는 경우. - 흔한 실수 2: 7번에서 UUID 값에 따옴표를 붙이는 경우. fstab 에는 따옴표를 쓰지 않습니다.
희소 이미지 파일 만들기
/root/disk 디렉터리를 만들고 /root/disk/lab.img 를 256MiB 희소 파일로 만드세요. 그리고 논리 크기와 실제 점유 크기를 각각 한 줄씩 /root/disk/sparse.txt 에 적으세요(단위는 바이트, 논리 크기가 먼저).
truncate 는 실제 블록을 할당하지 않고 크기만 지정합니다. du 의 두 가지 크기를 비교해 보세요.
ext4 포맷하기
그 파일을 라벨 LABHUB 로 ext4 포맷하세요.
블록 장치가 아니라고 경고가 나오면 강제 옵션이 필요합니다. 라벨을 지정하는 옵션도 함께 쓰세요.
UUID 추출
파일시스템 UUID 만 한 줄로 /root/disk/uuid.txt 에 적으세요.
blkid 는 파일에도 동작합니다. 출력에서 UUID 값만 뽑으려면 형식 지정 옵션이나 문자열 처리를 쓰세요.
슈퍼블록 읽기
슈퍼블록에서 블록 크기 / inode 개수 / 예약 블록 개수 세 값을 뽑아 /root/disk/super.txt 에 다음 형식으로 적으세요.
BLOCK_SIZE=<값> / INODE_COUNT=<값> / RESERVED_BLOCKS=<값>
dumpe2fs 의 -h 는 슈퍼블록 정보만 출력합니다. 세 항목의 값이 각각 무엇을 뜻하는지 생각해 보세요.
예약 블록 비율 변경
예약 블록 비율을 1% 로 낮추고, 변경 후의 예약 블록 개수를 /root/disk/reserved-after.txt 에 숫자 한 줄로 적으세요. 4번보다 작아야 합니다.
tune2fs 의 -m 은 퍼센트로 지정합니다. 변경 후 dumpe2fs 로 다시 확인하세요.
이미지 안 들여다보기
debugfs 로 이미지 루트에 data 디렉터리를 만들고, 루트 목록을 /root/disk/rootls.txt 로 저장하세요. 목록에 lost+found 와 data 가 모두 있어야 합니다.
debugfs 는 -R 로 명령 하나를 실행합니다. 쓰기 작업에는 별도 옵션이 필요합니다.
fstab 줄 작성
/root/disk/fstab.line 에 이 파일시스템을 /mnt/labdata 에 마운트하는 fstab 줄을 한 줄 작성하세요. 장치는 UUID= 표기, 타입은 ext4, 옵션에는 defaults, noatime, nofail 이 모두 포함, dump 는 0, pass 는 2 여야 합니다.
여섯 필드를 공백으로 구분합니다. 장치는 UUID= 표기로, 옵션에는 세 가지가 들어가야 합니다.
이미지 요약 보고서
/root/disk/report.txt 를 다음 5줄로 만드세요.
LABEL=LABHUB / UUID=<3번 값> / BLOCK_SIZE=<4번 값> / INODE_COUNT=<4번 값> / MOUNTPOINT=/mnt/labdata
앞 단계에서 뽑은 값들을 키=값으로 모으면 됩니다. 숫자는 단위 없이 적으세요.