如果有一顆硬碟故障了
該如何處理
首先用
zpool status
查看 pool 的組成模式、硬碟、狀態
正常情況 root@pve:~# zpool status pool: RAID1 state: ONLINE config: NAME STATE READ WRITE CKSUM RAID1 ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sda1 ONLINE 0 0 0 sdc1 ONLINE 0 0 0 ================================================== 異常 root@pve:~# zpool status pool: RAID1 state: DEGRADED status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-4J scan: resilvered 5.68M in 0 days 00:00:01 with 0 errors on Sun Nov 10 10:30:25 2019 config: NAME STATE READ WRITE CKSUM RAID1 DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 sda1 ONLINE 0 0 0 sdc1 UNAVAIL 3 261 0 errors: No known data errors
這時候,如果有一顆硬碟離線了
就會發現 HEALTH 變成 DEGRADED
root@pve:~# zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT RAID1 199G 744M 198G - - 0% 0% 1.00x DEGRADED -
這時候你就算更換了硬碟
也不會自動 rebuild 成 online
這是因為 zfs 預設參數問題
手動更換
更換流程
1.在更換硬碟之前
先用
zpool status
查看哪一顆硬碟故障 ex. sdc1
root@pve:~# zpool status pool: RAID1 state: DEGRADED status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-4J scan: resilvered 5.68M in 0 days 00:00:01 with 0 errors on Sun Nov 10 10:30:25 2019 config: NAME STATE READ WRITE CKSUM RAID1 DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 sda1 ONLINE 0 0 0 sdc1 UNAVAIL 3 261 0
2.移除故障硬碟
3.安裝新硬碟
使用 fdisk 進行初始化
fdisk dev/sdc
g
w
4.使用指令更換硬碟
可以先用 fdisk -l 檢查硬碟所在位置
同位置
zpool replace -f RAID1 sdc1
如果是不同硬碟位置
zpool replace -f RAID1 sdc1 sdd1
最後再用 zpool status 查看 resilvering 狀態 (rebuilding)
root@pve:~# zpool status pool: RAID1 state: DEGRADED 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 Sun Nov 10 10:53:33 2019 15.5G scanned at 2.58G/s, 773M issued at 129M/s, 15.5G total 776M resilvered, 4.87% done, 0 days 00:01:57 to go config: NAME STATE READ WRITE CKSUM RAID1 DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 sda1 ONLINE 0 0 0 replacing-1 DEGRADED 0 0 0 old UNAVAIL 3 261 0 sdc1 ONLINE 0 0 0 (resilvering)
resilver 完成
root@pve:~# zpool status pool: RAID1 state: ONLINE scan: resilvered 15.5G in 0 days 00:01:35 with 0 errors on Sun Nov 10 10:55:08 2019 config: NAME STATE READ WRITE CKSUM RAID1 ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sda1 ONLINE 0 0 0 sdc1 ONLINE 0 0 0 errors: No known data errors
可以看到 zfs 因為是 file level 儲存,所以只 resilver 有資料的部分
使用自動更換
zfs 預設參數是不會自動更換故障硬碟的
這部分可以用
zpool get all RAID1
找到 autoreplace
autoreplace 官方的定義是
只要在相同的實體位置 (就是同一個硬碟插槽)
找到新硬碟
那就會自動更換
autoreplace 這個參數 Proxmox 5.4 以前是 on
在 Proxmox 6.0 變成 off 了,而即便在 Proxmox 5.4 這個功能也不會起作用,必須要另外裝 zfs-zed 才行
zfs-zed ZFS Event Daemon
就是用來監控 zfs 的狀態
首先要先加入 Proxmox 官方的 Package Repository
安裝套件
apt update
apt install zfs-zed postfix
apt upgrade
* 這邊要注意 Proxmox 跟 debian 的 Repository 都有這個套件
必須使用 Proxmox 的
編輯 zed config
nano /etc/zfs/zed.d/zed.rc
## ZED_EMAIL_ADDR 用來發 mail 通知 zfs 狀態的使用者清單,範例發給兩位使用者 root test ZED_EMAIL_ADDR="root test" ## ZED_EMAIL_PROG 使用 mail 通知功能 ZED_EMAIL_PROG="mail" ## 設定格式 (參考 postfix) ZED_EMAIL_OPTS="-s '@SUBJECT@' @ADDRESS@" ## 多久要重新通知 範例 10 分鐘一次 ZED_NOTIFY_INTERVAL_SECS=600 ## 不管 pool health 皆發送通知 ZED_NOTIFY_VERBOSE=1 ## resilver 完成後,進行 scrub (校驗檔案錯誤)動作 ZED_SCRUB_AFTER_RESILVER=1 重啟 zfs-zed 服務 systemctl restart zfs-zed
開啟功能
zpool set autoreplace=on
發信測試
echo “Test Email from the new server” | mail -s “Test Subject”
可惜實際測試 PVE 6.0
這功能有 BUG ,大概是這樣所以官方預設關掉了
已知問題是,autoreplace 只有在重開機時才會運作
health state 改變也不會發通知