ทำไมต้อง ZFS
ผมเริ่มใช้ ZFS ตั้งแต่ปี 2012 บน FreeBSD และ migrate มา ZFS on Linux ตั้งแต่ปี 2018 ในปี 2026 ZFS เป็น filesystem ที่ดีที่สุดสำหรับ data storage ที่ต้องการ data integrity ที่สมบูรณ์แบบ
ZFS แตกต่างจาก ext4/XFS ตรงที่มันรวม filesystem + volume manager + RAID เข้าด้วยกันมี checksumming ทุก block ทำให้ตรวจจับ bit rot (silent data corruption) ได้มี copy-on-write ที่ทำให้ snapshots ไม่กิน space เพิ่มมี compression ในตัวและ replication ที่ส่ง incremental snapshots ข้าม network ได้
ZFS กับ Btrfs
Btrfs มี features คล้ายกันแต่ ZFS mature กว่ามาก RAID-Z ของ ZFS เสถียรกว่า RAID ของ Btrfs มาก (RAID5/6 ของ Btrfs ยังมี write hole problem) ZFS มี user community ใหญ่กว่า documentation ดีกว่าผมใช้ ZFS สำหรับ production storage ทั้งหมด
ติดตั้ง OpenZFS
# Ubuntu 24.04
apt install zfsutils-linux
# RHEL/Rocky 9
dnf install epel-release
dnf install kernel-devel
dnf install https://zfsonlinux.org/epel/zfs-release-2-3.el9.noarch.rpm
dnf install zfs
modprobe zfs
# ตรวจสอบ
zfs version
# zfs-2.2.x
# zfs-kmod-2.2.x
# ตรวจสอบ kernel module
lsmod | grep zfs
RAID-Z Levels
mirror — เหมือน RAID1, ทนได้ 1 disk fail ต่อ mirror pair, performance ดีที่สุด raidz1 — เหมือน RAID5, ทนได้ 1 disk fail, ประหยัด space raidz2 — เหมือน RAID6, ทนได้ 2 disk fail, แนะนำสำหรับ production raidz3 — ทนได้ 3 disk fail, สำหรับ large arrays
สร้าง Pool
# ดู disks ที่มี
lsblk
# sda 100G (system)
# sdb 2T (data)
# sdc 2T (data)
# sdd 2T (data)
# sde 2T (data)
# sdf 500G (SSD cache)
# สร้าง RAID-Z2 pool (ทนได้ 2 disk fail)
zpool create -f \
-o ashift=12 \
-O atime=off \
-O compression=lz4 \
-O recordsize=128K \
-O xattr=sa \
-O acltype=posixacl \
tank raidz2 sdb sdc sdd sde
# เพิ่ม SSD cache (L2ARC)
zpool add tank cache sdf
# ดู pool status
zpool status tank
# NAME STATE READ WRITE CKSUM
# tank ONLINE 0 0 0
# raidz2-0 ONLINE 0 0 0
# sdb ONLINE 0 0 0
# sdc ONLINE 0 0 0
# sdd ONLINE 0 0 0
# sde ONLINE 0 0 0
# cache
# sdf ONLINE 0 0 0
# ดู capacity
zpool list tank
# NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH
# tank 7.27T 480K 7.27T - - 0% 0% 1.00x ONLINE
# Mirror pool (2 pairs)
zpool create tank mirror sdb sdc mirror sdd sde
สร้าง Datasets
# สร้าง datasets (เหมือน directories แต่มี properties แยก)
zfs create tank/data
zfs create tank/backup
zfs create tank/vms
zfs create tank/mysql
# ตั้งค่า properties ตาม use case
# Data storage — LZ4 compression, large recordsize
zfs set compression=lz4 tank/data
zfs set recordsize=1M tank/data
# MySQL — ต้องการ small recordsize
zfs set recordsize=16K tank/mysql
zfs set primarycache=metadata tank/mysql
zfs set logbias=throughput tank/mysql
# VMs — no compression (VM images ส่วนใหญ่ compress ไม่ได้มาก)
zfs set compression=off tank/vms
zfs set recordsize=64K tank/vms
# Backup — ZSTD compression สูงสุด
zfs set compression=zstd-9 tank/backup
# ดู datasets
zfs list
# NAME USED AVAIL REFER MOUNTPOINT
# tank 480K 3.53T 96K /tank
# tank/backup 96K 3.53T 96K /tank/backup
# tank/data 96K 3.53T 96K /tank/data
# tank/mysql 96K 3.53T 96K /tank/mysql
# tank/vms 96K 3.53T 96K /tank/vms
# ดู compression ratio
zfs get compressratio tank/data
Quotas และ Reservations
# จำกัด space
zfs set quota=500G tank/backup
zfs set quota=1T tank/data
# Reserve space (guaranteed)
zfs set reservation=200G tank/mysql
# Refquota — จำกัดเฉพาะ dataset (ไม่รวม snapshots)
zfs set refquota=100G tank/data
Snapshots — Instant Backup
ZFS snapshots เป็น feature ที่ทรงพลังมากสร้างได้ทันที (milliseconds) ไม่กิน space เพิ่มจนกว่าจะมีการเปลี่ยนแปลง data เหมาะสำหรับ backup ก่อน update, rollback เมื่อมีปัญหา
สร้างและจัดการ Snapshots
# สร้าง snapshot
zfs snapshot tank/data@before-update
zfs snapshot tank/data@2026-02-28
# สร้าง recursive snapshot (ทุก child datasets)
zfs snapshot -r tank@daily-2026-02-28
# ดู snapshots
zfs list -t snapshot
# NAME USED AVAIL REFER MOUNTPOINT
# tank/data@before-update 0B - 100M -
# tank/data@2026-02-28 0B - 100M -
# ดู disk usage ของ snapshot
zfs list -t snapshot -o name, used, refer tank/data
# Rollback ไปยัง snapshot
zfs rollback tank/data@before-update
# ลบ snapshot
zfs destroy tank/data@before-update
# เข้าถึงไฟล์ใน snapshot (read-only)
ls /tank/data/.zfs/snapshot/2026-02-28/
# สามารถ copy ไฟล์กลับมาได้โดยไม่ต้อง rollback ทั้ง dataset
Automated Snapshots
#!/bin/bash
# /usr/local/bin/zfs-auto-snapshot.sh
DATE=$(date +%Y-%m-%d_%H%M)
RETENTION_DAILY=30
RETENTION_HOURLY=48
# สร้าง snapshot
zfs snapshot -r tank@auto-
# ลบ snapshots เก่ากว่า 30 วัน
zfs list -t snapshot -o name -H | grep "tank@auto-" | while read snap; do
SNAP_DATE=$(echo "$snap" | sed 's/.*@auto-//' | cut -d_ -f1)
SNAP_EPOCH=$(date -d "$SNAP_DATE" +%s 2>/dev/null || echo 0)
CUTOFF_EPOCH=$(date -d "- days" +%s)
if [ "$SNAP_EPOCH" -lt "$CUTOFF_EPOCH" ] && [ "$SNAP_EPOCH" -gt 0 ]; then
echo "Destroying old snapshot: $snap"
zfs destroy "$snap"
fi
done
# Crontab: ทุกชั่วโมง
# 0 * * * * /usr/local/bin/zfs-auto-snapshot.sh
# หรือใช้ sanoid (recommended) — automated snapshot manager
# apt install sanoid
# /etc/sanoid/sanoid.conf
# [tank/data]
# use_template = production
# [template_production]
# hourly = 48
# daily = 30
# monthly = 12
# autosnap = yes
# autoprune = yes
ส่ง Snapshots ข้าม Network
# Full send (ครั้งแรก)
zfs send tank/data@2026-02-28 | ssh backup-server zfs receive backup-tank/data
# Incremental send (ครั้งต่อไป — ส่งเฉพาะ changes)
zfs send -i tank/data@2026-02-27 tank/data@2026-02-28 | \
ssh backup-server zfs receive backup-tank/data
# Compressed send (เร็วกว่าบน slow network)
zfs send -c tank/data@2026-02-28 | ssh backup-server zfs receive backup-tank/data
# Raw send (สำหรับ encrypted datasets)
zfs send -w tank/data@2026-02-28 | ssh backup-server zfs receive backup-tank/data
# ส่ง recursive (ทุก child datasets)
zfs send -R tank@2026-02-28 | ssh backup-server zfs receive backup-tank
Automated Replication Script
#!/bin/bash
# /usr/local/bin/zfs-replicate.sh
SOURCE="tank/data"
DEST_HOST="backup-server"
DEST_POOL="backup-tank/data"
SNAP_PREFIX="repl"
DATE=$(date +%Y%m%d_%H%M)
NEW_SNAP="@-"
# สร้าง snapshot ใหม่
zfs snapshot "$NEW_SNAP"
# หา snapshot ก่อนหน้า
PREV_SNAP=$(zfs list -t snapshot -o name -H -S creation "$SOURCE" | grep "@-" | sed -n '2p')
if [ -n "$PREV_SNAP" ]; then
# Incremental send
zfs send -i "$PREV_SNAP" "$NEW_SNAP" | ssh "$DEST_HOST" zfs receive -F "$DEST_POOL"
else
# Full send (ครั้งแรก)
zfs send "$NEW_SNAP" | ssh "$DEST_HOST" zfs receive -F "$DEST_POOL"
fi
echo "Replication complete: $NEW_SNAP"
ARC (RAM Cache) Tuning
# ดู ARC stats
arc_summary
# หรือ
cat /proc/spl/kstat/zfs/arcstats
# ตั้งค่า ARC size (default = 50% of RAM)
# /etc/modprobe.d/zfs.conf
options zfs zfs_arc_max=17179869184 # 16GB max
options zfs zfs_arc_min=8589934592 # 8GB min
# Apply
update-initramfs -u
# reboot หรือ
echo 17179869184 > /sys/module/zfs/parameters/zfs_arc_max
Scrub — Data Integrity Check
# รัน scrub ตรวจสอบ data integrity
zpool scrub tank
# ดู progress
zpool status tank
# scan: scrub in progress since Fri Feb 28 02:00:00 2026
# 2.50T scanned at 500M/s, 1.25T issued at 250M/s
# 0B repaired, 50.00% done, 01:30:00 to go
# ตั้ง schedule scrub ทุกสัปดาห์
# /etc/cron.d/zfs-scrub
0 2 * * 0 root zpool scrub tank
ZFS ต้องใช้ RAM เยอะจริงไหม?
กฎเก่าที่ว่า "1GB RAM ต่อ 1TB storage" ไม่ค่อยถูกต้องนัก ZFS ทำงานได้ดีกับ RAM น้อยแค่ performance จะลดลงสำหรับ file server ทั่วไป 8-16GB RAM ก็เพียงพอสำหรับ pool 10-20TB สำหรับ deduplication ต้องการ RAM เยอะจริง (5GB ต่อ 1TB) แต่ผมไม่แนะนำ dedup — ใช้ compression แทนดีกว่า
เพิ่ม disk เข้า RAID-Z pool ได้ไหม?
ZFS 2.2+ รองรับ RAID-Z expansion แล้วสามารถเพิ่ม disk เข้า existing vdev ได้แต่ process ใช้เวลานาน (resilver ทั้ง vdev) อีกวิธีคือเพิ่ม vdev ใหม่เข้า pool เช่นถ้ามี raidz2 4 disks อยู่ก็เพิ่มอีก raidz2 4 disks ใหม่ pool จะ stripe across ทั้ง 2 vdevs
ZFS กับ Proxmox VE ใช้ด้วยกันดีไหม?
ดีมากครับ Proxmox VE รองรับ ZFS เป็น native storage backend ตั้งแต่ installation สามารถ install Proxmox บน ZFS root ได้เลย ZFS snapshots ทำงานร่วมกับ Proxmox snapshot/backup system ได้สมบูรณ์ replication ใช้ ZFS send/receive ส่ง VMs ข้าม nodes ได้เร็วมาก
ZFS กับ Ceph ใช้ตัวไหนดี?
ใช้งานต่างกัน ZFS เป็น local filesystem สำหรับ single server หรือ direct-attached storage เหมาะสำหรับ NAS, backup server, VM storage Ceph เป็น distributed storage สำหรับ cluster หลาย nodes เหมาะสำหรับ scale-out storage ที่ต้องการ grow ได้เรื่อยๆผมใช้ ZFS สำหรับ Proxmox local storage และ Ceph สำหรับ shared storage ข้าม nodes
สรุป
ZFS เป็น filesystem ที่ดีที่สุดสำหรับ data integrity มี checksumming ทุก block, snapshots ที่สร้างได้ทันที, compression ในตัว, RAID-Z ที่เสถียรและ send/receive สำหรับ replication
สำหรับ production ผมแนะนำ RAID-Z2 สำหรับ data pool, LZ4 compression เป็น default, auto-snapshots ด้วย sanoid, weekly scrub, ZFS send/receive สำหรับ offsite replication, monitor ด้วย Zabbix
