簡體   English   中英

使用 dd 在 XFS 文件系統中截斷的文件 - 如何恢復

[英]Truncated file in XFS filesystem using dd - how to recover

磁盤布局我的 HDD RAID 陣列即將報廢,我為它購買了一些新磁盤。 舊硬盤我已用作 kvm/qemu 虛擬機的原始磁盤映像的存儲。 RAID 陣列是使用 mdadm 構建的。 在 md 設備上,我有 LVM 的物理卷。 在物理卷上,我有存儲原始磁盤映像的 XFS 文件系統。 每個原始磁盤映像都是由 qemu-img 制作的,並包含 LVM 的物理卷。 一個 PV = 一個 LV = 一個原始磁盤映像內的 VG。

操作當我嘗試使用 cp 進行數據移動時,我在我的 raid 陣列中遇到了壞塊和 i/o 問題,所以我從 cp 切換到 dd,沒有錯誤,同步標志我寫了dd if=/mnt/old/file.img of=/mnt/**old**/file.img bs=4k conv=noerror,sync

問題現在文件 /mnt/old/file.img 在 XFS 文件系統中的大小為零。 有沒有簡單的解決方案來恢復它?

我的感覺是您的 RAID 陣列出現故障。 您可以看到 RAID state 與...

 cat /proc/mdstat

由於您看到可能是問題根源的 i/o 錯誤。 最好的前進路徑是為每個 RAID 成員(或至少拋出 i/o 錯誤的成員)制作扇區級副本。 請參閱 Linux ddrescue。 它旨在復制失敗的硬盤驅動器。 然后從副本執行恢復工作。

最后我找到了解決方案,但這並不是很簡單。

Xfs_undelete 沒有匹配我的問題,因為它不支持非常大的文件的 B+Tree 范圍存儲格式 (V3)。

成功解決我的問題的成功半手動程序由以下主要步驟組成:

  1. 立即卸載文件系統並使用 dd 對文件進行完整分區備份
  2. 調查有關截斷文件的 XFS 日志條目
  3. 在專家模式 MB 中使用 xfs_db 手動恢復 inode 核心 header。 恢復 inode 核心不會取消將擴展區標記為非空閑,並且當您嘗試以通常的方式從具有恢復的 inode header 的文件中復制一些數據時,您將收到 i/o 錯誤。 這是開發 python 腳本的原因。
  4. 使用從 B+Tree 樹中為 inode 提取擴展數據並將它們寫入磁盤的腳本

我已經在GitHub的 LGPL 許可下發布了恢復腳本

PS 由於 inode b+tree extent 記錄損壞,一些數據丟失了,但它們對我來說沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM