請查看如下各節來解決缺乏設備、設備被移除或發生故障等問題。html
若是設備沒法打開,則它在 zpool status 輸出中顯示爲 UNAVAIL狀態。此狀態表示在首次訪問池時 ZFS 沒法打開設備,或者設備自那時以來已變得不可用。若是設備致使頂層虛擬設備不可用,則沒法訪問池中的任何內容。此外,池的容錯能力可能已受到損害。不管哪一種狀況,只須要將設備從新附加到系統便可恢復正常操做。若是須要替換因發生故障而處於 UNAVAIL 狀態的設備,請參見替換 ZFS 存儲池中的設備。promise
若是根池或鏡像的根池中的某個設備狀態爲 UNAVAIL,請參見如下參考資料:安全
鏡像根池磁盤發生故障-從鏡像 ZFS 根池中的備用磁盤引導網絡
替換根池中的磁盤架構
如何替換 ZFS 根池中的磁盤oracle
完整的根池災難恢復-恢復 ZFS 根池或根池快照性能
例如,設備出現故障後,可能會在 fmd 的輸出中看到相似於如下內容的消息:ui
SUNW-MSG-ID: ZFS-8000-FD, TYPE: Fault, VER: 1, SEVERITY: Major EVENT-TIME: Thu Jun 24 10:42:36 PDT 2010 PLATFORM: SUNW,Sun-Fire-T200, CSN: -, HOSTNAME: daleks SOURCE: zfs-diagnosis, REV: 1.0 EVENT-ID: a1fb66d0-cc51-cd14-a835-961c15696fcb DESC: The number of I/O errors associated with a ZFS device exceeded acceptable levels. Refer to http://sun.com/msg/ZFS-8000-FD for more information. AUTO-RESPONSE: The device has been offlined and marked as faulted. An attempt will be made to activate a hot spare if available. IMPACT: Fault tolerance of the pool may be compromised. REC-ACTION: Run 'zpool status -x' and replace the bad device.
要查看有關設備問題和解決辦法的更詳細信息,請使用 zpool status -x 命令。例如:spa
# zpool status -x pool: tank state: DEGRADED status: One or more devices could not be opened. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Attach the missing device and online it using 'zpool online'. see: http://www.sun.com/msg/ZFS-8000-2Q scan: scrub repaired 0 in 0h0m with 0 errors on Tue Sep 27 16:59:07 2011 config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 c2t2d0 ONLINE 0 0 0 c2t1d0 UNAVAIL 0 0 0 cannot open errors: No known data errors
今後輸出中能夠看到,設備 c2t1d0 未正常運行。若是您肯定該設備有問題,請予以替換。3d
若有必要,可以使用 zpool online 命令使替換的設備聯機。例如:
# zpool online tank c2t1d0
若是 fmadm faulty 的輸出標識出了該設備錯誤,請讓 FMA 知道設備已被替換。例如:
# fmadm faulty --------------- ------------------------------------ -------------- --------- TIME EVENT-ID MSG-ID SEVERITY --------------- ------------------------------------ -------------- --------- Sep 27 16:58:50 e6bb52c3-5fe0-41a1-9ccc-c2f8a6b56100 ZFS-8000-D3 Major Host : neo Platform : SUNW,Sun-Fire-T200 Chassis_id : Product_sn : Fault class : fault.fs.zfs.device Affects : zfs://pool=tank/vdev=c75a8336cda03110 faulted and taken out of service Problem in : zfs://pool=tank/vdev=c75a8336cda03110 faulted and taken out of service Description : A ZFS device failed. Refer to http://sun.com/msg/ZFS-8000-D3 for more information. Response : No automated response will occur. Impact : Fault tolerance of the pool may be compromised. Action : Run 'zpool status -x' and replace the bad device. # fmadm repaired zfs://pool=tank/vdev=c75a8336cda03110
最後一步是確認設備更換後的池正常運行。例如:
# zpool status -x tank pool 'tank' is healthy
若是某個設備已從系統中完全刪除,則 ZFS 會檢測到該設備沒法打開,並將其置於 REMOVED 狀態。這一刪除可能會致使整個池變得不可用,但也可能不會,具體取決於池的數據複製級別。若是鏡像設備或 RAID-Z 設備中的一個磁盤被刪除,仍能夠繼續訪問池。在如下狀況下,池可能會變爲 UNAVAIL 狀態,即沒法訪問數據,除非從新附加設備:
鏡像的全部組件都被刪除
RAID-Z (raidz1) 設備中有一個以上設備被刪除
單磁盤配置中移除了頂層設備
從新附加缺乏的設備的具體方式取決於相關設備。若是設備是網絡鏈接驅動器,則應該恢復與網絡的鏈接。若是設備是 USB 設備或其餘可移除介質,則應該將它從新附加到系統。若是設備是本地磁盤,則控制器可能已出現故障,以至設備對於系統再也不可見。在這種狀況下,應該替換控制器,以使磁盤從新可用。可能存在其餘問題,具體取決於硬件的類型及其配置。若是驅動器出現故障,且對系統再也不可見,則應該將該設備視爲損壞的設備。按照更換或修復損壞的設備中概述的過程進行操做。
若是設備鏈接受到損害,池可能變爲 SUSPENDED 狀態。在設備問題獲得解決以前,SUSPENDED 池一直處於 wait 狀態。例如:
# zpool status cybermen pool: cybermen state: SUSPENDED status: One or more devices are unavailable in response to IO failures. The pool is suspended. action: Make sure the affected devices are connected, then run 'zpool clear' or 'fmadm repaired'. see: http://www.sun.com/msg/ZFS-8000-HC scan: none requested config: NAME STATE READ WRITE CKSUM cybermen UNAVAIL 0 16 0 c8t3d0 UNAVAIL 0 0 0 c8t1d0 UNAVAIL 0 0 0
當設備鏈接恢復後,請清除池或設備錯誤。
# zpool clear cybermen # fmadm repaired zfs://pool=name/vdev=guid
將設備從新附加到系統後,ZFS 可能會也可能不會自動檢測其可用性。若是池先前爲 UNAVAIL 或 SUSPENDED 狀態,或者在執行 attach 的過程當中系統進行了從新引導,則 ZFS 在嘗試打開該池時,會自動從新掃描全部設備。若是在系統運行時池的性能下降且設備已替換,則必須通知 ZFS 設備如今是可用的並可使用 zpool online 命令從新打開。例如:
# zpool online tank c0t1d0
有關使設備聯機的更多信息,請參見使設備聯機。
本節介紹如何肯定設備故障類型、清除瞬態錯誤和替換設備。
術語損壞的設備至關含糊,它能夠用來描述許多可能的狀況:
位損壞-隨着時間的推移,隨機事件(如電磁感應和宇宙射線)可能會致使存儲在磁盤上的位發生翻轉。這些事件相對少見,可是一般足以致使大系統或長時間運行的系統出現潛在的數據損壞。
誤導的讀取或寫入-固件已知問題或硬件故障能夠致使整個塊的讀取或寫入引用磁盤上的不正確位置。這些錯誤一般是瞬態的,儘管大量此類錯誤可能指示驅動器有故障。
管理員錯誤-管理員可能無心中用錯誤的數據覆蓋了部分磁盤(如在部分磁盤上覆制 /dev/zero),從而致使磁盤上出現永久性損壞。這些錯誤始終是瞬態的。
臨時故障-磁盤可能在某段時間內變得不可用,從而致使 I/O 失敗。此狀況一般與網絡鏈接設備相關聯,儘管本地磁盤也可能遇到臨時故障。這些錯誤多是也可能不是瞬態的。
劣質或不可靠的硬件-這種狀況涵蓋故障硬件表現出來的全部各類問題,包括一致的 I/O 錯誤、故障傳輸致使隨機損壞或任何數量的故障。這些錯誤一般是永久性的。
脫機的設備-若是設備處於脫機狀態,則假定是管理員因該設備有故障而將它置於此狀態。將設備置於此狀態的管理員能夠肯定此假定是否正確。
準確肯定設備的問題多是一個很困難的過程。第一步是檢查 zpool status 輸出中的錯誤計數。例如:
# zpool status -v tank pool: tank state: ONLINE status: One or more devices has experienced an error resulting in data corruption. Applications may be affected. action: Restore the file in question if possible. Otherwise restore the entire pool from backup. see: http://www.sun.com/msg/ZFS-8000-8A scan: scrub in progress since Tue Sep 27 17:12:40 2011 63.9M scanned out of 528M at 10.7M/s, 0h0m to go 0 repaired, 12.11% done config: NAME STATE READ WRITE CKSUM tank ONLINE 2 0 0 mirror-0 ONLINE 2 0 0 c2t2d0 ONLINE 2 0 0 c2t1d0 ONLINE 2 0 0 errors: Permanent errors have been detected in the following files: /tank/words
錯誤分爲 I/O 錯誤與校驗和錯誤,這兩種錯誤都指示可能的故障類型。典型操做可預知的錯誤數很是少(在很長一段時間內只能預知幾個錯誤)。若是看到大量的錯誤,則此狀況可能指示即將出現或已出現設備故障。然而,管理員錯誤也可能致使錯誤計數較大。另外一信息源是 syslog 系統日誌。若是日誌顯示大量的 SCSI 或光纖通道驅動程序消息,則此狀況可能指示出現了嚴重的硬件問題。若是未生成 syslog 消息,則損壞極可能是瞬態的。
目的是回答如下問題:
此設備上是否可能出現另外一錯誤?
僅出現一次的錯誤被認爲是瞬態的,不指示存在潛在的故障。其持久性或嚴重性足以指明潛在硬件故障的錯誤被認爲是致命的。因爲肯定錯誤類型的行爲已超出當前可用於 ZFS 的任何自動化軟件的功能範圍,所以如此多的操做必須由您(即管理員)手動執行。在肯定後,能夠執行相應的操做。清除瞬態錯誤,或者替換出現致命錯誤的設備。如下幾節將介紹這些修復過程。
即便設備錯誤被認爲是瞬態的,仍然可能致使池中出現了沒法更正的數據錯誤。這些錯誤須要特殊的修復過程,即便認爲底層設備運行情況良好或已進行修復也是如此。有關修復數據錯誤的更多信息,請參見修復損壞的數據。
若是認爲設備錯誤是瞬態的(由於它們不大可能影響設備未來的運行情況),則能夠安全地清除設備錯誤,以指示未出現致命錯誤。要將 RAID-Z 或鏡像設備的錯誤計數器清零,請使用 zpool clear 命令。例如:
# zpool clear tank c1t1d0
此語法清除全部設備錯誤,並清除與設備關聯的任何數據錯誤計數。
要清除與池中虛擬設備關聯的全部錯誤,並清除與池關聯的任何數據錯誤計數,請使用如下語法:
# zpool clear tank
有關清除池錯誤的更多信息,請參見清除存儲池設備錯誤。
若是設備損壞是永久性的,或者未來極可能出現永久性損壞,則必須替換該設備。是否能夠替換設備取決於配置。
肯定是否能夠替換設備
若是要替換的設備是冗餘配置的一部分,則必須存在能夠從其中檢索正確數據的足夠副本。例如,若是在一個四向鏡像中有兩個磁盤處於 UNAVAIL 狀態,則能夠替換其中任何一個磁盤(由於有運行情況良好的副本可用)。可是,若是四向 RAID-Z (raidz1) 虛擬設備中有兩個磁盤爲 UNAVAIL 狀態,則這兩個磁盤都不能替換,由於不存在可從其中檢索數據的足夠副本。若是設備已損壞但處於聯機狀態,則只要池不處於 UNAVAIL 狀態就能夠替換它。可是,除非存在包含正確數據的足夠副本,不然會將設備上的任何損壞數據複製到新設備。
在如下配置中,能夠替換磁盤 c1t1d0,並且將從無缺的副本 c1t0d0 複製池中的任何數據:
mirror DEGRADED c1t0d0 ONLINE c1t1d0 FAULTED
雖然因沒有可用的正確副本而沒法對數據進行自我修復,但仍是能夠替換磁盤 c1t0d0。
在如下配置中,沒法替換任一 UNAVAIL 磁盤。也沒法替換 ONLINE 磁盤,由於池自己爲 UNAVAIL 狀態。
raidz FAULTED c1t0d0 ONLINE c2t0d0 FAULTED c3t0d0 FAULTED c4t0d0 ONLINE
在如下配置中,儘管已將磁盤上存在的錯誤數據複製到新磁盤,可是任一頂層磁盤均可替換。
c1t0d0 ONLINE c1t1d0 ONLINE
若是任一個磁盤爲 UNAVAIL 狀態,則沒法執行任何替換操做,由於池自己爲 UNAVAIL 狀態。
沒法替換的設備
若是設備缺失致使池變爲 UNAVAIL 狀態,或者設備在非冗餘配置中包含太多的數據錯誤,則沒法安全地替換設備。若是沒有足夠的冗餘,則不存在可用來恢復損壞設備的正確數據。這種狀況下,惟一的選擇是銷燬池並從新建立配置,而後從備份副本恢復數據。
有關恢復整個池的更多信息,請參見修復 ZFS 存儲池範圍內的損壞。
替換 ZFS 存儲池中的設備
肯定能夠替換設備後,可使用 zpool replace 命令替換設備。若是要用不一樣的設備替換損壞的設備,請使用相似如下的語法:
# zpool replace tank c1t1d0 c2t0d0
此命令將數據從損壞的設備或從池中的其餘設備(若是處於冗餘配置中)遷移到新設備。此命令完成後,將從配置中拆離損壞的設備,此時能夠將該設備從系統中移除。若是已移除設備並在同一位置中將它替換爲新設備,請使用命令的單設備形式。例如:
# zpool replace tank c1t1d0
此命令接受未格式化的磁盤,適當地將它格式化,而後從新同步其他配置中的數據。
有關 zpool replace 命令的更多信息,請參見替換存儲池中的設備。
示例 10-1 替換 ZFS 存儲池中的 SATA 磁盤
如下示例展現瞭如何將系統上的鏡像存儲池 tank 中的設備 (c1t3d0) 替換爲 SATA 設備。要在同一位置將磁盤 c1t3d0 替換爲新磁盤 (c1t3d0),嘗試替換磁盤以前必須取消磁盤配置。若是要替換的磁盤不是 SATA 磁盤,則請參見替換存儲池中的設備。
基本步驟以下:
使要替換的磁盤 (c1t3d0) 脫機。您不能取消配置當前正在使用的 SATA 磁盤。
使用 cfgadm 命令肯定要取消配置的 SATA 磁盤 (c1t3d0) 並取消其配置。若是磁盤在此鏡像配置中脫機,該池將降級,但該池將繼續可用。
物理替換磁盤 (c1t3d0)。在物理移除 UNAVAIL 狀態的驅動器(若是有)以前,請確保藍色的 Ready to Remove(能夠移除)LED 指示燈亮起。
從新配置 SATA 磁盤 (c1t3d0)。
使新磁盤 (c1t3d0) 聯機。
運行 zpool replace 命令以替換磁盤 (c1t3d0)。
注 - 若是先前將池屬性 autoreplace 設置爲 on,則會自動對在先前屬於池的設備的同一物理位置處找到的任何新設備進行格式化和替換,而無需使用 zpool replace 命令。此功能可能並非在全部硬件上都受支持。
若是已使用熱備件自動替換了故障磁盤,則您可能須要在替換故障磁盤後分離該熱備件。例如,若是替換故障磁盤後,c2t4d0 仍爲活動熱備件,則對其進行分離。
# zpool detach tank c2t4d0
若是 FMA 報告了有故障的設備,您應當清除設備故障。
# fmadm faulty # fmadm repaired zfs://pool=name/vdev=guid
如下示例分步顯示了替換 ZFS 存儲池中的磁盤的過程。
# zpool offline tank c1t3d0 # cfgadm | grep c1t3d0 sata1/3::dsk/c1t3d0 disk connected configured ok # cfgadm -c unconfigure sata1/3 Unconfigure the device at: /devices/pci@0,0/pci1022,7458@2/pci11ab,11ab@1:3 This operation will suspend activity on the SATA device Continue (yes/no)? yes # cfgadm | grep sata1/3 sata1/3 disk connected unconfigured ok <Physically replace the failed disk c1t3d0> # cfgadm -c configure sata1/3 # cfgadm | grep sata1/3 sata1/3::dsk/c1t3d0 disk connected configured ok # zpool online tank c1t3d0 # zpool replace tank c1t3d0 # zpool status tank pool: tank state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Tue Feb 2 13:17:32 2010 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c1t1d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c0t2d0 ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 mirror-2 ONLINE 0 0 0 c0t3d0 ONLINE 0 0 0 c1t3d0 ONLINE 0 0 0 errors: No known data errors
請注意,上述 zpool output 可能會在 replacing 標題下顯示新磁盤和舊磁盤。例如:
replacing DEGRADED 0 0 0 c1t3d0s0/o FAULTED 0 0 0 c1t3d0 ONLINE 0 0 0
此文本表示替換過程正在進行,且新磁盤正在從新同步。
若是您打算將一個磁盤 (c1t3d0) 替換爲另外一個磁盤 (c4t3d0),則只需運行 zpool replace 命令。例如:
# zpool replace tank c1t3d0 c4t3d0 # zpool status pool: tank state: DEGRADED scrub: resilver completed after 0h0m with 0 errors on Tue Feb 2 13:35:41 2010 config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c1t1d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c0t2d0 ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 mirror-2 DEGRADED 0 0 0 c0t3d0 ONLINE 0 0 0 replacing DEGRADED 0 0 0 c1t3d0 OFFLINE 0 0 0 c4t3d0 ONLINE 0 0 0 errors: No known data errors
磁盤替換完成以前,您可能須要屢次運行 zpool status 命令。
# zpool status tank pool: tank state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Tue Feb 2 13:35:41 2010 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c1t1d0 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 c0t2d0 ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 mirror-2 ONLINE 0 0 0 c0t3d0 ONLINE 0 0 0 c4t3d0 ONLINE 0 0 0
示例 10-2 更換出現故障的日誌設備
ZFS 在 zpool status 命令輸出中標識意圖日誌 (intent log) 故障。故障管理架構 (Fault Management Architecture, FMA) 也會報告這些錯誤。ZFS 和 FMA 都介紹如何從意圖日誌 (intent log) 故障中恢復。
如下示例說明如何從存儲池 (pool) 中出現故障的日誌設備 (c0t5d0) 進行恢復。基本步驟以下:
查看 zpool status -x 輸出和 FMA 診斷消息。有關說明,請參見如下頁面:
物理更換出現故障的日誌設備。
使新日誌設備聯機。
清除池的錯誤狀態。
清除 FMA 錯誤。
# zpool status -x pool: pool state: FAULTED status: One or more of the intent logs could not be read. Waiting for adminstrator intervention to fix the faulted pool. action: Either restore the affected device(s) and run 'zpool online', or ignore the intent log records by running 'zpool clear'. scrub: none requested config: NAME STATE READ WRITE CKSUM pool FAULTED 0 0 0 bad intent log mirror ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c0t4d0 ONLINE 0 0 0 logs FAULTED 0 0 0 bad intent log c0t5d0 UNAVAIL 0 0 0 cannot open <Physically replace the failed log device> # zpool online pool c0t5d0 # zpool clear pool
例如,若是系統在將同步寫操做提交給具備單獨日誌設備的池以前忽然關閉,您將會看到相似如下內容的信息:
# zpool status -x pool: pool state: FAULTED status: One or more of the intent logs could not be read. Waiting for adminstrator intervention to fix the faulted pool. action: Either restore the affected device(s) and run 'zpool online', or ignore the intent log records by running 'zpool clear'. scrub: none requested config: NAME STATE READ WRITE CKSUM pool FAULTED 0 0 0 bad intent log mirror-0 ONLINE 0 0 0 c0t1d0 ONLINE 0 0 0 c0t4d0 ONLINE 0 0 0 logs FAULTED 0 0 0 bad intent log c0t5d0 UNAVAIL 0 0 0 cannot open <Physically replace the failed log device> # zpool online pool c0t5d0 # zpool clear pool # fmadm faulty # fmadm repair zfs://pool=name/vdev=guid
您能夠經過如下方式解決日誌設備故障:
更換或恢復日誌設備。在此示例中,日誌設備是 c0t5d0。
將日誌設備從新聯機。
# zpool online pool c0t5d0
重置故障日誌設備的錯誤狀態。
# zpool clear pool
要今後錯誤中恢復而不更換故障日誌設備,可使用 zpool clear 命令清除該錯誤。在這種狀況下,池將在降級模式下運行,而且日誌記錄將被寫入到主池,直到更換單獨的日誌設備。
請考慮使用鏡像日誌設備來避免日誌設備故障情形。
查看從新同步狀態
替換設備這一過程可能須要很長一段時間,具體取決於設備的大小和池中的數據量。將數據從一個設備移動到另外一個設備的過程稱爲從新同步,可使用 zpool status 命令監視此過程。
傳統的文件系統在塊級別上從新同步數據。因爲 ZFS 消除了卷管理器的人爲分層,所以它可以以更強大的受控方式執行從新同步。此功能的兩個主要優勢以下:
ZFS 僅從新同步最少許的必要數據。若是是短暫的斷電(而不是設備替換),整個磁盤能夠在幾分鐘或幾秒內從新同步。替換整個磁盤時,從新同步過程所用的時間與磁盤上所用的數據量成比例。若是隻使用了池中幾 GB 的磁盤空間,則替換 500 GB 的磁盤可能只須要幾秒的時間。
從新同步是可中斷的和安全的。若是系統斷電或者進行從新引導,則從新同步過程會準確地從它中止的位置繼續,而無需手動干預。
要查看從新同步過程,請使用 zpool status 命令。例如:
# zpool status tank pool: tank 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. scrub: resilver in progress for 0h0m, 22.60% done, 0h1m to go config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 replacing-0 DEGRADED 0 0 0 c1t0d0 UNAVAIL 0 0 0 cannot open c2t0d0 ONLINE 0 0 0 85.0M resilvered c1t1d0 ONLINE 0 0 0 errors: No known data errors
在本示例中,磁盤 c1t0d0 被替換爲 c2t0d0。經過查看狀態輸出的配置部分中是否顯示有 replacing ,可觀察到此替換虛擬設備的事件。此設備不是真正的設備,不可能使用它建立池。此設備的用途僅僅是顯示從新同步進度,以及肯定被替換的設備。
請注意,當前正進行從新同步的任何池都處於 ONLINE 或 DEGRADED 狀態,這是由於在從新同步過程完成以前,池沒法提供所需的冗餘級別。雖然 I/O 始終是按照比用戶請求的 I/O 更低的優先級調度的(以最大限度地減小對系統的影響),可是從新同步會盡量快地進行。從新同步完成後,該配置將恢復爲新的完整配置。例如:
# zpool status tank pool: tank state: ONLINE scrub: resilver completed after 0h1m with 0 errors on Tue Feb 2 13:54:30 2010 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c2t0d0 ONLINE 0 0 0 377M resilvered c1t1d0 ONLINE 0 0 0 errors: No known data errors
池再次處於 ONLINE 狀態,並且原故障磁盤 (c1t0d0) 已從配置中刪除。