it

ZFS Storage — คู่มือ ZFS Filesystem

ZFS Storage — คู่มือ ZFS Filesystem

ทำไมต้อง ZFS

ZFS Storage — คู่มือ ZFS Filesystem

ผมเริ่มใช้ 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)

เนื้อหาเกี่ยวข้อง — อ่านต่อ: Zabbix Monitoring ติดตั้งและ Dashboard 2026

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

แนะนำเพิ่มเติม — แหล่งความรู้ Forex iCafeForex

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

เนื้อหาเกี่ยวข้อง — แนะนำให้อ่าน Python Poetry Clean Architecture

สร้าง 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

แนะนำเพิ่มเติม — SiamCafeBook

zfs destroy tank/data@before-update

เข้าถึงไฟล์ใน snapshot (read-only)

ls /tank/data/.zfs/snapshot/2026-02-28/

สามารถ copy ไฟล์กลับมาได้โดยไม่ต้อง rollback ทั้ง dataset

Automated Snapshots

ZFS Storage — คู่มือ ZFS Filesystem

!/bin/bash

/usr/local/bin/zfs-auto-snapshot.sh

DATE=$(date +%Y-%m-%d_%H%M)

RETENTION_DAILY=30

RETENTION_HOURLY=48

เนื้อหาเกี่ยวข้อง — ดูเพิ่มเติมเรื่อง Tekton Pipeline Machine Learning Pipeline

สร้าง 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

เนื้อหาเกี่ยวข้อง — ดูเพิ่มเติมเรื่อง diff pressure switch คือ

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

XM Legend · เทรดเดอร์ & ผู้สอน Forex 13 ปี

ผู้ก่อตั้ง SiamCafe ตั้งแต่ปี 1997 · เทรดเดอร์สาย Forex มากกว่า 13 ปี ได้รับการยกย่องเป็น XM Legend · แบ่งปันความรู้ Forex, ไอที, AI และการเทรด จากประสบการณ์จริงในตลาดจริง