--- title: 리눅스 파일 시스템 완전 비교 — ext4 vs XFS vs Btrfs vs ZFS 포맷·마운트·실전 명령어 date: 2026-09-23 time: "22:35" model: admin category: knowhow summary: 리눅스 4대 파일 시스템(ext4/XFS/Btrfs/ZFS)의 기술적 차이, 포맷·마운트·스냅샷·성능 테스트 명령어까지 실무 코드 예제 중심으로 정리. 어떤 환경에 어떤 파일 시스템을 써야 하는지 선택 가이드 포함. tags: 리눅스,파일시스템,ext4,XFS,Btrfs,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 포맷 및 마운트 ```bash # 파티션 생성 (예: /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 포맷 및 마운트 ```bash # 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 포맷 및 마운트 ```bash # 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 포맷 및 마운트 ```bash # 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 스냅샷 ```bash # 스냅샷 생성 (즉시 완료, 용량 거의 안 씀) 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 스냅샷 ```bash # 스냅샷 생성 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) ```bash # 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 관리 ```bash # 디스크 사용량 확인 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 관리 ```bash # 디스크 사용량 df -hT /mnt/data # 파일 시스템 검사 sudo xfs_repair /dev/sdb1 # 용량 확장 (온라인 가능) sudo xfs_growfs /mnt/data # 조각 모음 sudo xfs_fsr /mnt/data # XFS는 축소 불가 — 파티션을 새로 만들어야 함 ``` ### Btrfs 관리 ```bash # 파일 시스템 사용량 (실시간) 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 관리 ```bash # 풀 상태 확인 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** ```bash # 리눅스 설치 시 기본값. 별도 설정 불필요. sudo mkfs.ext4 /dev/sda1 ``` 일반 웹 서버, 개인 PC, Docker 호스트. 안정성이 검증되었고, 문제가 생겼을 때 복구 도구가 가장 잘 갖춰져 있다. 디폴트를 벗어나고 싶지 않다면 이것만 쓰면 된다. ### Case 2: "대용량 DB나 미디어 파일" → **XFS** ```bash # MySQL/PostgreSQL 데이터 디렉토리 sudo mkfs.xfs /dev/sdb1 sudo mount /dev/sdb1 /var/lib/mysql ``` 동시 다발적인 대용량 I/O 처리에 강하다. RHEL/CentOS 계열에서는 기본값이다. 로그 서버, 미디어 서버, 대규모 데이터베이스에 적합하다. ### Case 3: "스냅샷과 백업이 중요하다" → **Btrfs** ```bash # Docker/가상머신 호스트 sudo mkfs.btrfs /dev/sdb1 sudo mount -o compress=zstd /dev/sdb1 /var/lib/docker ``` VM을 자주 만들고 지우는 환경, 랜섬웨어 대비, 컨테이너 호스트에 유용하다. 스냅샷이 거의 즉시 생성되고 용량도 거의 차지하지 않는다. 시놀로지 NAS의 기본 파일 시스템이기도 하다. ### Case 4: "데이터 무결성이 생명이다" → **ZFS** ```bash # 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 패턴이 어떤지 먼저 파악한 뒤, 가장 알맞은 파일 시스템을 선택하라. "항상 최선"인 파일 시스템은 존재하지 않는다. --- *본 벤치마크 결과는 운영자 단일 환경에서 측정된 참고 수치이며, 하드웨어 및 워크로드에 따라 실제 성능은 달라질 수 있습니다.*