1. 程式人生 > >記一次有驚無險的Linux資料恢復過程

記一次有驚無險的Linux資料恢復過程

問題階段

起因:
昨天晚上思路不是很清晰(上了一天班回來有點蒙),還是強忍著疲憊想搞事情,結果悲劇了… …
本來想拿SD卡做一張linux燒錄卡,燒錄指令碼是很久以前寫的,有git記錄,一直不成功,就回退了幾次提交,然後執行的時候沒有給指令碼傳參(/dev/sd**),結果指令碼中預設磁碟裝置為/dev/sdb ,在現在電腦上是一塊資料磁碟,執行到一半的時候由於某些原因意外退出,但還是有一些命令執行,比如最致命的一條:
dd if=/dev/zero of=${node} bs=1024 count=1 conv=fsync conv=notrunc
node指向的就是/dev/sdb
然後把LVM2 label、meta data、分割槽表都給刪除了,由於此硬碟在/etc/fstab中有記錄,所以今天開機有卡主了,開始以為磁碟接觸不良,進入linux recovery模式遮蔽掉fstab中相關選項後進入系統. ls -l /dev/sd* 發現只有/dev/sdb 沒有分割槽資訊,接著執行fdisk /dev/sdb, p列印資訊
Command (m for help): p
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x*********


同樣沒有分割槽資訊,回想昨晚的操作,終於……(一身冷汗)

處理過程

冷汗過後就需要冷靜的思考,既然只是刪除了磁碟的頭資訊,那麼分割槽實際上還是存在的,而且資料也應該完好的存在.

嘗試一:

首先找到一篇lvm資料恢復的文章,PC 上的 LVM 災難修復,雖然文章中類似情景,但是恢復的時候需要/etc/lvm/backup/ 中有對應的lvm備份資訊,而我的磁碟但是不是在現在的機器分的所以沒有相應資訊. 文章至少透露出一個重要資訊,可以恢復,應該直接恢復出分割槽表即可.
還有一篇文章跟上面一篇很像:一次Linux LVM VG丟失完整找回過程記錄

嘗試二:

掛載到windwos上用diskgenius掃描分割槽表,能夠看到一些零星的資料,但都是亂碼.當時心又亮了一截, 此路不通.

嘗試三:

直接查詢linux的資料恢復軟體,最終找到一款靠譜的:testdisk 官方文件
簡單介紹:
它不能從故障的儲存裝置上拷貝資料,相反,它可以解決一些因為分割槽的原因而 造成資料無法訪問的問題。該工具可以幫助你恢復丟失的分割槽,讓磁碟重新變得可以啟動,整理分割槽表,恢復主引導記錄,恢復引導扇區以及檔案系統表,可以從 NTFS、FAT、exFAT和ext2型別的檔案系統中恢復被刪除的檔案,還能從已經刪除了的NTFS、FAT、exFAT和ext2/3/4檔案系統 中拷貝檔案。
嘗試:
testdisk /dev/sdb
選擇硬碟後回車:
Select a media (use Arrow keys, then press Enter):
Disk /dev/sdb - 500 GB / 465 GiB - *******************


選擇分割槽:
Please select the partition table type, press Enter when done.
[Intel ] Intel/PC partition
[EFI GPT] EFI GPT partition map (Mac i386, some x86_64...)
[Humax ] Humax partition table
[Mac ] Apple partition map
[None ] Non partitioned media
[Sun ] Sun Solaris partition
[XBox ] XBox partition
[Return ] Return to disk selection

選擇[Intel ] Intel/PC partition

選擇動作:
[ Analyse ] Analyse current partition structure and search for lost partitions
[ Advanced ] Filesystem Utils
[ Geometry ] Change disk geometry
[ Options ] Modify options
[ MBR Code ] Write TestDisk MBR code to first sector
[ Delete ] Delete all data in the partition table
[ Quit ] Return to disk selection

這裡選擇[ Analyse ] Analyse current partition structure and search for lost partitions
過一會會顯示掃描到分割槽表資訊,選擇寫入到磁碟,然後提示重啟電腦(其實就是重新載入硬碟).
懷著一顆忐忑的新重啟後驚喜的發現,分割槽已經恢復,檢查資料一切正常:
`Command (m for help): p
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x*********

Device Boot Start End Sectors Size Id Type
/dev/sdb1 * ####### ####### ####### xxG 83 Linux
/dev/sdb2 ####### ####### ####### xxG 83 Linux
/dev/sdb3 ####### ####### ####### xxG 7 exFAT
`

遇事冷靜思考,尋找最優解決方案.