文件恢复
本文档列出了 Linux 系统中的数据恢复和文件删除恢复选项。
特别说明
开始之前
此页面主要用于教育目的。如果您意外删除了或以其他方式损坏了您宝贵且不可替代的数据,并且没有数据恢复经验,请立即关闭计算机(只需按住电源按钮或拔掉电源插头;请勿使用系统关机功能),并寻求专业帮助。
故障硬盘
在数据恢复领域,最好是处理磁盘映像而不是物理磁盘本身。通常,故障硬盘的状况会随着时间推移而恶化。目标应该是首先尽快从磁盘故障中尽可能多地挽救数据,然后放弃该磁盘。与 dd 不同,ddrescue 和 dd_rescue 工具会反复尝试从错误中恢复,并会从驱动器的前到后,再从后到前读取,试图挽救数据。它们会维护日志文件,以便恢复可以暂停和恢复,而不会丢失进度。
请参阅 Disk cloning。
使用 ddrescue 等工具创建的映像文件可以像物理设备一样挂载,并可以安全地进行处理。始终制作原始映像的副本,这样如果出现问题,您就可以恢复!
提高故障硬盘读取性能的一个久经考验的方法是保持硬盘低温。在冰箱里放一段时间是合适的,但要小心避免硬盘从冷到热过快,因为会产生冷凝水。将硬盘放在冰箱里,并连接到恢复 PC 的电缆,效果很好。
请勿尝试对故障硬盘进行文件系统检查,这很可能会使问题恶化。将其挂载为只读。
备份闪存介质/小型分区
作为处理“实时”分区(无论是否挂载)的替代方法,使用映像通常是首选,前提是目标文件系统不是太大,并且您有足够的可用硬盘空间来容纳映像文件。例如,闪存设备如 U 盘、数码相机、便携式音乐播放器、手机等,在很多情况下都足够小,可以制作映像。
请务必阅读以下工具的手册页,以验证它们是否能够处理映像文件。
要创建映像,可以使用 dd,如下所示
# dd if=/dev/target_partition of=/home/user/partition.image
使用数码相机
为了让下一节中列出的一些工具能够处理闪存介质,需要将目标设备挂载为块设备(即,显示在 /dev 下)。以 PTP(Picture Transfer Protocol)模式运行的数码相机无法在此方面正常工作。PTP 相机会被 libgphoto 和/或 libptp 透明处理。在这种情况下,“透明处理”意味着 PTP 设备不会获得块设备。PTP 模式的替代方案是 USB 大容量存储(UMS)模式,并非所有相机都支持。有些相机有一个菜单项允许在两种模式之间切换;请参阅您的相机用户手册。如果您的相机不支持 UMS 模式,因此无法作为块设备访问,您的唯一选择是使用闪存读卡器,并从相机中物理取出存储介质。
实用工具列表
另请参阅 Wikipedia:List of data recovery software#File Recovery
- ddrutility — GNU ddrescue 的补充。查找与坏扇区相关的文件,并提供一些 NTFS 的特殊工具。已不再积极支持。
- dvdisaster — 为 CD/DVD 介质提供额外的错误保护。
- Foremost — 一款基于文件头、文件尾和内部数据结构恢复文件的命令行程序。这个过程通常被称为数据分块(data carving)。文件头和文件尾可以通过配置文件指定,或者使用命令行开关来指定内置的文件类型。
- PhotoRec — 文件数据恢复软件,旨在恢复包括照片(提示:PhotographRecovery)、视频、文档、存档等文件,从硬盘、CD-ROM,以及从数码相机内存中恢复丢失的照片。
- R-Linux — 一款适用于 Ext2/Ext3/Ext4 文件系统的免费文件恢复实用工具。
- Scalpel — 文件分块和索引应用程序,最初基于 Foremost,但效率显著提高。它允许检查员指定一组文件头和文件尾来从介质中恢复文件类型。
- TestDisk — 数据恢复软件,主要用于帮助恢复丢失的分区和/或修复无法启动的磁盘,当这些症状是由软件故障、某些类型的病毒或人为错误(例如意外删除分区表)引起时。
- xfs_undelete — 遍历每个分配组的 inode B+ 树,并尝试恢复 XFS 文件系统上标记为已删除的所有文件。
TestDisk 和 PhotoRec
TestDisk 和 Photorec 都是开源数据恢复实用工具,根据 GNU 公共许可证 (GPL) 条款授权。
TestDisk 主要用于帮助恢复丢失的分区和/或修复无法启动的磁盘,当这些症状是由软件故障、某些类型的病毒或人为错误(例如意外删除分区表)引起时。TestDisk 可以检测多种文件系统,包括 NTFS、FAT12、FAT16、FAT32、exFAT、ext2、ext3、ext4、btrfs、BeFS、CramFS、HFS、JFS、Linux Raid、Linux Swap、LVM、LVM2、NSS、ReiserFS、UFS、XFS。它还可以从 FAT、NTFS、exFAT 和 ext2 文件系统中恢复已删除的文件。
TestDisk 可以修复分区表、恢复已删除的分区、从备份中恢复 FAT32 引导扇区、重建 FAT12/FAT16/FAT32 引导扇区、修复 FAT 表、重建 NTFS 引导扇区等。
PhotoRec 是一款文件恢复软件,旨在从硬盘和 CD-ROM 中恢复丢失的文件,包括照片(提示:PhotographRecovery)、视频、文档、存档。PhotoRec 会忽略文件系统,直接搜索底层数据,因此即使文件系统和/或分区表被重新格式化或严重损坏,它仍然可以工作。
安装
安装 testdisk 包,该包同时提供 TestDisk 和 PhotoRec。
用法
运行 e.g. ddrescue 来创建 image.img 后,photorec image.img 将打开一个终端 UI,您可以在其中选择要搜索的文件类型以及恢复文件的位置。他们的 wiki(分步指南)上有非常好的文档。
PhotoRec 恢复的文件
photorec 工具会将恢复的文件以随机名称(对于大多数文件)保存在编号的目录中,例如 ./recup_dir.1/f872690288.jpg,./recup_dir.1/f864563104_wmclockmon-0.1.0.tar.gz。
参见
- 如何获取原始文件名:PhotoRec FAQ
- 如何添加您自己的自定义文件签名:CGSecurity Wiki
- Wiki (TestDisk):https://www.cgsecurity.org/wiki/TestDisk
- Wiki (Photorec):https://www.cgsecurity.org/wiki/PhotoRec
- 主页:https://www.cgsecurity.org/
e2fsck
e2fsck 是 Arch 基础安装中包含的 ext2/ext3 文件系统检查器。e2fsck 依赖于有效的超级块。超级块是对整个文件系统参数的描述。由于此数据非常重要,因此在分区中分布了几个超级块的副本。使用 -b 选项,e2fsck 可以接受一个备用超级块参数;如果主超级块(第一个)损坏,这将很有用。
要确定超级块的位置,请在目标未挂载的分区上运行 dumpe2fs -h。超级块的间隔不同,具体取决于文件系统的块大小,该块大小在文件系统创建时设置。
确定超级块位置的替代方法是使用 mke2fs 的 -n 选项。请务必使用 -n 标志,根据 mke2fs(8) 的说法,“该选项会导致 mke2fs 不实际创建文件系统,而是显示它在创建文件系统时将执行的操作。只要使用创建文件系统时传递的参数再次使用,就可以确定特定文件系统的备份超级块的位置。(当然,添加了 -n 选项!)”。
安装
e2fsck 和 dumpe2fs 都包含在 Arch 基础安装中,作为 e2fsprogs 的一部分。
另请参阅 e2fsck(8) 和 dumpe2fs(8)。
处理原始磁盘映像
如果您使用 ddrescue 或 dd 备份了驱动器,并且需要将其映像挂载为物理驱动器,请参阅本节。
挂载整个磁盘
要将完整的磁盘映像挂载到下一个可用的 loop 设备,请使用 losetup 命令
# losetup -f -P /path/to/image
-f标志会将映像挂载到下一个可用的 loop 设备。-P标志会为每个分区创建额外的设备。
另请参阅 QEMU#With loop module autodetecting partitions。
挂载分区
为了能够挂载整个磁盘映像中的某个分区,请按照上面的步骤进行。
一旦完整的磁盘映像被挂载为 loop 设备,就可以在 loop 设备上使用普通的 mount 命令
# mount /dev/loop0p1 /mnt/example
此命令将 loop0 中的映像的第一个分区挂载到挂载点 /mnt/example 的文件夹中。请记住,挂载点目录必须存在!
获取磁盘几何信息
一旦整个磁盘映像被挂载为 loopback 设备,就可以检查其驱动器布局。
使用 QEMU 修复 NTFS
对于包含一个或多个需要由 Windows chkdsk 的 NTFS 分区的磁盘映像(因为 Linux 上没有好的 NTFS 文件系统检查器),QEMU 可以将原始磁盘映像用作虚拟机内的真实硬盘
# qemu -hda /path/to/primary.img -hdb /path/to/DamagedDisk.img
然后,假设 Windows 已安装在 primary.img 上,可以使用它来检查 /path/to/DamagedDisk.img 上的分区。
文本文件恢复
可以通过直接搜索块设备来查找硬盘上已删除的纯文本文件。需要一个您要恢复的文件中一个最好是唯一的字符串。
使用 grep 直接在分区上搜索固定字符串(-F)
$ grep -a -C 200 -F 'Unique string in text file' /dev/sdXN > OutputFile
希望已删除文件的内容现在在 OutputFile 中,可以手动从周围上下文中提取。
-C 200 选项告诉 grep 打印每个匹配项前后各 200 行的上下文。备选方案是 -A 和 -B 标志,它们分别只打印匹配项之后的上下文和匹配项之前的上下文。如果查找的文件非常长,您可能需要调整行数。参见
- Ubuntu wiki 上的数据恢复