목차
- ZFS를 Proxmox에 올리면 생기는 일
- ZFS가 뭔지 먼저 짚고 가겠습니다
- 쉽게 말해서 ZFS는 "똑똑한 파일 시스템"입니다
- Proxmox VE에서 ZFS 스토리지를 쓰면 좋은 이유
- Proxmox VE ZFS 풀(Pool) 구성하기
- 1단계: ZFS 풀 생성 전 디스크 확인
- 2단계: ZFS 풀 생성
- 3단계: Proxmox에 ZFS 스토리지 등록
- ZFS 성능 최적화 핵심 설정
- ARC 메모리 설정 — 제일 중요합니다
- L2ARC와 ZIL/SLOG 설정 — SSD 있으면 써먹어야죠
- ZFS 데이터셋 최적화 설정
- Scrub(스크럽, 데이터 무결성 검사) 자동화
- ⚠️ 실제로 겪은 문제들과 해결법
- 문제 1: VM 성능이 생각보다 안 나온다
- 문제 2: 디스크 오류 발견 시 대응
- 문제 3: 스냅샷이 쌓여서 공간이 부족해진다
- ZFS 스토리지 상태 검증하기
- 일상적인 헬스체크 루틴
- 성능 벤치마크 기준점 잡기
- 정리: ZFS 최적화 체크리스트
- 필수 설정 체크리스트
- 자주 묻는 질문 (FAQ)
- 마무리하며
ZFS를 Proxmox에 올리면 생기는 일
홈랩을 운영하다 보면 어느 순간 이런 생각이 드시죠. "스토리지 관리 좀 제대로 해보고 싶다." 저도 그랬거든요. 처음엔 그냥 ext4 파티션에 LVM(논리 볼륨 관리자) 얹어서 쓰다가, 어느 날 디스크 하나가 조용히 세상을 떠나면서 VM 이미지를 통째로 날린 경험이 있습니다. 그날 이후로 ZFS(Zettabyte File System)를 진지하게 공부하기 시작했어요.
Proxmox VE ZFS 조합은 사실 홈랩 커뮤니티에서 꽤 오래된 조합입니다. Proxmox VE가 ZFS를 기본 지원하기 시작한 이후로, 별도의 커널 모듈 컴파일 없이도 ZFS를 바로 쓸 수 있게 됐거든요. 근데 막상 써보면 "설치는 쉬운데, 최적화는 어디서부터 시작해야 하지?" 하는 막막함이 있더라고요. 오늘은 그 막막함을 같이 해소해 보겠습니다.
▲ Proxmox VE + ZFS 스토리지 구성 전체 아키텍처 — VM/CT 레이어부터 ZFS 풀(Pool), 물리 디스크까지의 계층 구조를 보여줍니다.
ZFS가 뭔지 먼저 짚고 가겠습니다
쉽게 말해서 ZFS는 "똑똑한 파일 시스템"입니다
일반 파일 시스템과 ZFS의 가장 큰 차이점은, ZFS가 파일 시스템과 볼륨 관리자를 동시에 담당한다는 점이에요. 기존에는 파티션 → LVM → 파일 시스템 이렇게 레이어가 쌓였다면, ZFS는 이걸 하나로 통합해서 관리합니다.
핵심 기능만 짚어볼게요:
- Copy-on-Write(CoW, 쓰기 시 복사): 데이터를 덮어쓰지 않고 항상 새 블록에 씁니다. 시스템이 갑자기 꺼져도 데이터가 깨지지 않아요.
- Checksum(체크섬, 데이터 무결성 검증): 모든 블록에 체크섬이 붙어 있어서, 읽을 때마다 데이터가 정상인지 자동으로 확인합니다. Silent Data Corruption(무음 데이터 손상)을 잡아내는 거죠.
- Snapshot(스냅샷): 순간적으로 파일 시스템 상태를 저장합니다. Proxmox에서 VM 백업할 때 이게 핵심이에요.
- RAID-Z(레이드-Z): 소프트웨어 RAID를 ZFS 레벨에서 처리합니다. 하드웨어 RAID 컨트롤러 없이도 충분한 안정성을 확보할 수 있어요.
- ARC(Adaptive Replacement Cache, 적응형 교체 캐시): RAM을 읽기 캐시로 활용합니다. 메모리가 많을수록 성능이 올라가요.
Proxmox VE에서 ZFS 스토리지를 쓰면 좋은 이유
솔직히 말하면, Proxmox + ZFS 조합의 가장 큰 장점은 스냅샷 기반 백업이 기가 막히게 편하다는 겁니다. VM을 백업할 때 ZFS 스냅샷을 찍으면 거의 순간적으로 완료되거든요. 100GB짜리 VM이라도 스냅샷 자체는 1초도 안 걸립니다. 실제 데이터 복사가 아니라 메타데이터만 기록하는 방식이라서요.
| 항목 | 기존 LVM + ext4 | ZFS |
|---|---|---|
| 데이터 무결성 | 파일 시스템 레벨만 | 블록 레벨 체크섬 |
| 스냅샷 속도 | 데이터 크기에 비례 | 거의 즉각적 |
| RAID 관리 | 별도 mdadm 필요 | ZFS 내장 |
| 압축 | 지원 안 함 | 투명 압축 지원 |
| RAM 요구량 | 낮음 | 높음 (ARC 때문에) |
| 설정 복잡도 | 낮음 | 중간~높음 |
Proxmox VE ZFS 풀(Pool) 구성하기
1단계: ZFS 풀 생성 전 디스크 확인
먼저 사용할 디스크들을 확인합니다. 중요한 건 ZFS는 반드시 디스크 전체를 넘겨줘야 한다는 거예요. 파티션 위에 ZFS를 올리는 것도 기술적으로는 가능하지만, 권장하지 않습니다. 저도 처음에 파티션 위에 올렸다가 나중에 풀 교체하는 데 고생했거든요.
# 현재 연결된 디스크 목록 확인
lsblk -d -o NAME,SIZE,MODEL,SERIAL
# 디스크 상태 확인 (스마트 정보)
smartctl -a /dev/sdb
# ZFS에서 사용할 디스크 ID 확인 (권장: ID 방식으로 지정)
ls -la /dev/disk/by-id/ | grep -v part
💡 팁: ZFS 풀 생성 시 /dev/sdb 같은 경로 대신 /dev/disk/by-id/ 아래의 ID를 사용하세요. 재부팅 후 디스크 순서가 바뀌어도 안전합니다.
2단계: ZFS 풀 생성
Proxmox에서 ZFS 풀을 만드는 방법은 두 가지입니다. GUI로 하거나 CLI로 하거나. 저는 CLI를 선호해요. 정확히 뭘 하는지 눈에 보이니까요.
# 미러(Mirror, RAID-1과 유사) 풀 생성 예시 — 디스크 2개
zpool create -o ashift=12 \
-O compression=lz4 \
-O atime=off \
-O xattr=sa \
-O dnodesize=auto \
rpool mirror \
/dev/disk/by-id/ata-디스크1_시리얼 \
/dev/disk/by-id/ata-디스크2_시리얼
# RAID-Z1 풀 생성 예시 — 디스크 3개 이상
zpool create -o ashift=12 \
-O compression=lz4 \
-O atime=off \
-O xattr=sa \
-O dnodesize=auto \
datapool raidz1 \
/dev/disk/by-id/ata-디스크1_시리얼 \
/dev/disk/by-id/ata-디스크2_시리얼 \
/dev/disk/by-id/ata-디스크3_시리얼
여기서 각 옵션이 뭔지 짚어볼게요:
ashift=12: 4KB 섹터 디스크에 맞는 설정. 요즘 HDD/SSD 대부분이 4KB 섹터 또는 그 이상이라서 거의 필수입니다. 풀 생성 후 변경 불가니까 처음에 꼭 확인하세요.compression=lz4: LZ4 압축 활성화. CPU 부하가 거의 없으면서 10~30% 정도 공간을 아낄 수 있어요.atime=off: 파일 접근 시간 기록 비활성화. I/O 성능 향상에 도움이 됩니다.xattr=sa: 확장 속성을 inode에 저장. 성능 향상에 기여해요.dnodesize=auto: dnode 크기 자동 조정. 대용량 파일 시스템에 유리합니다.
3단계: Proxmox에 ZFS 스토리지 등록
풀을 만들었으면 Proxmox가 이걸 스토리지로 인식하게 해줘야 합니다.
# /etc/pve/storage.cfg 에 추가하거나
# Proxmox GUI: Datacenter > Storage > Add > ZFS 선택
# CLI로 추가하는 방법
pvesm add zfspool datapool-storage \
--pool datapool \
--content images,rootdir \
--sparse 1
GUI에서 하시면 Datacenter → Storage → Add → ZFS 선택하고 풀 이름 입력하면 됩니다. 훨씬 직관적이에요.
▲ Proxmox VE 관리 콘솔에서 ZFS 풀을 스토리지로 등록하는 화면 — 풀 이름, Content 타입, Sparse 옵션 등을 설정합니다.
ZFS 성능 최적화 핵심 설정
ARC 메모리 설정 — 제일 중요합니다
ZFS의 ARC(Adaptive Replacement Cache)는 기본적으로 사용 가능한 RAM의 절반 정도까지 사용하려고 합니다. 홈랩이나 소규모 서버에서는 이게 VM들이 쓸 메모리를 잡아먹는 문제가 생겨요. 저도 처음에 이 설정 안 하고 쓰다가 "왜 VM이 이렇게 느리지?" 하면서 한참 삽질했습니다.
# 현재 ARC 사용량 확인
cat /proc/spl/kstat/zfs/arcstats | grep -E '^(size|c_max|c_min|hits|misses)'
# ARC 최대 크기 제한 설정 (예: 8GB로 제한)
# /etc/modprobe.d/zfs.conf 파일 생성/편집
cat > /etc/modprobe.d/zfs.conf << 'EOF'
options zfs zfs_arc_max=8589934592
EOF
# 즉시 적용 (재부팅 없이)
echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_max
# 변경 확인
cat /sys/module/zfs/parameters/zfs_arc_max
⚠️ 주의: ARC를 너무 작게 설정하면 ZFS 성능이 크게 떨어집니다. 일반적으로 전체 RAM의 20~25% 정도는 ARC에 남겨두는 걸 권장해요. 16GB RAM이면 최소 4GB는 ARC에 할당하는 게 좋습니다.
L2ARC와 ZIL/SLOG 설정 — SSD 있으면 써먹어야죠
SSD가 여분으로 있다면 L2ARC(Level 2 ARC, 2차 읽기 캐시)와 SLOG(Separate Intent Log, 분리 의도 로그)로 활용할 수 있습니다.
# L2ARC 추가 (읽기 캐시, SSD 권장)
zpool add datapool cache /dev/disk/by-id/ssd-캐시디스크_시리얼
# SLOG/ZIL 추가 (쓰기 캐시, 저지연 SSD 권장)
# 미러 구성을 강력히 권장 (SLOG 손실 시 데이터 손실 위험)
zpool add datapool log mirror \
/dev/disk/by-id/ssd-slog1_시리얼 \
/dev/disk/by-id/ssd-slog2_시리얼
# 현재 풀 구성 확인
zpool status datapool
💡 팁: SLOG는 반드시 미러로 구성하세요. SLOG 디스크가 고장나면 최근 쓰기 데이터가 날아갈 수 있거든요. 비용이 두 배가 되더라도 미러가 맞습니다.
ZFS 데이터셋 최적화 설정
Proxmox에서 VM 이미지를 저장하는 데이터셋은 별도로 최적화해 주는 게 좋아요. VM 워크로드 특성에 맞게요.
# VM 이미지용 데이터셋 최적화
# recordsize를 VM 디스크 블록 크기에 맞게 조정
zfs set recordsize=64K datapool/images
# 또는 데이터베이스 VM이 많다면
zfs set recordsize=16K datapool/images
# 압축 설정 (lz4가 성능/압축률 균형이 좋음)
zfs set compression=lz4 datapool
# 현재 데이터셋 속성 확인
zfs get all datapool | grep -E '(compression|recordsize|atime|sync)'
# sync 설정 (주의: disabled는 데이터 손실 위험 있음)
# VM이 많고 성능이 중요하다면 standard 유지 권장
zfs set sync=standard datapool/images
Scrub(스크럽, 데이터 무결성 검사) 자동화
ZFS의 핵심 기능 중 하나가 스크럽이에요. 모든 데이터 블록을 읽어서 체크섬을 검증하는 작업인데, 주기적으로 해줘야 Silent Data Corruption을 조기에 발견할 수 있습니다.
# 수동으로 스크럽 실행
zpool scrub datapool
# 스크럽 진행 상황 확인
zpool status datapool
# 자동 스크럽 설정 (Proxmox는 기본적으로 월 1회 cron 설정됨)
# /etc/cron.d/zfsutils-linux 확인
cat /etc/cron.d/zfsutils-linux
# 직접 cron 설정 (매월 1일 새벽 2시)
crontab -e
# 아래 내용 추가:
# 0 2 1 * * /sbin/zpool scrub datapool
⚠️ 실제로 겪은 문제들과 해결법
문제 1: VM 성능이 생각보다 안 나온다
ZFS를 처음 올렸을 때 "왜 이렇게 느리지?" 하는 경험을 많이들 하세요. 저도 그랬는데, 원인이 몇 가지 있더라고요.
원인 및 해결책:
- ashift 설정 오류:
zpool status -v로 확인. 이미 풀이 생성됐다면 재생성 외에는 방법이 없어요. 처음부터ashift=12를 꼭 넣어주세요. - ARC 부족:
arcstat명령으로 hit ratio 확인. 70% 이하면 ARC가 부족한 겁니다. - recordsize 불일치: VM 워크로드에 따라 recordsize를 조정하세요. 랜덤 I/O가 많은 DB 워크로드는 작은 recordsize가 유리합니다.
# ARC 히트율 확인
arcstat 1 5
# ZFS I/O 통계 모니터링
zpool iostat -v datapool 2
# 상세 ZFS 통계
zfs-stats -a
문제 2: 디스크 오류 발견 시 대응
어느 날 아침에 zpool status를 실행했더니 DEGRADED 상태가 뜨는 경험을 한 적이 있습니다. 심장이 쿵 내려앉더라고요. 근데 ZFS가 있으니까 침착하게 대응할 수 있었어요.
# 풀 상태 확인
zpool status -v datapool
# 오류 난 디스크 교체 후 resilvering(데이터 재동기화) 시작
# 1. 오류 디스크 오프라인 처리
zpool offline datapool /dev/disk/by-id/문제디스크_시리얼
# 2. 물리적으로 디스크 교체 후 새 디스크 지정
zpool replace datapool \
/dev/disk/by-id/문제디스크_시리얼 \
/dev/disk/by-id/새디스크_시리얼
# 3. resilvering 진행 상황 확인
zpool status datapool
문제 3: 스냅샷이 쌓여서 공간이 부족해진다
Proxmox 자동 백업 설정해 놓으면 스냅샷이 계속 쌓입니다. 어느 순간 "왜 공간이 이렇게 없지?" 하고 보면 스냅샷이 수십 개 쌓여 있는 경우가 있어요.
# 스냅샷 목록 확인
zfs list -t snapshot -o name,used,creation | sort -k3
# 오래된 스냅샷 삭제
zfs destroy datapool/images/vm-100-disk-0@2024-01-01
# 특정 패턴의 스냅샷 일괄 삭제 (주의해서 사용!)
zfs list -t snapshot -H -o name | grep 'vm-100' | xargs -n1 zfs destroy
# Proxmox 백업 보존 정책 설정 (GUI 권장)
# Datacenter > Backup > 해당 작업 편집 > Keep 설정
▲ ZFS ARC 히트율과 풀 I/O 성능 모니터링 — arcstat 및 zpool iostat 출력 결과를 시각화한 예시입니다. 히트율 80% 이상을 목표로 합니다.
ZFS 스토리지 상태 검증하기
일상적인 헬스체크 루틴
이 명령어들은 저도 주기적으로 확인하는 것들이에요. 습관처럼 만들어 두면 정말 든든합니다.
# 전체 풀 상태 한눈에 보기
zpool status
# 풀 사용량 확인
zpool list
# 데이터셋별 사용량 (스냅샷 포함)
zfs list -t all -o name,used,avail,refer,mountpoint
# 압축 효율 확인
zfs get compressratio datapool
# 전체 ZFS 이벤트 로그 확인
zpool events -v | tail -50
성능 벤치마크 기준점 잡기
최적화 전후를 비교하려면 기준점이 있어야 하죠. fio(Flexible I/O Tester)로 간단히 측정해 볼 수 있습니다.
# fio 설치
apt install fio
# 순차 쓰기 테스트
fio --name=seqwrite \
--filename=/datapool/testfile \
--rw=write \
--bs=1M \
--size=4G \
--numjobs=1 \
--ioengine=libaio \
--direct=1 \
--group_reporting
# 랜덤 읽기 테스트 (4K 블록)
fio --name=randread \
--filename=/datapool/testfile \
--rw=randread \
--bs=4K \
--size=4G \
--numjobs=4 \
--ioengine=libaio \
--direct=1 \
--group_reporting
# 테스트 파일 정리
rm /datapool/testfile
정리: ZFS 최적화 체크리스트
▲ Proxmox VE ZFS 최적화 핵심 설정 요약 — 풀 생성부터 ARC 튜닝, 스크럽 자동화까지 단계별 체크리스트입니다.
지금까지 다룬 내용을 정리해 보겠습니다. 처음엔 복잡해 보여도, 하나씩 따라가면 충분히 할 수 있어요.
필수 설정 체크리스트
- ✅ ashift=12 — 풀 생성 시 반드시 지정
- ✅ compression=lz4 — 성능 영향 없이 공간 절약
- ✅ atime=off — 불필요한 I/O 제거
- ✅ ARC 크기 제한 — VM 메모리와 균형 맞추기
- ✅ 정기 스크럽 — 월 1회 이상 실행
- ✅ 디스크 ID 방식 사용 — 재부팅 후 안정성 확보
- ✅ 스냅샷 보존 정책 — 디스크 공간 관리
- ✅ SLOG 미러 구성 — SLOG 사용 시 필수
자주 묻는 질문 (FAQ)
Q. ZFS는 ECC 메모리가 없으면 위험한가요?
A. ECC 메모리가 없어도 ZFS를 쓸 수 있습니다. 다만 메모리 오류로 인한 데이터 손상 가능성이 이론적으로 존재해요. 홈랩 수준에서는 크게 걱정 안 해도 되지만, 프로덕션 환경이라면 ECC를 권장합니다.
Q. ZFS 풀 크기를 나중에 늘릴 수 있나요?
A. 네, 가능합니다. 미러 풀은 동일한 크기의 디스크 쌍을 추가해서 확장할 수 있어요. RAID-Z는 같은 VDEV(가상 디바이스) 내에서 디스크 추가가 어렵고, 새 VDEV를 추가하는 방식으로 확장합니다.
Q. 압축을 켜면 CPU 사용률이 많이 올라가나요?
A. lz4 압축은 CPU 영향이 매우 적습니다. 요즘 프로세서에서는 거의 체감이 안 될 정도예요. 오히려 I/O 양이 줄어서 전체 성능이 올라가는 경우도 있어요.
마무리하며
Proxmox VE ZFS 조합은 한번 제대로 세팅해 두면 정말 든든합니다. 디스크 하나가 죽어도 침착하게 교체하고 resilvering 기다리면 되고, 실수로 VM 날려도 스냅샷에서 복구하면 되고. 처음 세팅이 좀 복잡해 보이지만, 그 이후의 편안함은 진짜 다르더라고요.
물론 ZFS가 만능은 아닙니다. 메모리를 많이 먹고, 설정이 복잡하고, 한번 만든 풀 구조를 바꾸기 어렵다는 단점도 있어요. 그래도 데이터 안정성과 스냅샷 편의성을 생각하면, 홈랩에서 ZFS를 선택하지 않을 이유가 없다고 생각합니다.
다음 글에서는 Proxmox VE의 백업 자동화와 원격 ZFS 복제(Replication)를 다뤄볼 예정이에요. 오늘 설정한 ZFS 풀을 활용해서 다른 서버로 데이터를 자동으로 복제하는 방법인데, 이것도 꽤 유용하더라고요. 기대해 주세요!
궁금한 점이나 다른 삽질 경험이 있으시면 댓글로 공유해 주세요. 같이 해결해 봐요!
'IT > Proxmox' 카테고리의 다른 글
| [Proxmox] Proxmox 백업 자동화 완벽 가이드: PBS 및 스케줄 백업 활용 (0) | 2026.04.26 |
|---|---|
| [Proxmox] Proxmox VE Ceph 클러스터 구축 및 관리 완벽 가이드 (0) | 2026.04.26 |
| [Proxmox] Proxmox VE 백업 및 복원 전략: 안전한 가상 환경 운영 가이드 (1) | 2026.04.19 |
| [Proxmox] Proxmox 클러스터 HA 설정: 고가용성 구성 완벽 가이드 2026 (1) | 2026.04.17 |
| [Proxmox] GPU 패스스루 설정 완벽 가이드: 게임 및 AI 워크로드 최적화 (1) | 2026.04.16 |
| [Proxmox] 리눅스 커널 7.0 출시 현황과 6.x 최신 동향 완벽 가이드 (1) | 2026.04.15 |