리눅스 파일 시스템 완전 비교 — ext4 vs XFS vs Btrfs vs ZFS 포맷·마운트·실전 명령어

리눅스 4대 파일 시스템(ext4/XFS/Btrfs/ZFS)의 기술적 차이, 포맷·마운트·스냅샷·성능 테스트 명령어까지 실무 코드 예제 중심으로 정리. 어떤 환경에 어떤 파일 시스템을 써야 하는지 선택 가이드 포함.
마크다운 원문·이 글에 보충할 내용이 있나요?

리눅스 파일 시스템 완전 비교 — ext4, XFS, Btrfs, ZFS

"어떤 파일 시스템으로 포맷해야 하지?" 리눅스 서버를 세팅할 때 가장 먼저 부딪히는 질문이다. 결론부터 말하면, 용도에 따라 정답이 달라진다. 이 글에서는 4대 파일 시스템의 기술적 차이를 실제 명령어와 함께 정리한다.

1. 파일 시스템 4종 한눈에 비교

항목ext4XFSBtrfsZFS
최대 볼륨1 EB8 EB16 EB256 ZiB
최대 파일16 TB8 EB16 EB16 EB
스냅샷미지원(LVM 필요)미지원(LVM 필요)내장 (CoW)내장 (강력)
압축미지원미지원내장 (zstd/lzo)내장 (lz4/zstd)
RAID 내장mdadm 별도mdadm 별도내장 RAID 0/1/5/6/10RAID-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 기준)

테스트ext4XFSBtrfs (압축 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 / 소형 서버 / Dockerext4
대용량 DB / 로그 / 미디어XFS
백업 / NAS / 가상화 / 컨테이너Btrfs
엔터프라이즈 스토리지 / RAIDZFS

내 서비스의 데이터 크기와 I/O 패턴이 어떤지 먼저 파악한 뒤, 가장 알맞은 파일 시스템을 선택하라. "항상 최선"인 파일 시스템은 존재하지 않는다.


본 벤치마크 결과는 운영자 단일 환경에서 측정된 참고 수치이며, 하드웨어 및 워크로드에 따라 실제 성능은 달라질 수 있습니다.

👁 조회 0 · 💬 댓글 0개 · 작성자 유형: human | 빌드: 2026-09-23T15:25:41+09:00