修復被破壞了的linux檔案系統分割槽表
阿新 • • 發佈:2018-12-20
昨天晚上在資訊港的機房裡鼓搗到凌晨4點多,幫助朋友修復損壞的硬碟資料。由於當時沒有詳細的記錄,憑回憶先記錄下整個過程,也許有錯誤的地方,請不吝指正!現象和環境:REDHAT FC4,一塊36G的SCSI硬碟(/dev/sdc)無法mount,fdisk也看不到分割槽資訊。另外一塊該盤重要資料的備份盤(9G SCSI硬碟,/dev/sdb)也是同樣的現象。均為獨立磁碟,沒有RAID設定。(怎麼這麼巧?資料盤和備份盤同時壞掉了)整個嘗試修復的過程大致如下: 上面是parted嘗試根據給出起始尺寸和結束尺寸,在這個範圍內尋找分割槽標誌符,以決定是否重新寫入分割槽表。可是奇怪的是,總共6個分割槽,parted只能按照這個辦法找回一個分割槽,其他的都宣告一個提示,大致的意思是“分割槽結束符位於開始符之前”。也嘗試使用parted的mkpart重新建立分割槽表,但是失敗,提示不能建立更多的主分割槽(難道分割槽資訊沒有丟失嗎?為什麼不允許建立分割槽資訊呢?) 將分割槽資訊重新寫入到損壞盤中。雖然fdisk, parted可以列出分割槽資訊,但是還是無法mount。於是懷疑檔案系統也遭到了損壞。 告知找不到superblock,於是:
嘗試檢視分割槽資訊
儘管事先被告知fdisk看不到分割槽資訊,還是固執的嘗試了一下:-)fdiks -l /dev/sdc果然什麼樣都看不到。但是,系統啟動的時候正確的列出了磁碟的相關資訊(大小等),而且fdisk也能夠列出磁碟大小等相關物理資訊,只是沒有分割槽資訊。因此初步判斷,是磁碟的分割槽表丟失,不一定是磁碟物理損壞。
嘗試使用parted檢視和恢復分割槽資訊
parted /dev/sdcprint自然也列不出分割槽資訊,好在管理員還有一塊分割槽完全一致的硬碟(是早先通過dd完全複製的),於是掛上這塊clone盤,獲得了sdc的分割槽資訊,記錄下來(注:這裡可以有更好的處理方法,見下面的gpart部分),嘗試使用parted恢復分割槽資訊:rescuestart? 0end ? 4G
使用gpart嘗試找回分割槽資訊
parted沒有成功的找回分割槽資訊,於是轉而嘗試gpart:gpart /dev/sdc可喜的是,gpart經過一段時間的搜尋,列出了看起來有道理的分割槽資訊!但是,按照管理員提供的clone盤,應該是找到6個分割槽(包括swap)才對,但是gpart只找到了4個。經過分析發現, gpart原來只是找到了主分割槽分析,擴充套件分割槽和邏輯分割槽沒有找到。嘗試通過
gpart -W /dev/sdc /dev/sdc
使用reiserfsck/e2fsck修復檔案系統
管理員告知,/dev/sdc的檔案系統應該是reiserfs,於是嘗試使用reiserfsck檢查和修復檔案系統(事後證明,這是一個嚴重的錯誤!)reiserfsck --check /dev/sdc1reiserfsck --fix-fixable /dev/sdc1reiserfsck --rebuild-sb /dev/sdc1reiserfsck --rebuild-tree /dev/sdc1但是,一番修復之後,發現仍然無法mount!對比clone盤(早就應該比對了,失策!),才發現原來檔案系統是ext3!這一番使用reiserfsck的折騰,估計/dev/sdc1是徹底完蛋了。好在知道/dev/sdc1是一個沒有重要資料的分割槽,可以把用來試驗。於是,又使用e2fsck(fsck.ext3)嘗試修復資料:
fsck.ext3 /dev/sdc1
fsck.ext3 -b 8193 /dev/sdc1嘗試找回superblock,但是失敗!於是在另外幾個儲存superblock的地方繼續嘗試:
fsck.ext3 -b 24577 /dev/sdc1 fsck.ext3 -b 40961 /dev/sdc1 fsck.ext3 -b 57345 /dev/sdc1 fsck.ext3 -b 73729 /dev/sdc1但是,均告失敗!沒有找回superblock,極度失望!
小技巧:如何知道superblock儲存的位置?
dd if=/dev/zero of=/tmp/test bs=1024 count=160000160000+0 records in160000+0 records out163840000 bytes (164 MB) copied, 4.35857 seconds, 37.6 MB/smke2fs /tmp/test /tmp/test is not a block special device.Proceed anyway? (y,n) yFilesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)40000 inodes, 160000 blocks8000 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=6737100820 block groups8192 blocks per group, 8192 fragments per group2000 inodes per groupSuperblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729Writing inode tables: doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 35 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.
嘗試live cd
萬般無奈,下載knoppix live cd,啟動起來,居然認出併成功載入了/dev/sdb (備份盤)!於是把備份資料先弄下來再說。但是,knoppix沒有認出/dev/sdc,時間已經臨近凌晨4點,這個盤暫時被宣佈死緩。經驗教訓
- 系統安裝時,一定要記錄磁碟分割槽的相關資訊,包括分割槽情況,所使用的引數(比如塊大小)
- 常規備份是萬萬不能缺少的。對於系統管理員而言,系統崩潰是遲早要面臨的事情,沒有僥倖可言。