天天看點

PC 上的 LVM 災難修複

LVM 是邏輯盤卷管理(Logical Volume Manager)的簡稱,最早是 IBM 為 AIX 研發的存儲管理機制。LVM 通過在硬碟和分區之間建立一個邏輯層,可以讓多個分區或者實體硬碟作為一個邏輯卷 ( 相當于一個邏輯硬碟 ),提高了磁盤分區管理的靈活性。1998 年,Heinz Mauelshagen 在 Linux 2.4 核心上提供了 Linux 的 LVM 實作。目前 Linux 2.6 核心支援 LVM2,Redhat 官方網站目前提供最新可下載下傳版本為 2.2.02.77;如果需要最新或者其它版本,請參考網頁。

LVM 早期多用于伺服器,配合存儲硬體的 Raid 技術,提供高可靠性,可靈活配置的磁盤分區管理;普通 PC 由于存儲容量有限,很少使用這種技術。随着單個磁盤容量的不斷擴大和硬碟價格的下降,普通 PC 擁有 TB 級的大容量存儲空間逐漸普及,也帶來對 PC 上存儲管理的需要,LVM 無疑是很好的解決方案。隻是普通 PC 使用者由于缺少硬體備援保護,在發生災難時,通常會發生比較嚴重的資料損失。好在 LVM 提供了一系列災難恢複的功能,可以幫助普通 PC 使用者盡可能減少損失。

我們可以通過下面的指令檢查系統中是否安裝了 lvm 工具:

上例系統安裝了 2.02.56 版本的 LVM。

硬碟儲存設備進行管理 , 相關的概念和指令相對多,下面我們對 LVM 的相關名詞進行解釋以友善讀者更好了解。

實體卷 physical volumes(PV)

實體卷處于邏輯卷管理器中的底層,任何的邏輯卷和卷組都必需依靠實體卷來建立;實體卷可以是一個完整的硬碟,也可以是硬碟中的一個分區,并有一個名字 ( 如 hdisk0)。

邏輯卷 logical volumes (LV)

邏輯卷建立在卷組之上,卷組中的空間可以建立多個邏輯卷,并且邏輯卷可以随意在卷組的空閑空間中增減,邏輯卷可以屬于一個卷組,也可以屬于不同的多個卷組。LV 是位于 PV 上的資訊的組合,在 LV 上的資料可以連續或者不連續地出現在 PV。

卷組 logical volume group(VG)

卷組是建立在實體卷之上,一個卷組中可以包含一個實體卷組或者多個實體卷。所有的實體卷屬于一個稱作 rootvg 的卷組。

卷組描述區域 Volume Group Descriptor Area (VGDA)

用于描述實體卷、卷組、邏輯卷配置設定的所由資訊。和非 LVM 系統将包含分區資訊的中繼資料儲存在位于分區的起始位置的分區表中一樣,邏輯卷以及卷組相關的中繼資料也是儲存在位于實體卷起始處的 VGDA( 卷組描述符區域 ) 中。

回頁首

檔案系統災難一般可以分為兩類——人為災難和自然災難。人為災難主要是人為操作導緻的資料丢失,分區損壞,分區表損壞等等,自然災難主要是由于事故、意外事件或者自然損耗導緻的磁盤壞道,磁盤損壞,相關硬體損壞導緻的磁盤位置調整等等。

由于 LVM 和普通檔案系統的硬體環境并沒有什麼差別,是以他們所面對的自然災難類型也是一緻的。但是對于 LVM 而言,通過虛拟化存儲管理帶來分區容量動态調整便利的同時,也帶來了一些 LVM 特有的人為災難。如第一章所說,LVM 将所有磁盤建立為實體卷置于卷組中統一管理,然後建立邏輯卷供作業系統調用,這也就導緻可能出現卷組損壞,邏輯卷損壞,實體卷損壞等災難。

對于企業使用者而言,通常會制定嚴格的操作規章制度來和完備的備份政策來抵禦人為災難,還有完整的硬體備援方案來對抗自然災難;對于普通使用者而言,一般都不具備這種客觀條件來防範災難。一旦發生災難,我們所要做的是盡量減少災難的影響,盡可能恢複災難所造成的資料損失。

對于 LVM 的人為災難恢複而言,LVM 本身提供了資料備份和配置資訊備份的工具,可以充分利用這些工具進行備份,在發生人為災難導緻實體卷錯誤,邏輯卷錯誤和卷組錯誤的時候,利用備份進行恢複,盡可能恢複災難所導緻的資料損失。

由于 LVM 将所有磁盤進行統一管理,磁盤損壞會導緻整個檔案系統不可使用,因為自然恢複的主要目标是在災難發生後恢複 LVM 的可用性,恢複正常磁盤上的可用資料。LVM 本身提供了一套工具,使用者可以通過這套工具解決絕大多數由于硬體故障導緻的 LVM 不可用的問題,在自然災難發生後盡可能恢複 LVM 的可用性。在某些情況下,由于人為災難造成 LVM 發生卷組、實體卷或者邏輯卷不一緻的情況,進而導緻部分邏輯卷、甚至整個卷組無法通路的情況,修複此類問題也可以通過上述工具來進行。

本節将結合具體災難,示範如何進行 LVM 災難恢複。為了便于示範,我們假設試驗環境如下:基于 X86 架構的 PC,除硬碟外所有硬體均能正常穩定的工作,PC 上安裝了 2 塊磁盤 Disk-A 和 Disk-B。

硬碟的邏輯損壞的原因往往是多種多樣的,可能是誤操作,可能是不正常掉電,也可能是病毒甚至彙編語言的 diskkiller 直接造成。但這些損壞大都并非是不可逆的,下面我們就将在實驗用 PC 上模拟一些常見的錯誤并進行恢複操作。

先來看看目前的磁盤及檔案系統狀況:

接着我們将模拟一些錯誤情況:

情況 1:  檔案系統正常,硬碟無實體故障的狀況

在這之前我們先确認一些狀況,請确認你的 root 分區不在 lvm 的管理範圍内,否則一旦 lvm 系統出現故障,整個系統将無法啟動,雖然通過CD光牒 rescure 模式啟動可以進行一定的操作,但會造成很多不必要的麻煩。如果在平時的使用中你已經将 root 分區置于 lvm 管理之下,那麼請定期備份 /etc/lve/backup/ 下的檔案用以系統恢複,否則即使硬碟沒有實體損壞,而隻是 lvm 邏輯标簽對應錯誤,你的資料也很有可能救不回來了。當然,即使 root 分區不在 lvm 的管理範圍内,定期備份該目錄也是一個很好的習慣

可以看到 pvcreate 拒絕對那些上面有邏輯卷的 pv,如果要執行該操作的話需要把上面的邏輯卷删除,該指令後面将會用到。

現在我們用 dd 指令擦除 sdb 對應 lvm2 的标簽但保留分區表(操作有一定風險,請謹慎嘗試)

從上面的情況我們不難看出 sdb 已經變成了未知裝置,卷組的 metadata 變成隻讀的了,且是 partial 的狀态,但 lv 的情況還是基本正常的。

其實,在這種情況下,還是可以挂載、通路故障的檔案系統的,畢竟分區表本身并沒有損壞。于是我們首先要做的無疑是備份(最好以隻讀方式挂載)

(備份操作略)

下面我們來嘗試修複

到此處為止,你會發現,一切正常了,資料也沒有任何的損失,但為了保險起見還是應該嘗試進行一下檔案系統掃描以確定萬無一失。

回頭看我們前面提到的如果 root 分區在 lvm 管理下的情況,會出現系統無法啟動的情況,這時候怎麼辦呢?

其實也不是無法解決的,是用作業系統盤引導,進入 Rescure 模式,利用你之前備份的 /etc/lve/backup/ 下的檔案進行恢複即可,如果你需要先啟動起原本的系統以取出備份檔案,可以使用 vgreduce – removemissing system 指令去掉丢失标簽的實體磁盤再啟動,而後利用備份檔案執行恢複操作,但是每次正常的 lvm 啟動都會更改 /etc/lve/backup/ 下的内容,這也是為什麼我們需要對其内容進行備份的原因。如果很不幸的你沒有備份 /etc/lve/backup/ 下的内容,且 root 分區在 lvm 管理下的情況,那麼很遺憾,即使你的硬碟沒有實體損毀,你的資料也很難救回了,針對這種情況向系統的恢複方法,請參照 3.4 磁盤損壞 部分進行操作。

情況 2:PV 的損壞與替換

先看一下系統的情況

我們在 lv0 下存儲了一個檔案

備份一下 /etc/lvm/backup 的檔案

我們用 dd 指令把 /dev/sdc 的前 400 個扇區都清零(包括 LVM2 label、meta data、分區表等)

這種情況下想要完全恢複可能比較困難了,如果無意找回還可能存在的資料,請參照 3.4 磁盤損壞 部分進行操作。如想盡可能多的找回資料,請先嘗試 mount,

檔案系統已經損壞 .

這裡我們嘗試進行替換,以 sdd 替換 sdc

我們可以看到 sdd 已經替換了 sdc

不過這時候 /etc/lvm/backup 下的檔案并不會更新,同時會看到如下的情況

已不存在該問題,這時候 /etc/lvm/backup 也已經更新了。

之後嘗試 mount

我們開始嘗試修複檔案系統

經過

指令之後(實際需要執行的情況依據硬碟受損情況可能有所不同)

很幸運,我們的檔案還在。

硬碟長時間的使用,非正常操作或電源管理失誤都可能造成磁盤壞道的産生。最典型的症狀就是一旦對硬碟的某一部分進行操作,就會出現整個硬碟停止工作,如果作業系統也在該硬碟上,那麼系統立即崩潰也就成為了必然。這還不是最可怕的,因為壞道一旦産生就有擴散的可能,每次觸及,導緻的 crash 都比一次系統非正常掉電造成的傷害更為嚴重,除了壞道的擴散外還很有可能破壞整塊硬碟的動平衡,進而導緻整個硬碟不可恢複的實體性損壞。可見,及時發現硬碟壞道,并盡早處理是十分必要的。

LVM 自己本身其實有一套對壞道的處理機制:

硬碟内部的資料重定位:最底層的重定位,發生在磁盤内部,出現的時候不會通知使用者。

由 LVM 産生的硬體重定位:更高層次的重定位,LVM 将有問題的實體位址 A 上的資料拷貝到實體位址 B,LVM 會繼續讀位址 A 上的資料,但是硬碟已經将真實的 IO 轉向實體位址 B。

軟體重定位:最高層次的重定位,也由 LVM 裝置産生。LVM 生成一個壞道表,當讀實體位址 A 上的資料時,先檢查壞道表,如果 A 在壞道表中,就轉向實體位址 B。

但以上這些,其實對使用者都是透明的,使用者可以在建立 lv 時通過 lvcreate – r n 參數關閉這樣,系統将不建立壞塊重定位區域(BBRA),引導、根和主交換邏輯卷必須使用此參數。當使用者覺得 LVM 有問題的時候,首先要做的事情就是備份,盡可能地儲存卷組中的資料。卷組發生問題後進行的備份需要和發生問題前進行的備份進行對比。針對存在壞道的情況,fsck 一定要慎用,尤其對于重定位已經無法處理的應盡快将硬碟導出(操作見 3.3 磁盤位置更改部分)LVM 以防壞道擴散,如在導出過程中出現問題,請比照 3.4 磁盤損壞處理。

主機闆端口損壞、更歡 PC 主機闆、添加新的裝置都可能導緻磁盤位置更改的發生。由于 Linux 的主引導記錄(MBR)一般記錄在第一塊磁盤的第一個扇區上,如果第一塊磁盤的順序發生改變,會導緻系統無法啟動。對于這種情況,隻需要調整磁盤順序就可以解決(隻需要保證有 MBR 的磁盤排在第一順位就可以,不一定是總線的第一個端口)。這裡讨論兩種比較常見的情況,磁盤在系統内位置更改和磁盤在系統間移動。

磁盤在系統内移動

對于單一卷組的 LVM 檔案系統而言,LVM 能夠自動識别出磁盤位置的更改。磁盤位置更改後,正常啟動系統就可以正常通路了。當系統中存在單獨的卷組,或者系統中存在多個卷組是,更改磁盤位置前需要停用卷組,在完成磁盤移動後需要重新激活卷組,執行操作如下:

磁盤在系統間移動

當磁盤在系統間移動的時候,除了需要停用激活卷組外,還需要執行卷組導出 / 倒入的操作。

此時就可以将磁盤移動到其他系統。

到此,卷組就可以恢複正常了。某些卷組可能是跨多塊磁盤建立的,而磁盤移動可能隻是針對其中的某些磁盤。在這種情況下,可以執行 pvmove 指令,把資料移動到指定磁盤上,然後針對

指定磁盤執行移動操作。

對于普通 PC 而言,多塊磁盤的主要目的是擴充存儲容量,一般不會采用 RAID 方案來應對磁盤損壞。一旦發生磁盤損壞的情況,使用者在承受損壞硬碟上面的所有資料丢失之痛的時候,最不願看到的就是剩下的磁盤也沒法通路的情況。好在 LVM 的開發者充分考慮了這一點,為 LVM 提供了恢複機制。

當 root 分區不是建立在 LVM 上時,情況就如同普通的磁盤損壞一樣,隻需要更換磁盤,重裝系統,然後将原來的 LVM 分區重新挂載就可以,和挂載其它類型的檔案系統并沒有什麼差別,在此不作贅述。當 root 分區建立在 LVM 上時,我們還需要分兩種情況來處理—— root 分區所在的磁盤損壞和非 root 分區所在的磁盤損壞。

非 root 分區磁盤損壞

用 Disk-A 和 Disk-B 建立 System VG,root 分區和交換分區存在于 Disk-A 上,Disk-A 和 Disk-B 上建立了多個 LV 用于存放使用者資料。當使用者在某次重起後,發現系統無法起動,經檢查發現 Disk-B 損壞,使用者希望能夠啟動系統,恢複 Disk-A 上的資料。

移除損壞磁盤 Disk-B 後,系統無法啟動,系統輸出如下:

分析輸出可知,該問題是磁盤 Disk-B 損壞導緻的。究其原因,是 root 分區建立于 LVM 上,當硬碟丢失時,導緻 LVM 的發生不一緻,導緻 root 分區無法被正常讀取,進而系統無法正常啟動。如果能夠恢複 LVM 的一緻性,恢複 root 分區的正常讀取,就可以恢複 Disk-A 上的資料。

由于此時系統已經不能正常啟動,需要用CD光牒啟動進入到緊急恢複模式,用 root 使用者登入:

執行如下指令檢查目前狀态:

由上面輸出可以知道,由于磁盤缺失,系統無法正确識别 system 卷組,但是系統可以正确識别出硬碟,也可以檢測到硬碟的缺失。當系統挂載的是普通檔案系統的時候,我們可以通過緊急恢複模式下直接挂載檔案系統的方法來進行資料恢複,然而這種方法在 LVM 下行不通,因為所有的邏輯卷都是 LVM 管理的,當卷組不能被正确識别的時候,所有的 LV 也不能被處理。是以我們要做的就是删除卷組中的缺失實體盤,恢複卷組的一緻性。

LVM 提供 vgreduce 來執行從卷組中删除實體卷的操作,并且提供”— removemissing”來删除卷組中所有缺失的實體卷。

通過删除缺失的硬碟,此時系統已經可以正确識别卷組。但是經曆過如此劫難,LV 還需要額外的步驟才能正常工作。執行 lvscan,我們可以發現 root 和 swap 兩個邏輯卷都處于 inactive 狀态,需要手動執行 lvchange 指令激活,才能使它正常工作。

到此,大功告成,重起,系統啟動,除了損壞的磁盤已經一去不複返以外,系統又恢複正常了。

root 分區磁盤損壞

當 root 分區磁盤發生損壞的時候,唯一的選擇隻能是另外找一台機器,把沒有損壞的磁盤裝上去。開機後執行 `fdisk – l`,輸出顯示硬碟不包含有效分區表,不能夠正确讀取。執行 LVM 的相關檢查,可以注意到錯誤資訊與非 root 分區輸出的一緻。執行非 root 分區磁盤損壞的操作步驟,就可以讓卷組恢複正常。将恢複後的卷組挂載後,就可以執行正常讀寫了。

對于運作在普通 PC 上的 LVM,通常缺少有計劃的備份和硬體備援來應對災難,因而在災難發生時,往往需要承受嚴重的資料損失。本文介紹了 LVM 上可能發生的災難,結合執行個體示範了如何進行災難恢複,在 LVM 遇到災難時,可以盡可能恢複資料,減少損失。

參考 Wikipedia 網頁  Logical Volume Manager(Linux),了解 LVM 基本資訊。

參考 developerworks 文章  通用線程:學習 Linux LVM,了解 LVM 基本操作。

參考 LVM 手冊 LVM HOWTO,查詢 LVM 詳細指令,了解 LVM 進階操作。

在 developerWorks Linux 專區尋找為 Linux 開發人員(包括 Linux 新手入門)準備的更多參考資料,查閱我們 最受歡迎的文章和教程。

在 developerWorks 上查閱所有 Linux 技巧和 Linux 教程。

随時關注 developerWorks 技術活動和 網絡廣播。

歡迎加入 My developerWorks 中文社群。

請 登入 或 注冊  後發表評論。

添加評論:

注意:評論中不支援 HTML 文法

有新評論時提醒我

剩餘 1000 字元

繼續閱讀