FreeBSD 的 Disklabel 救援及回復

(This article is for Taiwanese/Chinese reader,for English version, see here)

前篇,kmd.twbbs.org 這台主機的系統碟
由於很詭異的原因整個 MBR 都丟掉了
於是我試著尋找 FreeBSD 底下自動分析 disklabel 資訊的工具
希望能盡人士聽天命

scan_ffs (8) 就是最終的選擇

scan_ffs (8) 的用法

scan_ffs [-lsv] [-b begin] [-e end] device

-l 表示輸出 bsdlabel/disklabel 樣式,以利後續處理及回復
-s 表示 smart/skip,僅適用於 layout 簡單的磁碟空間
(若磁碟同時存在 UFS 及其他格式,則不建議使用)
-v 表示列出詳細訊息
-b-e 分別為搜尋範圍的起點與終點
device 則是想要分析的儲存裝置

完整的救援流程
(注意,所有動作皆在光碟開機的救援模式中進行,
部分資料記載於 ramdisk 的臨時檔案系統裡
重新開機將造成整個流程的中斷與失敗)
0. 先用 FreeBSD livefs 開機,並進入 Fixit 模式
以套件方式取得 scan_ffs,加入編譯好的 binary

pkg_add -r scan_ffs

1. 接著在救援模式的 shell 執行以下指令

scan_ffs -l > /tmp/disklabel

找到的磁碟 layout 如下:

X: 20971520 4194367 4.2BSD 2048 16384 0
X: 287410816 25165887 4.2BSD 2048 16384 0

2. 然後編輯它,確保它找到的磁碟佈局是正確的 (程式判別結果可能有誤)
換算的結果,得到兩個分割分別為 20 G 及 13x G
印象中當初分割時,先指定 swap,然後是 “/” 與 “/home”
故這樣的佈局明顯有問題,少了 swap
於是自行新增 sector 0 到 sector 4194367 這一段敘述
修改後的結果如下,”#” 之後為註解:

b: 4194367 0 swap
a: 20971520 4194367 4.2BSD 2048 16384 0 # /
d: 287410816 25165887 4.2BSD 2048 16384 0 # /home

(磁碟編號 c: 由 FreeBSD 內定保留,故跳過)

3. 接著先”假”執行 bsdlabel,而不將結果真正寫入硬碟:

bsdlabel -R -n -m i386 ad0 /tmp/disklabel

4. 確認無誤後,才將 disklabel 正式寫入硬碟:

bsdlabel -R -m i386 ad0 /tmp/disklabel

5. 若執行成功,此刻已可以根據 /dev 底下的 node device 將檔案系統 mount 起來:

mkdir /mnt/slash
mount /dev/ad0a /mnt/slash

6. 然後將原本的 boot strap 裝回來,大功告成:

bsdlabel -B -b /mnt/slash/boot/boot -m i386 ad0a

如此即可在遺失磁碟容量分佈的情境下,完成 FreeBSD 的救援及回復

在〈FreeBSD 的 Disklabel 救援及回復〉中有 1 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *