Ubuntu 在 15.10 開始測試 ZFS 、16.04 LTS 的時候正式加入了 ZFS 的支援,背後用的是 ZFS On Linux 的實做,這邊筆記一下已經使用在 Ubuntu 18.04 上了好一陣子的 ZFS 初始化過程
先安裝所需要的套件:
$ sudo apt install zfsutils-linux -y
接著建立 ZFS Pool
接著會使用到 zpool 這個指令,相關的操作都需要要有 root 權限,我這邊是要直接拿完整的整顆硬碟來用,不另外做分割,測試的時候方便起見可以直接用 /dev/sda /dev/sdb 這樣的路徑,所以一路從 sda 用到 sdz,名稱取叫 pool-ftp ,做 raidz3 讓這組 pool 一次最多可以掉三顆硬碟不掉資料,不怕掉資料可以不加這個設定、效果會等同 RAID0 ,硬碟數量如果沒這麼多但想要有個保險也可以用 raidz 或 raidz2 就好,分別為容許一顆和兩顆的硬碟失效,要 RAID1 的效果可以用 mirror 這個選項:
$ sudo zpool create pool-ftp raidz3 /dev/sda /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo /dev/sdp /dev/sdq /dev/sdr /dev/sds /dev/sdt /dev/sdu /dev/sdv /dev/sdw /dev/sdx /dev/sdy /dev/sdz
不過正式環境還是建議不要使用 sda / sdb 而是使用 Disk ID / Label / UUID 的方式來認硬碟,就不用擔心未來順序可能改變或亂掉的問題,如果是整批相同型號的硬碟要做處理,透過 Disk ID 其實也很方便,例如:
$ command ls /dev/disk/by-id/ata-ST8000NM0055* | xargs sudo zpool create ftp-pool
如果過程中出現了這樣的訊息,在確認硬碟上沒有其他資料的情況下可以加 -f 的參數:
/dev/sdz does not contain an EFI label but it may contain partition information in the MBR.
如果沒有錯誤訊息就表示操作成功了
建立完 zpool 後的狀態確認
建立後的結果可以透過 zpool status 和 zpool list 確認,透過 zpool list 看到的是不考慮容錯所佔用、實際整個 pool 的空間,會比用 df 看到得來的大 (Disk ID 我還是稍微馬賽克改一下):
$ sudo zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ftp-pool 196T 1.97M 189T - 0% 0% 1.00x ONLINE -
$ sudo zpool status
pool: ftp-pool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
ftp-pool ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
errors: No known data errors
因為在建 ZFS Pool 的時候沒有透過 -m 指定掛載點,預設會直接使用 pool 的名稱建一個路徑在 root 底下,可以用 ls 和 df 看一下,也可以順便確認一下大小夠用,如果前面下錯參數,這邊可能就會得到預期以外的可用空間,這邊 df 看到的空間會比 zpool list 看到的小:
$ ls -l /ftp-pool/
total 0
$ df -H /ftp-pool/
Filesystem Type Size Used Avail Use% Mounted on
ftp-pool zfs 156T 256K 156T 1% /ftp-pool
ZFS Pool 都沒問題了之後接著在上面建檔案系統,ZFS 號稱一個 Pool 裡面可以建利多達 2 的 64 次方這麼多個檔案系統 … 短期內應該是用不太到 XD
建立檔案系統
建檔案系統的指令不再是前面的 zpool 、而是 zfs ,一樣需要 root 權限,我這邊範例建立一個叫 data 的檔案系統:
$ sudo zfs create ftp-pool/data
沒有出現錯誤訊息一樣代表成功,接著一樣做簡單的確認:
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
ftp-pool 1.46M 156T 307K /ftp-pool
ftp-pool/data 307K 156T 307K /ftp-pool/data
$ ls -l /ftp-pool/data
total 0
$ df /ftp-pool/data
Filesystem Type Size Used Avail Use% Mounted on
ftp-pool/data zfs 156T 384K 156T 1% /ftp-pool/data
加速 ZFS 性能
ZFS 建立好後,考慮到我們希望能夠有更好的效能,可以透過快取 (L2ARC) 還有把 ZIL(ZFS Intent Log) 改放到外部(而且夠快)儲存空間上的方式達到加速的結果,前者加速的是讀取的操作、後者加速的是寫入的操作,可以的話至少都各補一顆速度夠快的 SSD 碟給他們就能達到很不錯的加速效果
第一種方法:拿 SSD 做快取
透過 zpool add
補上一顆 SSD 硬碟作為快取使用 (關鍵字是 cache):
$ sudo zpool add ftp-pool cache /dev/disk/by-id/ata-INTEL_SSDSC2BB240G7_PHD12345ABC
再透過 zpool status
看的時候就會發現多了一顆 cache 硬碟再最下面:
$ sudo zpool status
pool: ftp-pool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
ftp-pool ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
cache
ata-INTEL_SSDSC2BB240G7_PHD12345ABC ONLINE 0 0 0
第二種方法:拿 SSD 做 ZIL (ZFS Intent Log) 儲存空間
一樣透過 zpool add 補上一顆 SSD 硬碟,但是作為 log 使用 (關鍵字是 log),這邊記得不要和剛剛用到重複的硬碟,兩顆的功能不一樣
$ sudo zpool add ftp-pool log /dev/disk/by-id/ata-INTEL_SSDSC2BB240G7_PHD67890EFG
再透過 zpool status 可以看到底下多了一顆 logs 的硬碟了:
$ sudo zpool status
pool: ftp-pool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
ftp-pool ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
logs
ata-INTEL_SSDSC2BB240G7_PHD67890EFG ONLINE 0 0 0
cache
ata-INTEL_SSDSC2BB240G7_PHD12345ABC ONLINE 0 0 0
要注意的是存放 log 硬碟弱勢失效則有可能導致短暫的資料遺失,如果不能接受這個風險的話可以幫 log 硬碟做 mirror ,同時加入兩顆硬碟並且下指令的時候在 log 後面加上關鍵字 “mirror”,像這樣,就會比較保險了:
$ sudo zpool add ftp-pool log mirror /dev/sda /dev/sdb
到這邊基本上就可以開始使用了,這邊也補個日常遇到硬碟故障更換的流程
硬碟故障可以從系統監控、dmesg
、zpool status
等指令看到,這邊從 zpool status
確認,可以看到 pool 狀態是 DEGRADED (降級) 而不是正常的 ONLINE,並且有看到一顆硬碟的狀態是 UNAVAIL :
$ sudo zpool status
pool: ftp-pool
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Aug 31 15:14:30 2020
28.5G scanned out of 115T at 79.5M/s, 422h32m to go
726M resilvered, 0.02% done
config:
NAME STATE READ WRITE CKSUM
ftp-pool DEGRADED 0 0 0
raidz3-0 DEGRADED 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0 (resilvering)
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
1078152416620325459 UNAVAIL 0 0 0 was /dev/disk/by-id/ata-WDC_WD60EFRX-68MYMN1_WD-WX12345-part1
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
因為硬碟槽不夠,打算先把壞掉的硬碟直接下線更換,先透過 zpool offline
指令把硬碟狀態改為 offline:
$ sudo zpool offline ftp-pool 1078152416620325459
$ sudo zpool status
pool: ftp-pool
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Aug 31 15:14:30 2020
28.5G scanned out of 115T at 79.5M/s, 422h32m to go
726M resilvered, 0.02% done
config:
NAME STATE READ WRITE CKSUM
ftp-pool DEGRADED 0 0 0
raidz3-0 DEGRADED 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0 (resilvering)
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
1078152416620325459 OFFLINE 0 0 0 was /dev/disk/by-id/ata-WDC_WD60EFRX-68MYMN1_WD-WX12345-part1
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
ata-WDC_WD60EFRX-68L0BN1_WD-WX00000 ONLINE 0 0 0
把硬碟狀態改為 offline 後本想先透過 smartctl
等工具讀取硬碟 SMART 資訊出來看一下狀況,有時候不見得是硬碟壞了,不過這次發現硬碟似乎是完全失靈了,甚至重新插拔硬碟 dmesg
都沒看到,就先跳過這個步驟
然後用 zpool replace
指令把故障的硬碟替換為要補上去的硬碟
$ sudo zpool replace ftp-pool 1078152416620325459 /dev/sdam
後面再找時間筆記檔案完整性檢查等維護工作 …
比較詳細的解說建議可以參考 FreeBSD 的 Handbook ZFS 相關章節:https://www.freebsd.org/doc/zh_TW/books/handbook/zfs.html