อัปเดตล่าสุด: กุมภาพันธ์ 2026

Proxmox ZFS Storage Optimization

คู่มือ Homelab Edition - ปรับแต่ง ZFS ให้สุดประสิทธิภาพในปี 2025-2026

เรียนรู้การตั้งค่าและปรับแต่ง ZFS Storage บน Proxmox VE เพื่อสร้างระบบไฟล์ที่มีความเร็ว สูง ความเสถียร และสามารถกู้คืนข้อมูลได้อย่างมืออาชีพ

Proxmox VE
ZFS Storage
Optimization
Homelab

เนื้อหาในบทนี้

การตั้งค่า Storage Pool

ทำไมต้องเลือก ZFS?

ZFS คือ File System รุ่นใหม่ที่มาพร้อมคุณสมบัติพิเศษหลายประการ ซึ่งเหมาะมากสำหรับการใช้งานใน Proxmox VE:

  • Data Integrity - ป้องกัน Data Corruption ด้วย Checksum
  • Snapshots - สำรองข้อมูลแบบ Instant และกู้คืนได้ทันที
  • Compression - เพิ่มพื้นที่ใช้งานด้วย Compression อัตโนมัติ
  • Cloning - สร้าง VM/Container ใหม่ได้เร็วขึ้นด้วย Cloning
  • Encryption - รักษาความลับของข้อมูลด้วย Encryption
  • Self-Healing - ซ่อมแซมข้อมูลที่เสียหายได้อัตโนมัติ

สิ่งที่ต้องเตรียม

Hard Disk / SSD

แนะนำอย่างน้อย 2 ตัว (RAID1 หรือ Single) หรือ 4 ตัว (RAIDZ1/RAIDZ2)

RAM

อย่างน้อย 8GB (สำหรับ ARC Cache) - แนะนำ 16GB ขึ้นไปสำหรับ Homelab

Proxmox VE 8.x หรือ 9.x

เวอร์ชันล่าสุดเพื่อความเข้ากันได้ที่ดีที่สุด

Storage Controller

HBA Mode หรือ JBOD Mode (ไม่ใช่ RAID Mode)

1

เตรียม Disk ก่อนติดตั้ง ZFS

Terminal - Proxmox Host root@proxmox
# ตรวจสอบ Disk ที่มีอยู่ lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

# หรือใช้คำสั่ง fdisk sudo fdisk -l
2

ติดตั้ง ZFS Package

Terminal - Install ZFS root@proxmox
# อัปเดตระบบก่อน apt update && apt upgrade -y

# ติดตั้ง ZFS packages apt install -y zfsutils-linux

# ตรวจสอบว่าติดตั้งสำเร็จ zfs --version

คำแนะนำสำคัญ: HBA Mode สำหรับ Storage Controller

Many modern servers come with storage controllers pre-configured in RAID mode. For best ZFS performance and full control, you need to change the controller to HBA (Host Bus Adapter) mode or JBOD (Just a Bunch Of Disks) mode. This allows ZFS to manage the disks directly instead of the controller's RAID layer.

Storage Pool Configuration Options

ZFS รองรับการจัดรูปแบบดิสก์หลายรูปแบบ (vdev) ที่แตกต่างกัน ขึ้นอยู่กับความต้องการและความพร้อมของฮาร์ดแวร์:

รูปแบบ จำนวน Disk ความจุใช้งานได้ ความเสถียร เหมาะสำหรับ
Single (Stripe) 1 100% (เต็มขนาด) ต่ำ (เสีย 1 ตัว = ข้อมูลหาย) ทดสอบ, ทดลอง
Mirror (RAID1) 2+ 50% (n/จำนวน disk) สูง (เสียได้ 1 ตัว) Homelab, ความเสถียรสูง
RAIDZ1 3+ (n-1)/n ปานกลาง (เสียได้ 1 ตัว) BalancedPerformance/Cost
RAIDZ2 4+ (n-2)/n สูง (เสียได้ 2 ตัว) Business, ข้อมูลสำคัญ
RAIDZ3 5+ (n-3)/n สูงมาก (เสียได้ 3 ตัว) Enterprise, ข้อมูลวิกฤต
RAID10 4+ 50% สูง (เสียได้ 1 ตัวต่อคู่) I/O intensive, Performance
Terminal - Create Storage Pool root@proxmox
# ตัวอย่าง 1: Single Disk (สำหรับทดสอบ) zpool create tank /dev/sdb

# ตัวอย่าง 2: Mirror (RAID1) - แนะนำสำหรับ Homelab zpool create tank mirror /dev/sdb /dev/sdc

# ตัวอย่าง 3: RAIDZ1 (3 disks) zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd

# ตัวอย่าง 4: RAIDZ2 (4 disks) zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# สร้าง datasets แยกสำหรับ VM และ Container zfs create tank/vms zfs create tank/containers zfs create tank/backups

การตั้งค่า Compression

ทำไมการ Compression ถึงสำคัญ?

ZFS Compression ไม่ได้ลดแค่พื้นที่จัดเก็บ แต่ยังเพิ่ม performance ด้วย!

  • ลดขนาดข้อมูลที่เขียนบน disk → ลด I/O operations
  • CPU ปัจจุบันเร็วมาก → คุ้มค่ากว่าพื้นที่ disk
  • ไม่ส่งผลต่อ performance จริง (แม้แต่บางครั้งเพิ่มขึ้น!)
1

เลือก Compression Algorithm

ZFS รองรับหลายอัลกอริธึม ซึ่งแต่ละตัวมีข้อดีแตกต่างกัน:

Performance Comparison

Algorithm Compression Ratio CPU Usage Speed แนะนำใช้งาน
lz4 2.0x - 2.5x ต่ำ เร็วมาก Perfect สำหรับ Homelab!
zle 1.5x - 2.0x ต่ำมาก เร็ว Data ที่มี null bytes มาก
lzjb 2.0x - 2.3x ปานกลาง ปานกลาง เก่า (ใช้ lz4 แทนได้)
gzip-1 2.5x - 3.0x สูง ช้า Archival (เก็บข้อมูลเก่า)
gzip-9 3.0x - 3.5x สูงมาก ช้ามาก Best ratio (ช้าสุด)
zstd 2.2x - 3.0x ปานกลาง เร็ว Balanced ( modern choice)

คำแนะนำ: ใช้ lz4 หรือ zstd

lz4 เป็นตัวเลือกที่ดีที่สุดสำหรับเกือบทุกกรณี เพราะให้ compression ratio ดีมากและ CPU overhead น้อย มาก
zstd เป็นทางเลือกที่ดีถ้าต้องการ compression ratio ที่ดีขึ้นกว่าเล็กน้อย และสามารถยอมรับ CPU usage ที่สูงขึ้นเล็กน้อย

2

เปิดใช้งาน Compression

Terminal - Enable Compression root@proxmox
# ตั้งค่า lz4 สำหรับทั้ง pool zfs set compression=lz4 tank

# หรือใช้ zstd (แนะนำ modern choice) zfs set compression=zstd tank

# ตั้งค่าแยกตาม dataset zfs set compression=lz4 tank/vms zfs set compression=zstd tank/containers

# ตรวจสอบการตั้งค่า zfs get compression tank zfs get compression tank/vms

Compression Settings for Different Workloads

การตั้งค่า compression ที่เหมาะสมกับ workload แต่ละแบบ:

VM Storage (Root Disk)

compression=lz4 - เหมาะสำหรับ VM ทั่วไป ไม่ส่งผลต่อ performance

Container Storage

compression=lz4 - ลดพื้นที่ container images

Media/Video Storage

compression=lz4 - Media files ไฟล์ใหญ่ถูก Compression ดี

Database Storage

compression=lz4 - ลด I/O ด้วยการบีบอัดข้อมูล

Backup/Archival

compression=zstd หรือ gzip-1 - optimalcompression ratio

การจัดการ Snapshots

Snapshot คืออะไร?

Snapshot คือการถ่ายภาพสถานะของข้อมูลในช่วงเวลาหนึ่ง ซึ่ง ZFS ทำได้อย่างมีประสิทธิภาพมาก:

  • Instant - สร้างได้รวดเร็วมาก (ไม่ต้อง copy ข้อมูลทั้งหมด)
  • Space Efficient - เก็บเฉพาะ data ที่เปลี่ยนแปลงหลัง snapshot
  • Immutable - ข้อมูลไม่สามารถเปลี่ยนแปลงได้ (ป้องกันการแก้ไขโดยไม่ตั้งใจ)
  • Rollback - กู้คืนข้อมูลกลับไปยังสถานะตอนนั้นได้ทันที

คำแนะนำ: Create Snapshot ก่อนเปลี่ยนแปลงใหญ่!

Always Before: Upgrade system, ติดตั้ง Proxmox, Install new packages
Always Before: Migration, Restore backups, เปลี่ยน storage config

1

การสร้าง Snapshot ด้วยตนเอง

Terminal - Manual Snapshot root@proxmox
# สร้าง snapshot สำหรับทั้ง pool zfs snapshot -r tank@backup-2025-02-12

# สร้าง snapshot สำหรับ dataset แยก zfs snapshot tank/vms@pre-upgrade zfs snapshot tank/containers@pre-changes

# สร้าง snapshot พร้อม description zfs snapshot -o com.sun:auto-snapshot=true \ tank/vms@2025-02-12-01am

# ดูรายการ snapshot ที่มี zfs list -t snapshot tank/vms
2

การกู้คืนข้อมูลจาก Snapshot

Terminal - Rollback root@proxmox
# rollback (กู้คืนทั้ง dataset) zfs rollback tank/vms@2025-02-12

# สำหรับ rollback ที่มี snapshot ใหม่กว่า ต้องลบทิ้งก่อน zfs rollback tank/vms@2025-02-12 zfs rollback tank/vms@2025-02-11

# คopy ไฟล์จาก snapshot (ไม่ต้อง rollback) cp -r /tank/vms/.zfs/snapshot/2025-02-12/data/ /tank/vms/

Automated Snapshot dengan zfs-auto-snapshot

ติดตั้งและตั้งค่า automatic snapshot เพื่อการกู้คืนข้อมูลที่ง่ายและปลอดภัย:

Terminal - Install Auto-Snapshot root@proxmox
# ติดตั้ง zfs-auto-snapshot via apt apt install -y zfs-auto-snapshot

# ตรวจสอบ service status systemctl status zfs-auto-snapshot

# ตั้งค่า frequency (default 15min) zfs set com.sun:auto-snapshot:frequent="true" tank/vms zfs set com.sun:auto-snapshot:hourly="true" tank/vms zfs set com.sun:auto-snapshot:daily="true" tank/vms zfs set com.sun:auto-snapshot:weekly="true" tank/vms zfs set com.sun:auto-snapshot:monthly="true" tank/vms

# ดู snapshot ที่ถูกสร้างโดย auto-snapshot zfs list -t snapshot -o name,creation -s creation tank/vms

การลบ Snapshot เก่า (Cleanup)

อย่าลืมลบ snapshot เก่าเพื่อเก็บพื้นที่!

Terminal - Cleanup Old Snapshots root@proxmox
# ลบ snapshot เก่าทั้งหมด (ระวัง!) zfs list -t snapshot -o name | grep tank | xargs -I {} zfs destroy {}

# ลบเฉพาะ snapshot ที่เก่ากว่า 7 วัน zfs list -t snapshot -o name,creation -s creation tank | \ tail -n +10 | awk '{print $1}' | xargs -I {} zfs destroy {}

# ใช้ zfs-auto-snapshot ลบแบบปลอดภัย zfs AUTO-snapshot -p 7 tank/vms

# ดูพื้นที่ที่ snapshot ใช้ไป zfs list -t snapshot -o name,used tank/vms

ตัวอย่าง Policy สำหรับ Homelab

Frequent (15 min): ใช้สำหรับข้อมูลสำคัญที่มีการเปลี่ยนแปลงบ่อย
Hourly (1 hr): สำหรับทั่วไป dataset
Daily (24 hrs): สำหรับข้อมูลที่ไม่ค่อยเปลี่ยนแปลง
Weekly/Monthly: สำหรับ archival และ backup long-term

Proxmox Backup Integration

ZFS Snapshots สามารถรวมกับ Proxmox Backup Server ได้อย่างมีประสิทธิภาพ:

Terminal - Backup Integration root@proxmox
# สร้าง snapshot ก่อน backup zfs snapshot tank/vms@backup-$(date +%Y%m%d)

# รัน Proxmox Backup (ใน Web UI หรือ CLI) pvesm backup VMID --archive-mode --storage pbs-storage

# ลบ snapshot เก่าหลัง backup สำเร็จ zfs destroy tank/vms@backup-20250205

# Backup และ snapshot ด้วยคำสั่งเดียว zfs send tank/vms@backup-2025-02-12 | \ ssh user@backup-server "zfs receive tank/backups"

การปรับแต่ง ARC Cache (RAM)

ARC (Adaptive Replacement Cache) คืออะไร?

ARC คือระบบ cache ของ ZFS ที่ใช้ RAM เพื่อเก็บข้อมูลที่ถูกอ่านบ่อยๆ เพื่อเพิ่ม performance:

  • Read Cache - เก็บข้อมูลที่ถูกอ่านล่าสุด
  • Adaptive - เรียนรู้ pattern การใช้งานอัตโนมัติ
  • Replacement - ลบข้อมูลเก่าออกเมื่อ RAM ไม่พอ
  • LRU-based - ใช้ LRU (Least Recently Used) algorithm

ค่า Default ของ ZFS

50% of Total RAM สำหรับ ARC Cache (สูงสุด)
1GB minimum - ZFS จะไม่ใช้ RAM น้อยกว่านี้
การตั้งค่าสูงเกินไปอาจทำให้ระบบไม่เสถียร!

ARC Calculator

คำนวณค่าที่เหมาะสมสำหรับ ARC ของคุณ:

Total RAM System Needed Max ARC (50%) Recommended ARC
8 GB 2-3 GB 4 GB 3 GB (3221225472)
16 GB 3-4 GB 8 GB 6 GB (6442450944)
32 GB 4-6 GB 16 GB 12 GB (12884901888)
64 GB 6-8 GB 32 GB 24 GB (25769803776)
128 GB+ 8-12 GB 64 GB 32-48 GB
1

ตั้งค่า ARC (zfs_arc_min และ zfs_arc_max)

Terminal - Configure ARC root@proxmox
# ตรวจสอบค่าปัจจุบัน cat /sys/module/zfs/parameters/zfs_arc_min cat /sys/module/zfs/parameters/zfs_arc_max

# ตั้งค่า ARC - ตัวอย่างสำหรับ 16GB RAM echo "3221225472" > /sys/module/zfs/parameters/zfs_arc_min echo "6442450944" > /sys/module/zfs/parameters/zfs_arc_max

# หรือตั้งแบบทีเดียวทั้งคู่ (Recommended) # 16GB RAM: min=2GB, max=6GB # 32GB RAM: min=4GB, max=12GB # 64GB RAM: min=6GB, max=24GB
2

ทำให้ค่าซึ่งตั้งไว้ถาวร (Persistent)

Terminal - Make Config Persistent root@proxmox
# สร้างไฟล์ modprobe config cat << EOF > /etc/modprobe.d/zfs.conf # ZFS ARC Tuning (for 16GB RAM) options zfs zfs_arc_min=3221225472 options zfs zfs_arc_max=6442450944 EOF

# หรือใช้Proxmox GRUB cat << EOF > /etc/default/grub.d/zfs-arc.cfg GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT \ zfs.zfs_arc_min=3221225472 \ zfs.zfs_arc_max=6442450944" EOF

# อัปเดต GRUB และ initramfs update-grub update-initramfs -u

ตรวจสอบและ_monitoring ARC

Terminal - Monitor ARC Performance root@proxmox
# ดู status ของ ARC arcstat

# ดูรายละเอียด ARC (รวมถึง hit/miss ratio) arcstat -a

# ติดตาม real-time status ทุก 2 วินาที arcstat 2

# ดู ARC memory usage แบบ human-readable arcstat -h

# ใช้ zpool iostat ดู I/O แบบ real-time zpool iostat -v tank 1

# ดู top ARC statistics smartctl -a /dev/sda | grep -i arc

ARC Tuning Recommendations by Use Case

Use Case RAM Allocation ARC Size Compression
Homelab Small 8 GB 3 GB lz4
Homelab Medium 16 GB 6 GB lz4/zstd
Homelab Large 32 GB 12 GB lz4/zstd
Production 64 GB+ 24-32 GB lz4/zstd/gzip
Archive/Backup 8-16 GB 2-4 GB gzip-1/zstd

ARC Hit Ratio ที่ดีคือเท่าไร?

เกิน 80% (0.8) → ดีมาก (Optimal)
70-80% (0.7-0.8) → ดี (Acceptable)
60-70% (0.6-0.7) → ปานกลาง (ปรับปรุงได้)
ต่ำกว่า 60% (0.6) → ต่ำ (ควรเพิ่ม ARC Size)

คำนวณ: hit_count / (hit_count + miss_count)

ZFS Replication

ZFS Replication คืออะไร?

ZFS Replication คือการส่ง snapshot ไปยังอีก server หนึ่งเพื่อสำรองข้อมูล:

  • ZFS Send/Receive - ใช้ zfs send/receive
  • Differential - ส่งเฉพาะส่วนที่เปลี่ยนแปลง
  • Encrypted - ส่งผ่าน SSH ที่เข้ารหัส
  • Automated - สามารถสร้าง schedule ได้
1

ตั้งค่า SSH Key สำหรับ Replication

Terminal - SSH Setup root@proxmox-primary
# สร้าง SSH key pair (ถ้ายังไม่มี) ssh-keygen -t rsa -b 4096 -C "zfs-replication"

# คัดลอก public key ไปยัง backup server ssh-copy-id backup@backup-server.local

# ทดสอบการเชื่อมต่อ (ไม่ต้องใส่password) ssh backup@backup-server.local "echo Connection OK"

# สร้าง dataset สำหรับรับข้อมูล replicated ssh backup@backup-server.local "zfs create backup/vms" ssh backup@backup-server.local "zfs create backup/containers"
2

ส่ง snapshot แบบ Full (Initial Replication)

Terminal - Initial Replication root@proxmox-primary
# สร้าง snapshot สำหรับส่ง zfs snapshot tank/vms@replica-2025-02-12

# ส่ง snapshot แบบ full ครั้งแรก zfs send tank/vms@replica-2025-02-12 | \ ssh backup@backup-server.local "zfs receive backup/vms"

# ถ้า dataset ปลายทางมีข้อมูลอยู่แล้ว ต้อง add -F flag zfs send tank/vms@replica-2025-02-12 | \ ssh backup@backup-server.local "zfs receive -F backup/vms"

# ดู status replication zfs list -t snapshot tank/vms ssh backup@backup-server.local "zfs list -t snapshot backup/vms"
3

Incremental Replication (ส่งเฉพาะส่วนที่เปลี่ยนแปลง)

Terminal - Incremental Replication root@proxmox-primary
# ส่งเพียงส่วนที่เปลี่ยนแปลงจาก snapshot ก่อนหน้า zfs send -i tank/vms@replica-2025-02-11 tank/vms@replica-2025-02-12 | \ ssh backup@backup-server.local "zfs receive backup/vms"

# ถ้าต้องการส่งต่อจาก snapshot เก่าที่สุด zfs send -i tank/vms@replica-2025-02-10 tank/vms@replica-2025-02-12 | \ ssh backup@backup-server.local "zfs receive backup/vms"

# ใช้ zfs diff ดูว่ามีอะไรเปลี่ยนแปลง zfs diff tank/vms@replica-2025-02-11 tank/vms@replica-2025-02-12

# เพิ่ม compression เพื่อลด bandwidth zfs send -i tank/vms@replica-2025-02-11 tank/vms@replica-2025-02-12 | \ gzip | \ ssh backup@backup-server.local "gunzip | zfs receive backup/vms"

Automated Replication Script

สร้าง script อัตโนมัติสำหรับการ replicate ข้อมูลทุกชั่วโมง:

Script - /usr/local/bin/zfs-replicate.sh root@proxmox-primary
#!/bin/bash # ZFS Automated Replication Script

# Configuration SOURCE_POOL="tank" DEST_USER="backup" DEST_HOST="backup-server.local" DEST_POOL="backup"

# Create snapshot with timestamp SNAPSHOT_NAME="replica-$(date +%Y%m%d-%H%M%S)" zfs snapshot $SOURCE_POOL/vms@$SNAPSHOT_NAME

# Get the last snapshot name LAST_SNAPSHOT=$(zfs list -t snapshot -o name -s creation $SOURCE_POOL/vms | tail -n 2 | head -n 1 | cut -d @ -f 2)

# Send Incremental if exists, otherwise Full if [ -n "$LAST_SNAPSHOT" ]; then # Incremental replication zfs send -i $SOURCE_POOL/vms@$LAST_SNAPSHOT $SOURCE_POOL/vms@$SNAPSHOT_NAME | \ ssh $DEST_USER@$DEST_HOST "zfs receive $DEST_POOL/vms" else # Full replication zfs send $SOURCE_POOL/vms@$SNAPSHOT_NAME | \ ssh $DEST_USER@$DEST_HOST "zfs receive $DEST_POOL/vms" fi

# Clean up old snapshots (keep last 7) zfs list -t snapshot -o name -s creation $SOURCE_POOL/vms | \ tail -n +8 | xargs -I {} zfs destroy {}

# Log success echo "$(date): ZFS Replication completed successfully" >> /var/log/zfs-replicate.log
4

ตั้งค่า Cron Job สำหรับ Automated Replication

Terminal - Cron Setup root@proxmox-primary
# แก้ไข crontab crontab -e

# เพิ่มบรรทัดนี้ (รันทุก 1 ชั่วโมง) # ZFS Replication - ทุกชั่วโมง 0 * * * /usr/local/bin/zfs-replicate.sh

# หรือทุก 30 นาที (สำหรับ Homelab) 0,30 * * * * /usr/local/bin/zfs-replicate.sh

# ตรวจสอบ list cron jobs crontab -l

Monitoring Replication Status

Terminal - Monitor Replication root@proxmox-primary
# ดู last replication timestamp ssh backup@backup-server.local "zfs list -t snapshot -o name,creation -s creation backup/vms | tail -n 5"

# ดู size ของข้อมูลที่ส่งไป ssh backup@backup-server.local "zfs list -o name,used,available backup/vms"

# Test restore จาก backup server ssh backup@backup-server.local "zfs rollback backup/vms@replica-2025-02-11-010000"

Best Practices for ZFS Replication

1. Scheduled Snapshots: สร้าง snapshot อัตโนมัติทุก 15 นาที
2. Incremental Replication: ใช้ incremental เสมอที่ทำได้ (efficient)
3. Encryption: ใช้ SSH encryption สำหรับ transfer
4. Bandwidth Limit: จำกัด bandwidth ด้วย trickle หรือ tc
5. Test Restore: ทดสอบ restore เป็นระยะๆ (ทุกเดือน)

การ Monitor และ Maintenance

Critical Monitoring Metrics

ต้อง Monitor สิ่งเหล่านี้เป็นประจำเพื่อความเสถียรของ ZFS:

Metric Command ปกติ Warning
Disk Health smartctl -a /dev/sdX No errors Reallocated sectors > 0
Pool Status zpool status tank ONLINE DEGRADED/FAULTED
Space Usage zfs list tank < 80% > 80% (Critical!)
Errors zpool status -v No errors Any errors detected
Scrub zpool status tank Recent scrub No scrub in 30+ days
1

ตรวจสอบ Pool Status

Terminal - Pool Status root@proxmox
# ตรวจสอบ status ทั่วไป zpool status

# ตรวจสอบด้วยรายละเอียด (verbose) zpool status -v

# ตรวจสอบเฉพาะ pool ที่ชื่อ tank zpool status tank

# ตรวจสอบ configuration zpool list

# ดู detailed information zpool iostat -v tank zpool list -v tank
2

ZFS Scrub (ตรวจสอบความสมบูรณ์ของข้อมูล)

Terminal - Run Scrub root@proxmox
# เริ่ม scrub (ใช้เวลานาน - แนะนำตอน idle) zpool scrub tank

# ตรวจสอบ progress ของ scrub zpool status -v tank

# หยุด scrub (ถ้าจำเป็น) zpool scrub -s tank

# ดูประวัติ scrub ล่าสุด zpool history tank | grep scrub

ตั้งค่า Scrub Schedule (Cron)

เปิดใช้งาน scrub แบบอัตโนมัติ:

Terminal - Scrub Cron Job root@proxmox
# แก้ไข crontab crontab -e

# ตัวอย่าง 1: Scrub ทุกสัปดาห์ (Midnight Sunday) 0 0 * * 0 /usr/sbin/zpool scrub tank

# ตัวอย่าง 2: Scrub ทุกเดือน (วันแรกของเดือน) 0 0 1 * * /usr/sbin/zpool scrub tank

# ตัวอย่าง 3: Scrub ทุก 15 วัน 0 0 */15 * * /usr/sbin/zpool scrub tank

# หรือใช้ systemd timer (Proxmox 9.x) # สร้าง unit file cat << EOF > /etc/systemd/system/zfs-scrub@.timer [Unit] Description=ZFS Scrub Timer for %i [Timer] OnCalendar=weekly Persistent=true [Install] WantedBy=timers.target EOF
3

Disk Health Monitoring with SMART

Terminal - SMART Checks root@proxmox
# ติดตั้ง smartmontools (ถ้ายังไม่มี) apt install -y smartmontools

# เปิด SMART สำหรับ disk smartctl -s on /dev/sda smartctl -s on /dev/sdb

# ตรวจสอบรายละเอียด disk health smartctl -a /dev/sda smartctl -a /dev/sdb

# ดูเฉพาะ errors smartctl -a /dev/sda | grep -E "(SMART|error|reallocated)"

# ตั้งค่า SMART ให้รัน self-test ทุกวัน smartctl -s selftest,monthly/3,01-23/Su /dev/sda

Space Usage Monitoring

ตรวจสอบการใช้งานพื้นที่อย่างสม่ำเสมอ:

Terminal - Space Usage root@proxmox
# ดูการใช้งานทั้งหมด zfs list

# ดูแบบ human-readable zfs list -h

# ดู compression ratio zfs get compressratio tank

# ดู space usage แบบละเอียด zfs list -o name,used,available,referenced,compressratio tank

# ตรวจสอบ space ของแต่ละ dataset zfs list -r tank/vms

# ดู allocated space แบบ detailed zpool list -v tank

Notification Script (Email Alert)

สร้าง script สำหรับแจ้งเตือนเมื่อมีปัญหา:

Script - /usr/local/bin/zfs-monitor.sh root@proxmox
#!/bin/bash # ZFS Monitoring and Alert Script

# Configuration POOL="tank" EMAIL="admin@example.com"

# ตรวจสอบ pool status STATUS=$(zpool status $POOL | grep -c "DEGRADED\|FAULTED\|OFFLINE")

# ตรวจสอบ errors ERRORS=$(zpool status $POOL | grep -c "C\|E\|D\|S")

# ส่ง alert ถ้ามีปัญหา if [ $STATUS -gt 0 ] || [ $ERRORS -gt 0 ]; then SUBJECT="[ZFS ALERT] Pool $POOL has issues!" BODY=$(zpool status -v $POOL) echo "$BODY" | mail -s "$SUBJECT" $EMAIL # Log to file echo "$(date) - ALERT: Pool $POOL issue detected" >> /var/log/zfs-monitor.log

# ตรวจสอบ space usage for DATASET in $(zfs list -r $POOL -o name -H); do USAGE=$(zfs list -o used% -H $DATASET | cut -d% -f1) if [ -n "$USAGE" ] && [ $USAGE -gt 90 ]; then echo "WARNING: $DATASET is at ${USAGE}% capacity!" # Log and optionally send alert fi done
Terminal - Add Cron root@proxmox
# ตั้งค่าให้รันทุก 6 ชั่วโมง crontab -e

# รันตรวจสอบทุก 6 ชั่วโมง 0 */6 * * * /usr/local/bin/zfs-monitor.sh

Proxmox Integration

ใช้ Proxmox Web UI ในการ monitor ZFS:

Datacenter → Storage

ดู list storage, status, และ usage

Storage → Snapshots

ดู list snapshots และจัดการ

Datacenter → Overview → Alerts

ดู alerts ต่างๆ

ZFS Maintenance Schedule

Daily: ตรวจสอบ logs, alert messages
Weekly: เริ่ม Scrub (zpool scrub)
Monthly: ตรวจสอบ SMART data, test restore
Quarterly: Review backup, update firmware
Yearly: ประเมิน capacity, plan upgrade

คำถามที่พบบ่อย (FAQ)

ฉันควรติดตั้ง ZFS ตอนไหน - ก่อนหรือหลังติดตั้ง Proxmox?

คำตอบ: แนะนำให้ติดตั้ง ZFS ก่อนเสมอ! ถ้าติดตั้ง Proxmox ก่อนแล้วค่อยเพิ่ม ZFS จะต้องย้าย VM/Container ที่มีอยู่ไปที่ ZFS ซึ่งยุ่งยาก ดังนั้น:

  1. ติดตั้ง Debian/Ubuntu พร้อม ZFS
  2. ติดตั้ง Proxmox VE
  3. ตั้งค่า Storage Pool
  4. ย้าย VM/Container ที่ต้องการ vào ZFS
ZFS ต้องการ RAM กี่ GB?

คำตอบ: ขั้นต่ำคือ 4GB (สำหรับ Single Disk testing), แต่สำหรับ Homelab แนะนำ:

  • 8GB: ตั้งค่า ARC 3GB - เหมาะสำหรับ VMs จำนวนน้อย
  • 16GB: ตั้งค่า ARC 6GB - ดีสุดสำหรับ Homelab
  • 32GB+: ตั้งค่า ARC 12-24GB - สำหรับ Production
ZFS กับ traditional ext4 ต่างกันยังไง?

คำตอบ:

ฟีเจอร์ ZFS ext4
Snapshot Instant, Space-efficient ไม่มี (หรือใช้ LVM)
Compression Built-in (lz4/zstd) ไม่มี
Data Integrity Checksum ทุก block Basic journaling
Self-Healing Yes (เมื่อ scrub) ไม่มี
RAID Built-in (RAIDZ) ต้องใช้ mdadm/LVM
สามารถ rollback ได้กี่ snapshot?

คำตอบ: ทฤษฎี ZFS ไม่จำกัดจำนวน snapshot แต่ขึ้นอยู่กับ:

  • พื้นที่ disk: แต่ละ snapshot เก็บ data ที่เปลี่ยนแปลง
  • จำนวน dataset: แต่ละ dataset มี snapshot แยกกัน
  • Performance: มากเกินไปอาจลด performance

คำแนะนำ: เก็บ snapshot ไว้ 7-30 ตัวต่อ dataset ขึ้นอยู่กับพื้นที่

ZFS เหมาะสำหรับ SSD หรือไม่?

คำตอบ: เหมาะมาก! ZFS ทำงานดีมากกับ SSD:

  • LZ4 compression ลด write amplification
  • ARC cache ช่วยลดการอ่านเขียน disk
  • Snapshot ไม่กระทบ SSD lifespan (ถ้าไม่เขียนบ่อย)

คำแนะนำ: ใช้ SSD ที่มี power-loss protection (PLP) ถ้าเป็น ZIL/L2ARC

แก้ไข quota สำหรับ VM/Container ยังไง?

คำตอบ: ใช้ ZFS quota property:

# ตั้ง quota 50GB สำหรับ VM dataset zfs set quota=50G tank/vms/vm-100

# ตั้ง reservation (reserved space) zfs set reservation=10G tank/vms/vm-100

# ลบ quota (return to pool) zfs set quota=none tank/vms/vm-100

# ดู quota ที่ตั้งไว้ zfs get quota tank/vms/vm-100

Utility Commands

# สร้าง snapshot สำหรับทั้ง pool zfs snapshot -r tank@backup-date +%Y%m%d

# ดู storage pool info zpool list zpool status

# ดู dataset space zfs list zfs list -r tank/vms
# เริ่ม scrub zpool scrub tank zpool status tank

# ลบ snapshot เก่า (keep last 7) zfs list -t snapshot -o name tank | tail -n +8 | xargs -I {} zfs destroy {}

# ย้าย VM to ZFS pct move CTID storage zfspool --target_storage zfspool qm move_disk VMID diskname zfspool