Backup và khôi phục ZFS phòng khi hỏng hệ điều hành

🧩 1. Tổng quan

File system ZFS (Zettabyte File System) là một trong những hệ thống tiên tiến và mạnh mẽ nhất hiện nay, nổi bật với khả năng:

Tuy nhiên, một câu hỏi phổ biến là: “Nếu hệ điều hành bị hỏng, tôi có bị mất cấu hình ZFS và dữ liệu không?”

Bài viết này sẽ hướng dẫn bạn cách:

  • Cài đặt ZFS,
  • Tạo pool từ nhiều ổ đĩa,
  • Tạo và ghi dữ liệu,
  • Backup cấu hình,
  • Mô phỏng sự cố mất pool,
  • Khôi phục lại từ bản sao lưu.

Tất cả được trình bày chi tiết thông qua một bài lab thực hành trên Ubuntu 22.04.

🛠️ 2. Yêu cầu hệ thống

  • Ubuntu Server/Desktop 22.04
  • 3 ổ đĩa trống: /dev/sdb, /dev/sdc, /dev/sdd, mỗi ổ 30GB
  • Tài khoản có quyền sudo

📊 3. Sơ đồ minh hoạ cấu trúc ZFS Pool RAIDZ

               +-------------------------+
               |       ZFS Pool          |
               |       datapool          |
               +-----------+-------------+
                           |
           +---------------+---------------+
           |               |               |
        /dev/sdb        /dev/sdc        /dev/sdd
           |               |               |
     Data Stripe     Data Stripe      Parity Block

ZFS sẽ tự động tính toán parity để bảo vệ dữ liệu – bạn có thể mất 1 ổ mà vẫn giữ nguyên dữ liệu.

🟢 Ưu điểm của ZFS

  • Tự động phát hiện và sửa lỗi silent data corruption.
  • Hỗ trợ snapshot, clone tức thì.
  • Tích hợp volume manager và file system.
  • Khả năng khôi phục cực kỳ mạnh mẽ.
  • Không mất dữ liệu nếu OS bị lỗi.

🔴 Nhược điểm của ZFS

  • Ngốn RAM (nên có tối thiểu 4GB RAM).
  • Không tương thích tốt với mọi loại RAID phần cứng.
  • Backup ZFS yêu cầu hiểu sâu snapshot/send/receive.

🔁 So sánh với LVM + EXT4

Tính năngZFSLVM + EXT4
SnapshotCó, tức thìCó, nhưng khó khăn
CloneKhông
RAID tích hợpCó (RAIDZ, mirror)Không
Khôi phục dễHạn chế
Dễ dùngTrung bìnhDễ hơn

📚 4. Cài đặt ZFS trên Ubuntu

apt update
apt install -y zfsutils-linux

Kiểm tra kernel module đã được tải chưa:

shell> lsmod | grep zfs
zfs                  3751936  8
zunicode              348160  1 zfs
zzstd                 487424  1 zfs
zlua                  155648  1 zfs
zavl                   20480  1 zfs
icp                   319488  1 zfs
zcommon               102400  2 zfs,icp
znvpair                94208  2 zfs,zcommon
spl                   118784  6 zfs,icp,zzstd,znvpair,zcommon,zavl

Nếu có dòng zfs xuất hiện, bạn đã sẵn sàng.

💽 4. Tạo Pool RAIDZ từ 3 ổ đĩa

RAIDZ tương tự như RAID5 – bảo vệ dữ liệu bằng parity.

zpool create datapool raidz /dev/sdb /dev/sdc /dev/sdd

📌 Sau khi tạo, kiểm tra lại pool:

shell> zpool status
  pool: datapool
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	datapool    ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdb     ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sdd     ONLINE       0     0     0

errors: No known data errors

shell> zfs list
NAME       USED  AVAIL     REFER  MOUNTPOINT
datapool   125K  57.8G     30.6K  /datapool

📂 5. Tạo Dataset và ghi dữ liệu

Dataset là phân vùng logic trong pool.

zfs create datapool/mydata

Verify

shell> df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              796M  1.3M  794M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   47G  7.2G   38G  17% /
tmpfs                              3.9G     0  3.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  126M  1.7G   7% /boot
tmpfs                              796M  4.0K  796M   1% /run/user/0
datapool                            58G  128K   58G   1% /datapool
datapool/mydata                     58G  128K   58G   1% /datapool/mydata

Tạo file test.

#!/bin/bash

# Set and create the target directory
DIR="/datapool/mydata"
sudo mkdir -p "$DIR"

# List of file sizes in MiB
sizes=(1 5 10 20 50 100 200)

# Create files with different sizes
for size in "${sizes[@]}"; do
    filename="$DIR/file_${size}MB.dat"
    echo "📝 Creating file $filename with size ${size}MB..."

    # Write random data to file
    sudo dd if=/dev/urandom of="$filename" bs=1M count="$size" status=progress
done

echo "✅ File creation completed!"

🧰 6. Backup cấu hình.

Tạo thư mục backup:

mkdir ~/zfs-backup

Sao lưu cấu hình:

zpool status > ~/zfs-backup/zpool_status.txt
zpool get all > ~/zfs-backup/zpool_get_all.txt
zfs list -r -t all > ~/zfs-backup/zfs_list.txt
zfs get all > ~/zfs-backup/zfs_get_all.txt

❌ Lưu ý rằng những lệnh này KHÔNG thể dùng để tự động khôi phục lại pool

  • Chúng không tạo ra file config có thể dùng được cho zpool import hoặc zfs receive.
  • Bạn không thể dùng các file .txt này để “load lại” ZFS tự động.
  • Chúng không chứa dữ liệu (data, snapshot).

✅ Nhưng chúng rất hữu ích trong các trường hợp sau:

  • ✅ Khi bạn cần rebuild lại ZFS thủ công sau sự cố:
    • Biết phải tạo những dataset nào
    • Dataset cũ có compression, quota, mountpoint gì
  • ✅ Khi bạn cần so sánh cấu hình trước và sau khi sự cố xảy ra
  • ✅ Khi bạn cần ghi chép cấu hình để chuẩn hoá nhiều server khác nhau

💣 7. Mô phỏng sự cố.

🔥 7.1. Xoá hoàn toàn pool – Mô phỏng mất metadata, không thể import

Đây là trường hợp mô phỏng hệ điều hành bị xóa, ổ cứng bị format hoặc cấu hình ZFS bị huỷ – không còn khả năng zpool import nữa.

Để khôi phục dữ liệu trong tình huống này, bạn bắt buộc phải backup bằng snapshot trước khi huỷ pool:

# Tạo snapshot trước khi huỷ
zfs snapshot -r datapool@backup1

# Backup toàn bộ dữ liệu ra file
zfs send -R datapool@backup1 > ~/zfs-backup/zfs_full_backup.dat

Sau đó mới tiến hành giả lập việc mất OS hay pool bị hỏng bằng cách xóa pool.

zpool destroy datapool

Lệnh zpool destroy thực hiện các thao tác sau:

  • Gỡ toàn bộ metadata ZFS khỏi ổ đĩa.
  • Đánh dấu toàn bộ các thiết bị là “free”.
  • Pool không thể khôi phục bằng zpool import được nữa.

Kiểm tra lại:

shell> zpool list
no pools available

shell> zfs list
no datasets available

Lúc này:

zpool import
# --> No pools available to import

Tiếp theo hãy khôi phục bằng cách tạo lại pool mới với cùng cấu trúc:

zpool create datapool raidz /dev/sdb /dev/sdc /dev/sdd

Nhận lại dữ liệu từ file backup:

zfs receive -F -v -u -x mountpoint datapool < ~/zfs-backup/zfs_full_backup.dat
zfs mount -a

Kiểm tra dữ liệu:

cat /datapool/mydata/hello.txt

Lưu ý trường hợp này:

  • Khi bạn mất cấu hình hoàn toàn, dùng zpool destroy để hủy pool mô phỏng pool hỏng hoàn toàn.
  • Tình huống này, bạn không thể khôi phục lại pool nếu chưa backup.
  • Do đó, việc sử dụng snapshot kèm zfs send là cực kỳ quan trọng nếu bạn có rủi ro mất ZFS config.

7.2. Mô phỏng mất OS, có thể import lại pool.

Trường hợp này thay vì destroy, bạn nên dùng để giả lập hỏng OS nhưng đã export cấu hình. Câu hỏi đặt ra là khi chạy zpool export datapool, thông tin pool được lưu ở đâu?

ZFS không lưu trạng thái pool vào hệ điều hành – thay vào đó, ZFS lưu metadata trực tiếp trên các thiết bị đĩa trong pool.

🔍 Cụ thể, thông tin sau được lưu trên disk:

  • Cấu trúc pool (RAIDZ, mirror, etc.)
  • Danh sách vdev (các ổ đĩa trong pool)
  • Dataset, snapshot, properties
  • Trạng thái “exported”

Do đó khi bạn cài lại OS hoàn toàn, thậm chí format root partition, thì thông tin pool vẫn nằm nguyên trên ổ đĩa!

Sau khi cài lại OS, bạn vẫn có thể import lại pool

zpool export datapool

Export nghĩa là “ngắt kết nối pool khỏi hệ điều hành hiện tại” nhưng không huỷ metadata. Lúc này ZFS sẽ:

  • Unmount toàn bộ dataset trong pool datapool.
  • Xoá pool ra khỏi kernel memory (dỡ bỏ khỏi hệ thống hiện tại).
  • Ghi trạng thái “exported” vào metadata trên đĩa.
  • Sau lệnh này, ZFS sẽ không còn thấy pool đó trong hệ thống cho đến khi bạn import lại.

Về bản chất, zpool exportzpool import có hành vi giống như một cách “unmount toàn bộ và mount lại sau này”, nhưng trong ngữ cảnh ZFS pool, nó làm nhiều hơn một chút.

Sau khi export, bạn có thể import lại bằng:

zpool import datapool

Lúc này ZFS sẽ:

  • Quét tất cả các thiết bị đang kết nối để tìm metadata ZFS.
  • Nhận thấy pool đã được “exported”, nên import lại vào hệ thống.
  • Tự động mount các dataset (tuỳ theo cờ canmountmountpoint).

🔄 Tóm lại:

Hành độngKết quả
zpool exportPool bị ngắt kết nối, có thể import lại sau
zpool destroyPool bị huỷ vĩnh viễn, mất metadata – không thể import lại
zpool importTìm và import pool đã export hoặc chưa được kết nối

🧪 Ví dụ quy trình:

Trước khi cài lại OS:

zpool export datapool

Cài mới Ubuntu, cài lại ZFS:

apt update sudo apt install zfsutils-linux

ZFS sẽ không tự import pool vì nó đang ở trạng thái “exported”, nhưng bạn có thể khôi phục bằng:

zpool import

Nếu ổ đĩa còn nguyên, bạn sẽ thấy:

  pool: datapool
    id: xxxxxxxxxxxxxxx
 state: ONLINE
 action: zpool import datapool

Sau đó bạn chỉ cần:

zpool import datapool

Thông báo này cho thấy ZFS phát hiện pool datapool từng được sử dụng trên một hệ thống khác (hostid khác), nên để bảo vệ dữ liệu, ZFS yêu cầu bạn xác nhận bằng cách dùng tùy chọn -f (force).

root@ubuntu:~# zpool import datapool
cannot import 'datapool': pool was previously in use from another system.
Last accessed by node77 (hostid=31b488a1) at Mon Jun 23 14:53:36 2025
The pool can be imported, use 'zpool import -f' to import the pool.

Chạy lại lệnh với tham số -f.

zpool import -f datapool

Sau khi import thành công, bạn nên kiểm tra các filesystem (dataset) đã mount hay chưa:

shell_new_node> zfs list
NAME              USED  AVAIL     REFER  MOUNTPOINT
datapool          387M  57.4G     30.6K  /datapool
datapool/mydata   386M  57.4G      386M  /datapool/mydata

Xem trạng thái pool.

shell_new_node> zpool status
  pool: datapool
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	datapool    ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdb     ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sdd     ONLINE       0     0     0

errors: No known data errors

Xem danh sách disk.

shell_new_node> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0   62M  1 loop /snap/core20/1587
loop1                       7:1    0 79.9M  1 loop /snap/lxd/22923
loop2                       7:2    0   47M  1 loop /snap/snapd/16292
sda                         8:0    0   50G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   48G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   48G  0 lvm  /
sdb                         8:16   0   30G  0 disk
├─sdb1                      8:17   0   30G  0 part
└─sdb9                      8:25   0    8M  0 part
sdc                         8:32   0   30G  0 disk
├─sdc1                      8:33   0   30G  0 part
└─sdc9                      8:41   0    8M  0 part
sdd                         8:48   0   30G  0 disk
├─sdd1                      8:49   0   30G  0 part
└─sdd9                      8:57   0    8M  0 part
sr0                        11:0    1 1024M  0 rom

Pool đã được tự động mount.

shell_new_node> df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              796M  1.3M  794M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   47G  6.8G   38G  16% /
tmpfs                              3.9G     0  3.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  126M  1.7G   7% /boot
tmpfs                              796M  4.0K  796M   1% /run/user/1000
datapool                            58G  128K   58G   1% /datapool
datapool/mydata                     58G  386M   58G   1% /datapool/mydata

Các file vẫn còn nguyên.

shell_new_node> ls -al /datapool/mydata
total 395149
drwxr-xr-x 2 root root        10 Jun 23 14:51 .
drwxr-xr-x 3 root root         3 Jun 23 14:43 ..
-rw-r--r-- 1 root root 104857600 Jun 23 14:51 file_100MB.dat
-rw-r--r-- 1 root root  10485760 Jun 23 14:51 file_10MB.dat
-rw-r--r-- 1 root root   1048576 Jun 23 14:51 file_1MB.dat
-rw-r--r-- 1 root root 209715200 Jun 23 14:51 file_200MB.dat
-rw-r--r-- 1 root root  20971520 Jun 23 14:51 file_20MB.dat
-rw-r--r-- 1 root root  52428800 Jun 23 14:51 file_50MB.dat
-rw-r--r-- 1 root root   5242880 Jun 23 14:51 file_5MB.dat
-rw-r--r-- 1 root root        10 Jun 23 14:49 hello.txt

📂 Còn file /etc/zfs/zpool.cache thì sao?

  • Đây là file cache giúp ZFS import tự động pool khi boot.
  • Nhưng nếu không có file này (ví dụ sau khi cài lại OS), bạn vẫn có thể import thủ công như trên.
  • File này có thể được tạo lại – không bắt buộc phải backup
  • Sau khi bạn zpool import, file này sẽ tự được sinh lại nếu bạn reboot hoặc chạy:
zpool set cachefile=/etc/zfs/zpool.cache datapool

🔥 Lưu ý rằng, bạn vẫn có thể khôi phục được pool ngay cả khi chưa chạy zpool export trước khi OS hỏng bất ngờ.

Bởi vì ZFS lưu toàn bộ metadata (cấu trúc pool, dataset, snapshot…) trực tiếp trên các ổ đĩa – không phụ thuộc vào hệ điều hành.

📌 zpool export chỉ là thao tác “ngắt kết nối sạch sẽ” với OS hiện tại:

  • Gỡ toàn bộ mountpoint
  • Cập nhật trạng thái “exported” lên đĩa (giúp pool không tự import nhầm)

⚠️ Khi nào mới thực sự không thể khôi phục?

  • Bạn đã chạy zpool destroy (xoá metadata trên disk)
  • Bạn ghi đè ổ đĩa bằng dữ liệu khác
  • Ổ đĩa bị hư vật lý, bad block, mất nhiều thiết bị trong RAIDZ
  • Bạn dùng ZFS over LUKS/LVM mà chưa unlock volume

➡️ Nhưng nếu bạn không export, ZFS vẫn có đủ thông tin để import lại – chỉ là nó cảnh báo thôi.

🛡️ Lời khuyên:

  • Nếu có thể: luôn zpool export trước khi tháo ổ đĩa hoặc cài lại OS.
  • Nếu không: không sao cả, bạn vẫn có thể zpool import -f.
  • Backup snapshot định kỳ để bảo vệ dữ liệu, không chỉ dựa vào metadata.

🏁 8. Kết luận

ZFS là một file system ổn định và có khả năng bảo vệ dữ liệu rất cao. Việc hiểu cách hoạt động của ZFS, cách backup cấu hình, snapshot và khôi phục là kỹ năng cực kỳ quan trọng cho bất kỳ ai vận hành hệ thống lưu trữ hiện đại.

Qua bài lab này, các bạn có thể nắm được:

  • Cách cài đặt và tạo pool RAIDZ,
  • Cách lưu cấu hình và snapshot,
  • Cách khôi phục dữ liệu khi hệ điều hành gặp sự cố.

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email