🧩 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ăng | ZFS | LVM + EXT4 |
---|---|---|
Snapshot | Có, tức thì | Có, nhưng khó khăn |
Clone | Có | Không |
RAID tích hợp | Có (RAIDZ, mirror) | Không |
Khôi phục dễ | Có | Hạn chế |
Dễ dùng | Trung bình | Dễ 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ặczfs 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 export
và zpool 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ờ
canmount
vàmountpoint
).
🔄 Tóm lại:
Hành động | Kết quả |
---|---|
zpool export | Pool bị ngắt kết nối, có thể import lại sau |
zpool destroy | Pool bị huỷ vĩnh viễn, mất metadata – không thể import lại |
zpool import | Tì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ố.