ZFS Management Guide#

Dokumentasi pengelolaan ZFS untuk QNAP QuTS hero — konteks: pool SSD 6x 4TB (RAID 10 / striped mirror) sebagai backing storage LUN iSCSI untuk cluster Incus.


1. Konsep Layer#

flowchart TD
    subgraph lvm["LVM"]
        LD["Disk fisik"] --> PV["PV<br/><small>pvcreate per disk</small>"]
        PV --> VG["VG<br/><small>gabungan semua PV</small>"]
        VG --> LV["LV<br/><small>partisi fleksibel</small>"]
        LV --> FS["Filesystem<br/><small>mkfs.ext4 + mount</small>"]
    end

    subgraph zfs["ZFS (QuTS hero)"]
        ZD["Disk fisik"] --> VDEV["vdev<br/><small>mirror / raidz — redundancy di sini</small>"]
        VDEV --> ZPOOL["zpool<br/><small>stripe across vdevs</small>"]
        ZPOOL --> DS["Dataset<br/><small>filesystem, langsung mount</small>"]
        ZPOOL --> ZVOL["Zvol<br/><small>block device — LUN iSCSI</small>"]
    end
ZFSPadanan LVMKeterangan
Disk fisikDisk fisikRaw device, mis. /dev/nvme0n1
vdevPV (+ mdadm)Unit redundancy: mirror, raidz1/2/3, atau single disk
zpoolVGKumpulan vdev; data di-stripe across vdevs
datasetLV + mkfs + mountFilesystem siap pakai, auto-mount
zvolLV (block device)Block device virtual — dipakai untuk LUN iSCSI

Aturan emas:

  • Redundancy hidup di level vdev, bukan pool.
  • Satu vdev mati total = seluruh pool mati.
  • Random write IOPS scaling per vdev, bukan per disk.

2. Akses CLI di QuTS hero#

QuTS hero pada dasarnya ZFS, jadi command standar zpool/zfs tersedia via SSH:

ssh admin@<ip-qnap>
# masuk shell, lalu:
zpool list
zfs list

Catatan: operasi destruktif (create/destroy pool, replace disk) sebaiknya tetap lewat Storage Manager GUI agar metadata QNAP (App state, LUN mapping, alert) tetap konsisten. CLI paling aman dipakai untuk read-only monitoring dan operasi dataset/snapshot.


3. Pool Management#

3.1 Melihat status pool#

zpool list                 # kapasitas, fragmentasi, health per pool
zpool status -v            # topologi vdev, disk mana degraded, error count
zpool iostat -v 5          # IOPS & bandwidth per vdev/disk, refresh 5 detik

Contoh output zpool status untuk RAID 10 (3 mirror vdev):

  pool: zpool1
 state: ONLINE
config:
        NAME          STATE     READ WRITE CKSUM
        zpool1        ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            nvme0n1   ONLINE       0     0     0
            nvme1n1   ONLINE       0     0     0
          mirror-1    ONLINE       0     0     0
            nvme2n1   ONLINE       0     0     0
            nvme3n1   ONLINE       0     0     0
          mirror-2    ONLINE       0     0     0
            nvme4n1   ONLINE       0     0     0
            nvme5n1   ONLINE       0     0     0

Topologi yang sama dalam bentuk diagram — data di-stripe ke 3 vdev, tiap vdev adalah pasangan mirror:

flowchart TD
    POOL["zpool1<br/><small>stripe across 3 vdev — usable ~12 TB</small>"]

    POOL --> M0["mirror-0"]
    POOL --> M1["mirror-1"]
    POOL --> M2["mirror-2"]

    M0 --> D0["nvme0n1<br/>4 TB"]
    M0 --> D1["nvme1n1<br/>4 TB"]
    M1 --> D2["nvme2n1<br/>4 TB"]
    M1 --> D3["nvme3n1<br/>4 TB"]
    M2 --> D4["nvme4n1<br/>4 TB"]
    M2 --> D5["nvme5n1<br/>4 TB"]

Ingat: 1 disk mati per mirror = degraded tapi aman. Kedua disk dalam satu mirror mati = vdev mati = seluruh pool mati, walaupun 4 disk lain sehat.

Status yang mungkin muncul:

StateArtiAksi
ONLINESehat
DEGRADEDAda disk mati, redundancy masih menutupGanti disk segera
FAULTEDVdev/pool kehilangan redundancy melebihi toleransiRestore dari backup
RESILVERINGSedang rebuild ke disk penggantiTunggu selesai, jangan cabut disk lain

3.2 Membuat pool (referensi CLI)#

Di QNAP lakukan via GUI (Storage Manager → Create Pool), tapi ekuivalen CLI-nya:

# RAID 10 — 3 pasang mirror
zpool create tank \
  mirror nvme0n1 nvme1n1 \
  mirror nvme2n1 nvme3n1 \
  mirror nvme4n1 nvme5n1

3.3 Scrub — wajib terjadwal#

Scrub membaca seluruh data + verifikasi checksum, memperbaiki silent corruption dari copy redundant. Jalankan bulanan.

zpool scrub tank           # mulai scrub
zpool status tank          # progress ada di baris "scan:"
zpool scrub -s tank        # stop scrub jika perlu

Di GUI: Storage Manager → Storage Space → pool → Manage → Scrub schedule.

3.4 Mengganti disk rusak#

zpool status -v                    # identifikasi disk FAULTED + catat serial
zpool replace tank nvme3n1 nvme6n1 # ganti dengan disk baru
zpool status                       # pantau resilver

Sebelum cabut disk fisik: cocokkan serial number (smartctl -i /dev/nvmeXn1 atau lihat di GUI Disks). Salah cabut disk saat degraded = pool mati. Di QNAP lebih aman pakai GUI karena ada locate LED per bay.


4. Dataset & Zvol#

4.1 Dataset (filesystem)#

zfs list                                  # semua dataset + usage
zfs create tank/backup                    # buat dataset, auto-mount di /tank/backup
zfs set compression=lz4 tank/backup       # aktifkan compression (nyaris gratis di CPU modern)
zfs set quota=2T tank/backup              # batasi maksimal 2TB
zfs get all tank/backup                   # lihat semua properties
zfs destroy tank/backup                   # hapus (permanen!)

4.2 Zvol (block device — untuk LUN iSCSI)#

Di QuTS hero, tiap LUN yang kamu buat di GUI = satu zvol.

zfs list -t volume                        # daftar semua zvol
zfs create -V 2T -o volblocksize=16K tank/lun-incus   # ekuivalen "create LUN 2TB"
zfs get volblocksize,compression,used tank/lun-incus

Properties penting untuk zvol VM:

PropertyRekomendasiAlasan
volblocksize16K32KMatch dengan random I/O VM; tidak bisa diubah setelah dibuat
compressionlz4Hemat space + sering justru mempercepat I/O
syncstandardJangan disabled — risiko korupsi data VM saat power loss
Thin provisioningBolehTapi monitor pool usage ketat (lihat §6)

5. Snapshot, Rollback, Clone#

Snapshot ZFS itu copy-on-write — instan dan awalnya 0 byte, hanya tumbuh seiring perubahan data.

# Buat & lihat snapshot
zfs snapshot tank/lun-incus@before-upgrade
zfs list -t snapshot

# Rollback (HATI-HATI: semua perubahan setelah snapshot hilang)
zfs rollback tank/lun-incus@before-upgrade

# Hapus snapshot lama
zfs destroy tank/lun-incus@before-upgrade

# Clone: dataset baru dari snapshot, writable, hemat space
zfs clone tank/lun-incus@before-upgrade tank/lun-test

Untuk LUN VM: snapshot di level zvol = crash-consistent (seperti VM ditarik kabel power). Untuk application-consistent (database), quiesce dulu dari sisi guest/Incus sebelum snapshot, atau andalkan journaling filesystem guest.

Di GUI: Storage Manager → Snapshot → set schedule (mis. hourly, retain 24 + daily, retain 7).


6. Replication (zfs send/receive)#

Backup pool SSD ke pool HDD (atau NAS lain) berbasis snapshot:

flowchart LR
    subgraph ssd["Pool SSD (tank)"]
        LUN["zvol lun-incus"] --> S1["@repl-1<br/><small>snapshot penuh</small>"]
        LUN --> S2["@repl-2<br/><small>snapshot berikutnya</small>"]
    end

    subgraph hdd["Pool HDD (backup)"]
        DEST["backup/lun-incus"]
    end

    S1 -- "zfs send (full)" --> DEST
    S2 -- "zfs send -i (delta saja)" --> DEST
# Full replication pertama
zfs snapshot tank/lun-incus@repl-1
zfs send tank/lun-incus@repl-1 | zfs receive hddpool/backup/lun-incus

# Incremental berikutnya (hanya kirim delta)
zfs snapshot tank/lun-incus@repl-2
zfs send -i @repl-1 tank/lun-incus@repl-2 | zfs receive hddpool/backup/lun-incus

# Ke NAS remote via SSH
zfs send -i @repl-1 tank/lun-incus@repl-2 | ssh backup-nas zfs receive tank/dr/lun-incus

Di QuTS hero, fitur ini dibungkus sebagai Snapshot Replica di GUI — pakai itu untuk jadwal otomatis. Kombinasi yang disarankan untuk pool SSD single-copy-critical:

  • Snapshot hourly (retain 24)
  • Replica ke HDD pool tiap 1 jam
  • RPO efektif: maksimal 1 jam data loss jika pool SSD mati total

7. Monitoring & Health#

7.1 Kapasitas — jangan lewat 80%#

Performa ZFS turun signifikan di atas ~80% full (alokasi blok makin mahal, fragmentasi naik).

zpool list -o name,size,alloc,free,cap,frag,health

Set alert di GUI pada threshold 80%. Thin-provisioned LUN bisa “meledak” diam-diam — pool bisa penuh walaupun LUN belum penuh dari sisi initiator.

7.2 ARC (read cache di RAM)#

arcstat 5                          # hit rate real-time
cat /proc/spl/kstat/zfs/arcstats | grep -E "^(hits|misses|size|c_max)"

ARC hit rate >90% = sehat. Kalau konsisten rendah + RAM masih ada slot, upgrade RAM lebih ngefek daripada SSD cache.

7.3 SMART & error disk#

smartctl -a /dev/nvme0n1 | grep -iE "wear|percentage|media|error"
zpool status -v                    # kolom READ/WRITE/CKSUM harus 0

CKSUM error naik = silent corruption terdeteksi — cek kabel/backplane/disk. Error yang sama berulang di satu disk = kandidat ganti.

7.4 Performa I/O#

zpool iostat -v tank 5             # per vdev — cek apakah load merata di 3 mirror
zpool iostat -l tank 5             # latency read/write per operasi

8. Checklist Operasional#

Harian (otomatis via alert):

  • Notifikasi email/push aktif untuk disk failure & pool degraded
  • Alert kapasitas pool di 80%

Mingguan:

  • zpool status -v — pastikan CKSUM/READ/WRITE = 0
  • Cek usage pool vs pertumbuhan thin LUN

Bulanan:

  • Scrub terjadwal jalan dan selesai tanpa error
  • Review SMART wear level SSD (percentage used)
  • Test restore 1 snapshot ke lokasi test (backup yang tidak pernah dites = tidak ada backup)

Saat disk rusak:

  1. Identifikasi via zpool status -v + serial number
  2. Locate LED bay di GUI sebelum cabut
  3. Ganti disk → resilver → verifikasi ONLINE
  4. Selama resilver: jangan cabut/restart apapun, pool sedang tanpa redundancy di vdev tsb

9. Quick Reference#

# Pool
zpool list                         # ringkasan pool
zpool status -v                    # detail vdev & error
zpool iostat -v 5                  # I/O per vdev
zpool scrub <pool>                 # mulai scrub
zpool replace <pool> <old> <new>   # ganti disk

# Dataset / zvol
zfs list                           # semua dataset
zfs list -t volume                 # semua zvol (LUN)
zfs list -t snapshot               # semua snapshot
zfs create <pool>/<ds>             # dataset baru
zfs create -V 1T <pool>/<vol>      # zvol baru
zfs set <prop>=<val> <target>      # ubah property
zfs get all <target>               # lihat property

# Snapshot & replication
zfs snapshot <ds>@<name>           # snapshot
zfs rollback <ds>@<name>           # rollback
zfs send -i @a <ds>@b | zfs receive <dest>   # incremental replica