隨身碟資料救援小記

按理講 USB 隨身碟應該被視為是一種消耗品,是僅供臨時性的資料移動,而非講究保障的資料儲存方案。但……如果裡頭真的有資料想要救援呢?話說前陣子 DR 拿到一顆 128GB 的隨身碟,是處於無法開啟的狀態。雖然裝置本身偵測得到,但在 Windows 或 Linux 系統上,分割區實際上都無法順利掛載。其中以 Linux 來說,就是即便手動做 mount 也會直接卡住不動,也就無法讀取裡頭的檔案。

 

嘗試使用 ddrescue 做區塊複製,例如以下指令是將 /dev/sdb 複製到名為 rescued.img 的映像檔:

  • ddrescue -f -r 1 -n -v -d -b 512 /dev/sdb rescued.img recovery.log

 

雖然異常緩慢,可見隨身碟確實是有故障情形,但至少此舉是可以成功讀取的。倘若接著用 PhotoRec 簡短地測試一下輸出的映像檔,發現是可以辨識出分割區並進行檔案救援的。於是便將隨身碟插在某部伺服器主機上,繼續用 ddrescue 跑了一個多月。直到後來完全無法讀取、零進展才罷手,最終成功讀取到的區塊大約有 60% 左右。

 

這顆隨身碟所使用的檔案系統即是常見的 FAT32,以 Windows 系統來說,可以使用 ImDisk 工具,將映像檔中的分割區掛載成磁碟區,如此一來就能夠使用檔案總管開啟。至於在 Linux 上則也有多種掛載映像檔分割區的途徑,其中一種方式是使用 qemu-nbd。舉例來說,以下指令能夠將 rescued.img 中的 FAT32 分割區以唯讀方式掛載至 /mnt 目錄:

  • modprobe nbd
  • qemu-nbd -r -c /dev/nbd1 rescued.img
  • mount -o ro,iocharset=utf8 /dev/nbd1p1 /mnt

 

至於卸載方式則如下所示:

  • umount /mnt
  • qemu-nbd -d /dev/nbd1
  • rmmod nbd

 

然而由於最終救援出來的區塊並不完整,所以一定還是會有許多檔案實際上是無法讀取的。對此情形,以 Linux 來說,DR 會直接用 rsync 對掛載目錄複製一份複本。凡是無法讀取的就會自動被跳過,藉此過濾出可正常讀取的檔案,例如複製到使用者家目錄的 rescued 目錄下:

  • rsync -a /mnt/ ~/rescued/

 

或者,執行檔案系統檢查,也是能夠剔除掉有問題的檔案。倘若是在 Windows 上,就是掛載後對其執行 chkdsk。不過若是在 Linux 上就稍微麻煩了一點,因為 fsck 若偵測到實際的映像檔比分割區還要小,是無法執行的。所以在使用 qemu-nbd 之前,得先把 rescued.img 調大。這有不只一種作法,而其中最快速的手法可能是使用 truncate:

  • truncate -c -s 128G rescued.img

 

完成調整後,qemu-nbd 改用可寫入的模式來連接 rescued.img:

  • qemu-nbd -f raw -c /dev/nbd1 rescued.img

 

然後再執行 fsck.vfat:

  • fsck.vfat -av /dev/nbd1p1

 

最後在完成檢查後,便同樣能夠將 /dev/nbd1p1 掛載起來,並讀取其中的檔案。

 

分類: