文件恢复
本文列出了 Linux 下的数据恢复和取消删除选项。
本文主要用于教育目的。如果您意外删除或以其他方式损坏了技术上健康/功能正常的驱动器上的珍贵且不可替代的数据,且没有任何数据恢复经验,请立即关闭您的计算机(直接按住电源按钮或拔掉电源;不要使用系统关机功能)并寻求专业帮助。
特殊情况
故障驱动器
在数据恢复领域,最好在磁盘镜像上进行操作,而不是在物理磁盘本身上。通常,故障驱动器的状况会随着时间的推移而恶化。目标应该是在磁盘故障的早期阶段尽可能多地挽救数据,然后弃用该磁盘。ddrescue 和 dd_rescue 工具与 dd 不同,它们会反复尝试从错误中恢复,并从头到尾读取驱动器,然后再从尾到头读取,试图抢救数据。它们保留日志文件,以便可以在不丢失进度的情况下暂停和恢复恢复过程。
请参阅 Disk cloning。
使用 ddrescue 等工具创建的镜像文件可以像物理设备一样挂载并安全地操作。务必保留原始镜像的副本,以便在情况恶化时可以恢复!
不要尝试对故障驱动器进行文件系统检查,因为这很可能会使问题恶化。请以只读方式挂载。
备份闪存介质/小分区
作为处理“实时”分区(无论是否挂载)的替代方案,通常最好使用镜像进行处理,前提是相关文件系统不是太大,并且您有足够的空闲硬盘空间来容纳该镜像文件。例如,像优盘、数码相机、便携式音乐播放器、移动电话等闪存设备在许多情况下都足够小,可以进行镜像处理。
请务必阅读下面列出的工具的手册页,以验证它们是否能够处理镜像文件。
要创建镜像,可以使用 dd,如下所示
# dd if=/dev/target_partition of=/home/user/partition.image
使用数码相机
为了使下一节中列出的一些工具能够处理闪存介质,相关设备需要作为块设备挂载(即在 /dev 下列出)。以 PTP(图片传输协议)模式运行的数码相机在这方面无法工作。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 — 旨在从硬盘、CD-ROM 中恢复丢失文件(包括视频、文档和存档)以及从数码相机内存中恢复丢失照片(因此得名 Photo Recovery)的文件数据恢复软件。
- 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。
用法
在运行例如 ddrescue 创建 image.img 后,photorec image.img 将打开一个终端界面,您可以在其中选择要搜索的文件类型以及将恢复的文件放置在哪里。他们的 wiki 上有非常好的文档(分步指南)。
PhotoRec 恢复的文件
photorec 工具将恢复的文件存储在编号的目录中,并使用随机名称(对于大多数文件),例如 ./recup_dir.1/f872690288.jpg,./recup_dir.1/f864563104_wmclockmon-0.1.0.tar.gz。
参见
- 如何获取原始文件名:PhotoRec 常见问题解答
- 如何添加您自己的自定义文件签名: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/ext4 文件系统检查器。e2fsck 依赖于有效的超级块。超级块是整个文件系统参数的描述。由于此数据非常重要,超级块的多个副本分布在整个分区中。使用 -b 选项,e2fsck 可以接受备用超级块参数;如果主(第一个)超级块损坏,这非常有用。
要确定超级块的位置,请在目标、未挂载的分区上以 root 身份运行 dumpe2fs /dev/partition | grep superblock。超级块的间距取决于文件系统的块大小,该大小在创建文件系统时设置。
确定超级块位置的另一种方法是在 mke2fs 中使用 -n 选项。请务必使用 -n 标志,根据 mke2fs(8) 的说法,“使 mke2fs 不会真正创建文件系统,而是显示如果它要创建文件系统会做什么。只要再次使用最初创建文件系统时传递的 mke2fs 参数,这就可以用来确定特定文件系统的备用超级块的位置。(当然,还要加上 -n 选项!)”。
安装
e2fsck 和 dumpe2fs 都作为 e2fsprogs 的一部分包含在基础 Arch 安装中。
参阅 e2fsck(8) 和 dumpe2fs(8)。
处理原始磁盘镜像
如果您已经使用 ddrescue 或 dd 备份了驱动器,并且需要将此镜像挂载为物理驱动器,请参阅本节。
挂载整个磁盘
要将完整的磁盘镜像挂载到下一个空闲的循环设备,请使用 losetup 命令
# losetup -f -P /path/to/image
-f标志将镜像挂载到下一个可用的循环设备。-P标志为每个分区创建额外的设备。
参阅 QEMU#With loop module autodetecting partitions。
挂载分区
为了能够挂载整个磁盘镜像的分区,请遵循上述步骤。
一旦挂载了整个磁盘镜像,就可以在循环设备上使用常规的 mount 命令
# mount /dev/loop0p1 /mnt/example
此命令将 loop0 中镜像的第一个分区挂载到挂载点 /mnt/example。请记住,挂载点目录必须存在!
获取磁盘几何结构
一旦整个磁盘镜像被挂载为回环设备,就可以检查其驱动器布局。
使用 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