ติดตั้ง ZFS บน VPS จัดการ Storage ขั้นสูง
ZFS (Zettabyte File System) เป็นระบบไฟล์ขั้นสูงที่พัฒนาโดย Sun Microsystems ให้ความสามารถด้านจัดการพื้นที่เก็บข้อมูลแบบมืออาชีพ บน VPS ZFS ช่วยให้คุณสร้าง RAID ซ้อมแบบนุ่ม (software RAID) ทำ snapshot ของข้อมูล บีบอัดข้อมูล และเข้ารหัสโดยไม่ต้องจัดการระบบไฟล์แยกต่างหาก บทความนี้จะสอนการติดตั้ง ZFS บน Ubuntu/Debian VPS และสร้าง pool ของหน่วยเก็บข้อมูลพร้อมจัดการ dataset อย่างมืออาชีพ
ZFS คืออะไร และทำไมใช้บน VPS
ZFS เป็น filesystem ที่ออกแบบมาสำหรับการใช้งานระดับองค์กร มี features ดังนี้:
- Copy-on-Write (CoW) — ข้อมูลที่สร้างไม่ลบข้อมูลเดิม ให้ความสามารถใน snapshots ที่ปลอดภัย
- RAID ซ้อม — สร้าง RAID 1/Z/Z2/Z3 บนซอฟต์แวร์ เพิ่มความทนทานต่อการล้มเหลวของ disk
- Snapshots — สร้างภาพถ่ายของข้อมูลในช่วงเวลาใดก็ได้ เหมาะสำหรับ backup
- Compression — บีบอัดข้อมูล (LZ4, GZIP) เพิ่มพื้นที่เก็บได้อีก 20-50%
- Encryption — เข้ารหัส dataset ด้วย AES-256
- Clone — สร้างสำเนาของ snapshot ที่แชร์ data blocks
- ZFS Send/Receive — ส่งข้อมูลระหว่าง pool พร้อมกับ snapshot
บน VPS, ZFS เหมาะสำหรับการจัดการ multiple disks, backup อัตโนมัติ, และการฟื้นตัวจาก disk failure
ติดตั้ง ZFS บน Ubuntu/Debian
ขั้นแรก ตรวจสอบเวอร์ชัน Linux ของคุณ ZFS รองรับ kernel 2.6.32 ขึ้นไป
$ uname -r
5.15.0-56-generic
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.1 LTS"
ติดตั้ง ZFS packages:
$ sudo apt update
$ sudo apt install zfsutils-linux zfs-initramfs -y
ตรวจสอบว่า ZFS modules ถูกโหลดแล้ว:
$ sudo modprobe zfs
$ lsmod | grep zfs
zfs 4063232 15
ถ้า modprobe ล้มเหลว อาจต้อง compile ZFS modules เอง (บ่อยครั้งบน VPS hosting บางที่):
$ sudo apt install build-essential autoconf automake libtool linux-headers-$(uname -r) -y
$ sudo apt install zfs-dkms -y
สร้าง ZFS Pool (Zpool)
Pool คือหน่วยจัดเก็บข้อมูล (storage pool) ที่ประกอบด้วย disk หรือ partition หลายตัว ตรวจสอบ disk ที่มีอยู่:
$ sudo fdisk -l
Disk /dev/sdb: 100 GiB
Disk /dev/sdc: 100 GiB
สร้าง RAID 1 pool (mirror) สำหรับข้อมูลสำคัญ:
$ sudo zpool create storage mirror /dev/sdb /dev/sdc
สำหรับ RAID Z (เหมือน RAID 5 ที่มี 1 parity disk):
$ sudo zpool create storage raidz /dev/sdb /dev/sdc /dev/sdd
สำหรับ RAID Z2 (เหมือน RAID 6 ที่มี 2 parity disks):
$ sudo zpool create storage raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
ตรวจสอบ pool ที่สร้างแล้ว:
$ sudo zpool list
NAME SIZE ALLOC FREE CAP HEALTH ALTROOT
storage 200G 1.5M 200G 0% ONLINE -
จัดการ ZFS Datasets
Dataset คือหน่วยเก็บข้อมูลภายใน pool อาจเปรียบเทียบกับ volume logical บน LVM ตั้งค่า compression อัตโนมัติ:
$ sudo zfs create -o compression=lz4 storage/backup
ตั้งค่า quota (ขีดจำกัดพื้นที่):
$ sudo zfs set quota=50G storage/backup
เข้ารหัส dataset ด้วย AES-256:
$ sudo zfs create -o encryption=aes-256-gcm \
-o keylocation=prompt -o keyformat=passphrase \
storage/confidential
ดูข้อมูล dataset:
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
storage 1.5M 200G 96K /storage
storage/backup 100K 50G 96K /storage/backup
storage/confidential 96K 100G 96K /storage/confidential
mount dataset ไปที่ที่ที่กำหนด:
$ sudo zfs set mountpoint=/mnt/backup storage/backup
$ mount | grep zfs
storage on /storage type zfs (rw,relatime,xattr,nofail)
storage/backup on /mnt/backup type zfs (rw,relatime,xattr,nofail)
Snapshots และ Backup
Snapshot คือภาพถ่ายของ dataset ในช่วงเวลาหนึ่ง สร้าง snapshot:
$ sudo zfs snapshot storage/backup@2026-06-27
ดูรายการ snapshots:
$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
storage/backup@2026-06-27 100K - 96K -
โคลน snapshot เป็น dataset ใหม่:
$ sudo zfs clone storage/backup@2026-06-27 storage/backup-clone
ส่ง snapshot ไปยัง pool อื่น (incremental backup):
$ sudo zfs send storage/backup@2026-06-27 | sudo zfs receive backup_remote/
สำหรับ backup ไปเซิร์ฟเวอร์อื่น ผ่าน SSH:
$ sudo zfs send storage/backup@2026-06-27 | ssh [email protected] \
sudo zfs receive backup_pool/storage/backup@2026-06-27
อัปเดต snapshot incremental (ส่งเฉพาะ changes):
$ sudo zfs send -i storage/backup@2026-06-27 storage/backup@2026-06-28 | \
ssh [email protected] sudo zfs receive backup_pool/storage/backup@2026-06-28
ติดตั้ง Automated Snapshots
ติดตั้ง zfs-auto-snapshot เพื่อสร้าง snapshot อัตโนมัติ:
$ sudo apt install zfs-auto-snapshot -y
เปิดใช้งาน cron jobs (ค่าเริ่มต้นสร้าง snapshots ทุกชั่วโมง/วัน/สัปดาห์/เดือน):
$ sudo systemctl enable zfs-auto-snapshot.service
$ sudo systemctl start zfs-auto-snapshot.service
ดูค่าตั้งค่า:
$ ls /etc/cron.d/ | grep zfs
zfs-auto-snapshot
$ cat /etc/cron.d/zfs-auto-snapshot
# Keep 3 hourly, 2 daily, 1 weekly snapshot
0 * * * * root /usr/sbin/zfs-auto-snapshot --keep=3 --prefix=hourly
ถ้าต้องการสร้าง snapshot ด้วยมือ:
$ sudo /usr/sbin/zfs-auto-snapshot --keep=7 --prefix=manual-backup storage/
ตรวจสอบว่า ZFS ทำงานถูกต้อง
ตรวจสอบสถานะ pool:
$ sudo zpool status storage
pool: storage
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
ตรวจสอบสถานะ dataset:
$ sudo zfs get all storage/backup | head -20
NAME PROPERTY VALUE SOURCE
storage/backup type filesystem default
storage/backup creation Mon Jun 27 10:30:00 2026
storage/backup used 100K -
storage/backup available 50G -
storage/backup referenced 96K -
storage/backup compressratio 1.45x -
storage/backup compression lz4 local
ทดสอบการเขียน/อ่าน ลงใน dataset:
$ sudo dd if=/dev/zero of=/storage/backup/testfile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.523 s, 200 MB/s
$ sudo ls -lh /storage/backup/testfile
-rw-r--r-- 1 root root 100M Jun 27 10:35 testfile
$ sudo rm /storage/backup/testfile
zpool iostat เพื่อดูอัตราการทำงาน disk เรียลไทม์แก้ปัญหาที่พบบ่อย
ข้อผิดพลาด: "module: No such file or directory"
หากเห็นข้อผิดพลาด modprobe: FATAL: Module zfs not found in directory... แสดงว่า kernel module ยังไม่ถูก compile หรือ dkms ล้มเหลว แก้ไขโดยติดตั้ง dkms:
$ sudo apt install build-essential dkms linux-headers-$(uname -r)
$ sudo dkms install zfs/
ข้อผิดพลาด: "cannot open device /dev/sdb: Device busy"
ข้อความนี้หมายความว่า disk ถูกใช้งานโดยระบบอื่นแล้ว (อาจมี mount point หรือ swap) ตรวจสอบ:
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
$ sudo umount /dev/sdb*
$ sudo swapoff /dev/sdb
ล้าง partition table ของ disk ก่อนสร้าง zpool:
$ sudo sgdisk -Z /dev/sdb
The operation has completed successfully.
ข้อผิดพลาด: "zpool status: no pools available"
Pool ไม่ถูกสร้าง หรือยังไม่ mount ให้ตรวจสอบและสร้าง pool ใหม่:
$ sudo zpool list
no pools available
$ sudo zpool import # ลองนำเข้า pool เก่า
$ sudo zpool create storage mirror /dev/sdb /dev/sdc
ข้อผิดพลาด: "pool or dataset does not exist"
Dataset ที่ต้องการไม่มีอยู่ ให้สร้างใหม่หรือดูรายการทั้งหมด:
$ sudo zfs list -t filesystem
NAME USED AVAIL REFER MOUNTPOINT
storage 1.5M 200G 96K /storage
$ sudo zfs create storage/newdataset
คำถามที่พบบ่อย
ZFS ใช้พื้นที่ RAM มากหรือไม่?
ใช่ ZFS ใช้ RAM สำหรับ ARC (Adaptive Replacement Cache) ซึ่งเป็น cache ของข้อมูลที่อ่านบ่อย ๆ บน VPS ปกติจะใช้ 1-8 GB ขึ้นอยู่กับจำนวน dataset และขนาดของพูล คุณสามารถจำกัด ARC ได้โดยแก้ไขไฟล์ /etc/modprobe.d/zfs.conf และเพิ่มบรรทัด options zfs zfs_arc_max=4294967296 (4GB ในตัวอย่าง)
ขนาด record block เล็กหรือใหญ่ดีกว่ากันในกรณีใด?
ขนาด block ค่าเริ่มต้นคือ 128K ขนาดเล็ก (4K-16K) ดีกว่าสำหรับไฟล์หลากหลาย เช่นฐานข้อมูล ขนาดใหญ่ (256K-1M) ดีสำหรับไฟล์วิดีโอ/อิมเมจขนาดใหญ่ ตั้งค่า recordsize เมื่อสร้าง dataset: sudo zfs create -o recordsize=16K storage/database
สามารถลบ pool โดยไม่เสียข้อมูลอื่นได้หรือไม่?
ได้ ใช้คำสั่ง zpool destroy ซึ่งจะลบ pool และข้อมูลทั้งหมดในนั้น เตือนอีกครั้งว่าคำสั่งนี้ไม่สามารถยกเลิกได้ ให้แน่ใจว่าได้ backup ข้อมูลแล้ว: sudo zpool destroy storage