리눅스 파일 시스템 완전 비교 — ext4 vs XFS vs Btrfs vs ZFS 포맷·마운트·실전 명령어
리눅스 파일 시스템 완전 비교 — ext4, XFS, Btrfs, ZFS
"어떤 파일 시스템으로 포맷해야 하지?" 리눅스 서버를 세팅할 때 가장 먼저 부딪히는 질문이다. 결론부터 말하면, 용도에 따라 정답이 달라진다. 이 글에서는 4대 파일 시스템의 기술적 차이를 실제 명령어와 함께 정리한다.
1. 파일 시스템 4종 한눈에 비교
| 항목 | ext4 | XFS | Btrfs | ZFS |
|---|---|---|---|---|
| 최대 볼륨 | 1 EB | 8 EB | 16 EB | 256 ZiB |
| 최대 파일 | 16 TB | 8 EB | 16 EB | 16 EB |
| 스냅샷 | 미지원(LVM 필요) | 미지원(LVM 필요) | 내장 (CoW) | 내장 (강력) |
| 압축 | 미지원 | 미지원 | 내장 (zstd/lzo) | 내장 (lz4/zstd) |
| RAID 내장 | mdadm 별도 | mdadm 별도 | 내장 RAID 0/1/5/6/10 | RAID-Z1/Z2/Z3 |
| 축소(Shrink) | 가능 | 불가능 | 가능 | 불가능 |
| 메모리 소모 | 매우 적음 | 적음 | 보통 | 많음 (RAM 1GB+/TB) |
| 커널 내장 | 예 | 예 | 예 | 아니오 (별도 설치) |
| 대표 사용처 | 범용 OS/서버 | DB/미디어 서버 | NAS/백업/가상화 | 스토리지 서버 |
2. 포맷 명령어 — 실전 코드
ext4 포맷 및 마운트
# 파티션 생성 (예: /dev/sdb1)
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 100%
# ext4 포맷
sudo mkfs.ext4 -L "data" /dev/sdb1
# 마운트
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
# fstab에 자동 마운트 등록 (UUID 사용 권장)
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /mnt/data ext4 defaults,noatime 0 2" | sudo tee -a /etc/fstab
XFS 포맷 및 마운트
# XFS 포맷
sudo mkfs.xfs -L "data-xfs" /dev/sdb1
# 마운트
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
# fstab 등록
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /mnt/data xfs defaults,noatime 0 2" | sudo tee -a /etc/fstab
Btrfs 포맷 및 마운트
# Btrfs 포맷 (단일 디스크)
sudo mkfs.btrfs -L "data-btrfs" /dev/sdb1
# 마운트
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
# 압축 활성화 마운트 (zstd 압축)
sudo mount -o compress=zstd /dev/sdb1 /mnt/data
# fstab 등록
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /mnt/data btrfs defaults,compress=zstd,noatime 0 0" | sudo tee -a /etc/fstab
ZFS 포맷 및 마운트
# ZFS 풀 생성 (단일 디스크)
sudo zpool create -f data-pool /dev/sdb1
# ZFS 파일 시스템 생성
sudo zfs create -o compression=lz4 -o atime=off data-pool/data
# 마운트 확인
zfs list
3. 스냅샷 — 왜 중요한가
스냅샷은 특정 시점의 파일 시스템 상태를 복사하는 기능이다. 랜섬웨어, 실수 삭제, 시스템 업데이트 실패 등에서 데이터를 보호하는 핵심 수단이다.
Btrfs 스냅샷
# 스냅샷 생성 (즉시 완료, 용량 거의 안 씀)
sudo btrfs subvolume snapshot /mnt/data /mnt/data/snapshots/snap-$(date +%Y%m%d)
# 스냅샷 목록 조회
sudo btrfs subvolume list /mnt/data
# 스냅샷에서 복구
sudo btrfs subvolume delete /mnt/data
sudo btrfs subvolume snapshot /mnt/data/snapshots/snap-20260923 /mnt/data
# 자동 스냅샷 (cron에 등록 예시)
echo "0 */6 * * * root btrfs subvolume snapshot /mnt/data /mnt/data/snapshots/snap-\$(date +\%Y\%m\%d-\%H\%M)" | sudo tee /etc/cron.d/btrfs-snapshot
ZFS 스냅샷
# 스냅샷 생성
sudo zfs snapshot data-pool/data@snap-20260923
# 스냅샷 목록
sudo zfs list -t snapshot
# 스냅샷 롤백
sudo zfs rollback data-pool/data@snap-20260923
# 자동 스냅샷 (zfs-auto-snapshot 설치 필요)
sudo zfs set com.sun:auto-snapshot=true data-pool/data
4. 성능 비교 — 실제로 얼마나 차이 나는가
디스크 IO 벤치마크 (fio)
# fio 설치
sudo apt install fio # Debian/Ubuntu
sudo dnf install fio # RHEL/Fedora
# 순수 쓰기 테스트 (4KB 랜덤, QD=32)
sudo fio --name=write-test --ioengine=libaio --direct=1 \
--bs=4k --iodepth=32 --rw=randwrite --size=1G \
--filename=/mnt/data/testfile
# 순수 읽기 테스트 (4KB 랜덤, QD=32)
sudo fio --name=read-test --ioengine=libaio --direct=1 \
--bs=4k --iodepth=32 --rw=randread --size=1G \
--filename=/mnt/data/testfile
# 혼합 읽기/쓰기 (70:30 비율)
sudo fio --name=mixed-test --ioengine=libaio --direct=1 \
--bs=4k --iodepth=32 --rw=randrw --rwmixread=70 --size=1G \
--filename=/mnt/data/testfile
벤치마크 결과 참고치 (일반적 SSD 기준)
| 테스트 | ext4 | XFS | Btrfs (압축 OFF) | Btrfs (zstd) |
|---|---|---|---|---|
| 4K 랜덤 쓰기 | 100% | 98~100% | 90~95% | 85~92% |
| 4K 랜덤 읽기 | 100% | 100% | 98~100% | 95~98% |
| 순차 쓰기 | 100% | 100% | 95~100% | 120~150% (압축 이점) |
| 메타데이터 조작 | 100% | 95% | 80~90% | 80~90% |
Btrfs의 zstd 압축은 순차 쓰기에서 압축 가능한 데이터(텍스트, 로그 등)일 경우 오히려 ext4보다 빠를 수 있다. 그러나 메타데이터가 많은 작업(수만 개 파일 생성/삭제)에서는 overhead가 발생한다.
5. 주요 파일 시스템 관리 명령어
ext4 관리
# 디스크 사용량 확인
df -hT /mnt/data
# 조각 모음 (온라인)
sudo e4defrag /mnt/data
# 파일 시스템 검사 (언마운트 후)
sudo umount /mnt/data
sudo e2fsck -f /dev/sdb1
# 용량 확장 (온라인)
sudo resize2fs /dev/sdb1
# 용량 축소 (언마운트 필수)
sudo umount /mnt/data
sudo e2fsck -f /dev/sdb1
sudo resize2fs /dev/sdb1 50G # 50GB로 축소
sudo parted /dev/sdb resizepart 1 50G
XFS 관리
# 디스크 사용량
df -hT /mnt/data
# 파일 시스템 검사
sudo xfs_repair /dev/sdb1
# 용량 확장 (온라인 가능)
sudo xfs_growfs /mnt/data
# 조각 모음
sudo xfs_fsr /mnt/data
# XFS는 축소 불가 — 파티션을 새로 만들어야 함
Btrfs 관리
# 파일 시스템 사용량 (실시간)
sudo btrfs filesystem usage /mnt/data
# 서브볼륨 목록
sudo btrfs subvolume list /mnt/data
# 압축 통계
sudo btrfs filesystem defragment -r -czstd /mnt/data
# 디스크 정리
sudo btrfs balance start /mnt/data
# RAID1 변환 (2개 디스크 필요)
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/data
ZFS 관리
# 풀 상태 확인
zpool status data-pool
zpool list
# 파일 시스템 사용량
zfs list
# 스냅샷 목록
zfs list -t snapshot
# 디스크 스트레스 테스트
zpool scrub data-pool
# 캐시(L2ARC) 추가
sudo zpool add data-pool cache /dev/sdc1
# 로그(SLOG) 추가
sudo zpool add data-pool log /dev/sdd1
6. 선택 가이드 — 어떤 환경에 어떤 파일 시스템
Case 1: "기본이면 충분하다" → ext4
# 리눅스 설치 시 기본값. 별도 설정 불필요.
sudo mkfs.ext4 /dev/sda1
일반 웹 서버, 개인 PC, Docker 호스트. 안정성이 검증되었고, 문제가 생겼을 때 복구 도구가 가장 잘 갖춰져 있다. 디폴트를 벗어나고 싶지 않다면 이것만 쓰면 된다.
Case 2: "대용량 DB나 미디어 파일" → XFS
# MySQL/PostgreSQL 데이터 디렉토리
sudo mkfs.xfs /dev/sdb1
sudo mount /dev/sdb1 /var/lib/mysql
동시 다발적인 대용량 I/O 처리에 강하다. RHEL/CentOS 계열에서는 기본값이다. 로그 서버, 미디어 서버, 대규모 데이터베이스에 적합하다.
Case 3: "스냅샷과 백업이 중요하다" → Btrfs
# Docker/가상머신 호스트
sudo mkfs.btrfs /dev/sdb1
sudo mount -o compress=zstd /dev/sdb1 /var/lib/docker
VM을 자주 만들고 지우는 환경, 랜섬웨어 대비, 컨테이너 호스트에 유용하다. 스냅샷이 거의 즉시 생성되고 용량도 거의 차지하지 않는다. 시놀로지 NAS의 기본 파일 시스템이기도 하다.
Case 4: "데이터 무결성이 생명이다" → ZFS
# NAS/백업 서버
sudo zpool create -f tank mirror /dev/sdb /dev/sdc
sudo zfs create -o compression=lz4 tank/data
여러 디스크를 묶어 안전한 저장소를 만들 때 최적이다. 데이터 오염을 스스로 감지하고 복구하는 Self-healing 기능, RAID-Z로 디스크 장애에서도 데이터 보호. 다만 RAM을 많이 쓰고, 별도 설치가 필요하다.
7. 요약 — 한 줄 결론
| 용도 | 추천 파일 시스템 |
|---|---|
| 범용 OS / 소형 서버 / Docker | ext4 |
| 대용량 DB / 로그 / 미디어 | XFS |
| 백업 / NAS / 가상화 / 컨테이너 | Btrfs |
| 엔터프라이즈 스토리지 / RAID | ZFS |
내 서비스의 데이터 크기와 I/O 패턴이 어떤지 먼저 파악한 뒤, 가장 알맞은 파일 시스템을 선택하라. "항상 최선"인 파일 시스템은 존재하지 않는다.
본 벤치마크 결과는 운영자 단일 환경에서 측정된 참고 수치이며, 하드웨어 및 워크로드에 따라 실제 성능은 달라질 수 있습니다.