
我遇到了一個眾所周知的問題,但不幸的是我在這裡缺乏知識,希望在這裡找到更好的見解。
因此,我有一個帶有 FAT32 檔案系統的損壞的 USB 記憶棒。我用 克隆ddrescue
並運行testdisk
。找到了一個分割區(唷!),所以我創建了一個循環設備並losetup -f -P USB_clone.img
安裝了它。到目前為止一切順利,現在問題開始了:所有文件都被發現具有正確的大小(ls -al
),但是當我嘗試複製文件時出現 I/O 錯誤。所以我再次卸載分區並運行dosfsck -l -r -v /dev/loop1p1
。有些文件可以恢復,但大多數文件都以非常有趣的方式修復:
File size is 27589006 bytes, cluster chain length is 32768 bytes.
Truncating file to 32768 bytes.
這會導致文件被截斷;這顯然不是我想要的...
所以這讓我產生了一些問題:
這裡會發生什麼事?似乎可以正確檢測文件大小,但是完全錯誤,嗯,嗯,什麼?也許分區表?為什麼
dosfsck
可以正確偵測到檔案名稱和檔案大小卻無法修復此問題?當然更重要的是:有什麼方法可以恢復這些文件嗎?
如果您需要更多信息,請向他們詢問!
多謝!
答案1
對 FAT 檔案系統碎片有很好的解釋:Quora:作業系統如何處理FAT32格式的碎片磁區以恢復完整的資料?作者:伊內‧巴納德。
每個扇區的後面都有一個部分(或前面,無論詳細設計是什麼 - 但在該扇區內部的某個地方)…有些內容說明「位置 X 的下一個扇區」。所有基於 FAT 的檔案系統(包括 FAT32)的設計都是如此。這也是碎片導致 FAT 上檔案存取速度變慢的原因。
它的工作原理如下:
- 您(或您正在執行的某些程式)向作業系統發送開啟檔案的請求。
- 作業系統將請求傳遞到檔案系統。
- FS (FAT) 檢查路徑+檔名,找到給定路徑中的第一個資料夾。
- 然後它讀取它的根資料夾表(即驅動器資料夾層次結構的開始)。這給出了路徑中第一個資料夾的磁區號。
- 然後,它繼續讀取該資料夾的表,將其與給定路徑中的下一個資料夾進行匹配。重複直到找到路徑中的最後一個檔案名稱/資料夾名。
- 這為它提供了文件開始的扇區以及文件的大小 - 因此它知道何時找到其所有扇區(扇區大小的簡單相加)。
- 它讀取第一個磁區,檢查其元資料(即指向下一個磁區的指標)。
- 也讀取該磁區,將磁區的資料大小加入已讀取的計數中。如果仍然小於檔案大小,則繼續到元資料中的下一個磁區並重複。
關鍵在於被截斷的檔案可能是碎片化的。當恢復程序遍歷這些區塊並嘗試找到下一個片段時,它決定不信任它認為下一個區塊所在的位置。
用於比較和決定何時截斷的規則和問題dosfsck
位於https://linux.die.net/man/8/dosfsck如果不知道磁碟最初遭受了什麼損壞,就很難知道為什麼會被截斷。如果 FAT 被擦除,則可能是因為它不相信簇鏈中列出的任何簇正在使用,並且您符合規則File contains bad or free clusters. The file is truncated.
dosfsck
不是恢復工具。它是一個修復工具,假設磁碟基本上「沒問題」。
您可能需要考慮運行適當的恢復工具,例如photorec
它可以恢復的不僅僅是照片或者testdisk
哪個可以做不僅僅是複製分區。