為什麼 dosfsck 會截斷文件?

為什麼 dosfsck 會截斷文件?

我遇到了一個眾所周知的問題,但不幸的是我在這裡缺乏知識,希望在這裡找到更好的見解。

因此,我有一個帶有 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.

這會導致文件被截斷;這顯然不是我想要的...

所以這讓我產生了一些問題:

  1. 這裡會發生什麼事?似乎可以正確檢測文件大小,但是完全錯誤,嗯,嗯,什麼?也許分區表?為什麼dosfsck可以正確偵測到檔案名稱和檔案大小卻無法修復此問題?

  2. 當然更重要的是:有什麼方法可以恢復這些文件嗎?

如果您需要更多信息,請向他們詢問!

多謝!

答案1

對 FAT 檔案系統碎片有很好的解釋:Quora:作業系統如何處理FAT32格式的碎片磁區以恢復完整的資料?作者:伊內‧巴納德。

每個扇區的後面都有一個部分(或前面,無論詳細設計是什麼 - 但在該扇區內部的某個地方)…有些內容說明「位置 X 的下一個扇區」。所有基於 FAT 的檔案系統(包括 FAT32)的設計都是如此。這也是碎片導致 FAT 上檔案存取速度變慢的原因。

它的工作原理如下:

  1. 您(或您正在執行的某些程式)向作業系統發送開啟檔案的請求。
  2. 作業系統將請求傳遞到檔案系統。
  3. FS (FAT) 檢查路徑+檔名,找到給定路徑中的第一個資料夾。
  4. 然後它讀取它的根資料夾表(即驅動器資料夾層次結構的開始)。這給出了路徑中第一個資料夾的磁區號。
  5. 然後,它繼續讀取該資料夾的表,將其與給定路徑中的下一個資料夾進行匹配。重複直到找到路徑中的最後一個檔案名稱/資料夾名。
  6. 這為它提供了文件開始的扇區以及文件的大小 - 因此它知道何時找到其所有扇區(扇區大小的簡單相加)。
  7. 它讀取第一個磁區,檢查其元資料(即指向下一個磁區的指標)。
  8. 也讀取該磁區,將磁區的資料大小加入已讀取的計數中。如果仍然小於檔案大小,則繼續到元資料中的下一個磁區並重複。

關鍵在於被截斷的檔案可能是碎片化的。當恢復程序遍歷這些區塊並嘗試找到下一個片段時,它決定不信任它認為下一個區塊所在的位置。

用於比較和決定何時截斷的規則和問題dosfsck位於https://linux.die.net/man/8/dosfsck如果不知道磁碟最初遭受了什麼損壞,就很難知道為什麼會被截斷。如果 FAT 被擦除,則可能是因為它不相信簇鏈中列出的任何簇正在使用,並且您符合規則File contains bad or free clusters. The file is truncated.

dosfsck不是恢復工具。它是一個修復工具,假設磁碟基本上「沒問題」。

您可能需要考慮運行適當的恢復工具,例如photorec 它可以恢復的不僅僅是照片或者testdisk哪個可以做不僅僅是複製分區

相關內容