ZFS on Ubuntu 18.04 基本設定/初始化

Ubuntu 在 15.10 開始測試 ZFS16.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

到這邊基本上就可以開始使用了,這邊也補個日常遇到硬碟故障更換的流程

硬碟故障可以從系統監控、dmesgzpool 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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。