ติดตั้ง ZFS บน VPS จัดการ Storage ขั้นสูง

ติดตั้ง ZFS บน VPS จัดการ Storage ขั้นสูง

มิถุนายน 2026 · อ่าน 8 นาที

ZFS (Zettabyte File System) เป็นระบบไฟล์ขั้นสูงที่พัฒนาโดย Sun Microsystems ให้ความสามารถด้านจัดการพื้นที่เก็บข้อมูลแบบมืออาชีพ บน VPS ZFS ช่วยให้คุณสร้าง RAID ซ้อมแบบนุ่ม (software RAID) ทำ snapshot ของข้อมูล บีบอัดข้อมูล และเข้ารหัสโดยไม่ต้องจัดการระบบไฟล์แยกต่างหาก บทความนี้จะสอนการติดตั้ง ZFS บน Ubuntu/Debian VPS และสร้าง pool ของหน่วยเก็บข้อมูลพร้อมจัดการ dataset อย่างมืออาชีพ

ZFS คืออะไร และทำไมใช้บน VPS

ZFS เป็น filesystem ที่ออกแบบมาสำหรับการใช้งานระดับองค์กร มี features ดังนี้:

บน 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  -
หมายเหตุ: อย่าใช้ disk ที่มี partition table แล้ว ให้ใช้ whole disk หรือ partition ว่าง สำหรับ VPS ให้ใช้ /dev/vdbX หรือ loop device

จัดการ 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