xfs_undelete 发布 XFS 文件系统恢复工具一、概述1. 工具简介xfs_undelete 是一款专门用于 XFS 文件系统的文件恢复工具。该工具由 Jan Kandziora 开发，采用 Tcl 脚本编写，可以帮助用户从 XFS 文件系统中恢复已删除的文件。当前最新版本为 v15.0，发布于 2024 年 7 月 21 日。XFS 是一种高性能的日志文件系统，广泛应用于 Linux 服务器和企业级存储系统。然而，XFS 文件系统的删除机制使得文件恢复变得相当困难。xfs_undelete 工具的出现填补了这一空白，为系统管理员和数据恢复专业人员提供了一种有效的恢复方案。2. 核心功能xfs_undelete 的主要功能包括：扫描 XFS 文件系统中所有标记为已删除的文件根据删除时间范围筛选恢复文件根据文件类型进行选择性恢复自动识别文件类型并分配扩展名对恢复的文件进行完整性检查支持中断后继续恢复3. 项目信息仓库地址：https://github.com/ianka/xfs_undelete开发语言：Tcl（69.6%）、Roff（29.9%）、Nix（0.5%）许可证：GPL-3.0GitHub 星标：297Fork 数量：51贡献者：5 人二、工作原理1. 技术架构XFS 文件系统采用 B+ 树结构来管理 inode。当文件被删除时，XFS 会将 inode 标记为删除状态，但并不会立即清除 extent（数据块映射）信息。xfs_undelete 正是利用这一特性来实现文件恢复。graph TB A[XFS 文件系统] --> B[分配组 AG] B --> C[Inode B+树] C --> D[扫描 Inode] D --> E{检查魔术字符串} E -->|IN\\0\\0| F[已删除 Inode] E -->|其他| G[跳过] F --> H[解析 Extent 信息] H --> I[收集数据块] I --> J[重组文件数据] J --> K[保存到目标位置]2. 恢复机制xfs_undelete 的工作流程包括以下步骤：遍历每个分配组的 inode B+ 树检查文件系统中存储 inode 的块，查找魔术字符串 IN\0\0（表示已删除的 inode）尝试解析 inode 中存储的 extent 信息（XFS 不会删除这些信息）收集文件的数据块将数据块重组并保存到指定的恢复目录3. 文件识别工具使用 file 命令和 magic number 数据库来识别文件类型。如果安装了支持 MIME 类型的 file 工具，xfs_undelete 可以根据文件内容猜测文件扩展名。三、系统要求1. 运行环境A. 必需组件Tcl >= 8.5tcllib 包（用于解析命令行参数）GNU coreutils（包含 dd、readlink、stat 等工具）B. 推荐组件file 工具（具有 magic number 文件和 MIME 类型支持）C. 存储要求需要在另一个文件系统上有足够的存储空间来保存恢复的文件。恢复的文件无法在原位恢复。2. 支持的发行版xfs_undelete 已经被以下 Linux 发行版收录：OpenSUSE Linux：https://software.opensuse.org/package/xfs_undeleteArch Linux（AUR）：https://aur.archlinux.org/packages/xfs_undelete/四、功能详解1. 时间范围过滤工具提供了灵活的时间过滤选项，可以精确控制需要恢复的文件范围。A. 删除时间范围（-t 选项）只恢复在指定时间范围内删除的文件。时间范围可以指定为：两个时间点，用双点分隔：2020-03-19..-2hours从纪元开始的范围：..-2hours到当前时间的范围：-2hours..单个时间点：-2hours时间规范支持 Tcl 的 clock scan 函数接受的所有值。B. 修改时间范围（-T 选项）只恢复在删除前指定时间范围内修改过的文件。这个选项对于知道最新备份日期的情况非常有用。时间范围格式与 -t 选项相同。2. 文件类型过滤A. 包含过滤（-r 选项）只恢复与指定模式匹配的文件类型。模式列表用逗号分隔。默认情况下，此模式为 *，即恢复所有文件。B. 排除过滤（-i 选项）忽略与指定模式匹配的文件类型。默认设置为 bin，即忽略所有未知类型的文件。C. 文件类型模式文件类型模式可以是 / 形式（匹配 MIME 类型）或其他形式（匹配文件扩展名）。文件扩展名是根据 file 工具从文件内容猜测的，因此可能与删除前的扩展名不同。使用 -l 选项可以查看所有有效的文件类型。3. 其他过滤选项A. inode 过滤（-x 选项）忽略指定 inode 编号的文件。inode 列表用逗号分隔。B. 大小过滤（-S 选项）忽略大于指定大小的文件。大小可以指定为字节数，或附加 k、M、G 后缀表示千字节、兆字节、吉字节。C. 零字节清理（-z 选项）从与指定模式匹配的文件中删除尾随零。默认设置为 text/，即所有 text/ MIME 类型的文件都会删除尾随零。五、使用指南1. 基本用法A. 最简单的使用方式cd ~ xfs_undelete /dev/mapper/cr_data这将把 /dev/mapper/cr_data 中恢复的文件保存在 ~/xfs_undeleted 目录中。B. 指定输出目录xfs_undelete -o /mnt/external_harddisk /dev/sda3这将把 /dev/sda3 中恢复的文件保存到 /mnt/external_harddisk 目录。2. 高级用法A. 按时间范围恢复xfs_undelete -t 2020-03-19 /dev/sda3忽略 2020 年 3 月 19 日之前删除的文件。xfs_undelete -t -1hour /dev/sda3忽略一小时前删除的文件。B. 恢复所有类型文件xfs_undelete -i "" -t -2hour /dev/sda3恢复两小时内删除的所有文件，包括"bin"文件（未知类型）。C. 按文件类型恢复xfs_undelete -r 'image/*,gimp-*' /dev/sda3只恢复匹配 image/* MIME 类型的文件，以及被分配以 gimp- 开头的扩展名的文件。3. 命令行选项完整的命令行语法：xfs_undelete [-t timerange] [-T timerange] [-r filetypes] [-i filetypes] [-x inodes] [-S size] [-z filetypes] [-o output_directory] [-s start_inode] [-m magicfiles] [--no-remount-readonly] device xfs_undelete -l [-m magicfiles]主要选项说明：-t timerange：只恢复指定时间范围内删除的文件-T timerange：只恢复删除前指定时间范围内修改过的文件-r filetypes：只恢复指定类型的文件-i filetypes：忽略指定类型的文件-x inodes：忽略指定的 inode-S size：忽略大于指定大小的文件-z filetypes：从指定类型的文件中删除尾随零-o output_directory：指定输出目录-s start_inode：指定开始恢复的 inode 编号-m magicfiles：指定 alternate magic 文件列表--no-remount-readonly：不重新挂载为只读模式-l：列出所有有效的文件类型六、限制与注意事项1. XFS 文件系统的固有限制A. 文件名和路径无法恢复XFS 删除文件的方式使得恢复文件名和路径成为不可能。工具只能根据删除时间、inode 编号和猜测的文件扩展名来命名恢复的文件。用户需要手动检查和重命名恢复的文件。B. 碎片文件恢复受限对于 512 字节的 inode，最多只能恢复具有 21 个 extent（任意大小）的文件。具有更多 extent 的文件无法通过此程序恢复。C. 文件大小不准确大多数文件会用零填充以适应 XFS 块大小边界。大多数程序不会在意这些尾随零字符。text/* MIME 类型的文件默认会在恢复后删除尾随零。2. 安全性考虑A. 只读操作xfs_undelete 只对源文件系统执行读取操作。它默认会在启动时将文件系统重新挂载为只读模式，以防止意外覆盖源数据。B. 风险提示尽管工具尽可能保证安全，但作者不提供任何保证或责任声明。使用风险自负。C. --no-remount-readonly 选项此选项用于需要从根文件系统恢复文件的特殊情况。使用此选项有风险，因为源文件系统不会重新挂载为只读，可能会意外覆盖源文件系统。建议将硬盘移动到另一台计算机进行恢复。3. 故障排除A. 权限问题操作设备时需要以 root 用户身份运行，因为工具会将源文件系统重新挂载为只读模式。如果文件系统繁忙（例如有程序以读写模式打开文件），重新挂载可能会失败。解决方法：停止使用文件系统的程序使用 fuser -m /home 查找占用文件的进程最终可以进入单用户模式如果需要从 / 文件系统恢复，建议从另一个根文件系统启动B. 存储空间需要在另一个文件系统上有足够的空间来保存恢复的文件。如果计算机只有一个巨大的 XFS 文件系统，需要连接外部存储。C. 文件类型识别问题如果恢复的文件没有文件扩展名，或者 -r、-i、-z 选项不起作用：使用 -l 选项检查 file 工具是否正常工作如果返回的列表很短，可能是 file 工具未安装检查 file-magic 包是否安装确认 magic 文件支持 MIME 类型七、技术特色1. 设计优势xfs_undelete 的设计体现了以下优势：轻量级：采用 Tcl 脚本编写，代码简洁易读安全性：只读操作，不会对源文件系统造成二次破坏灵活性：提供多种过滤选项，精确控制恢复范围实用性：支持中断继续，适合大规模恢复任务2. 与其他恢复工具的对比特性xfs_undeleteext4recoverTestDisk支持文件系统XFSext4多种文件名恢复不支持支持支持时间过滤支持不支持不支持类型过滤支持不支持有限安装难度简单中等中等八、适用场景1. 典型应用场景xfs_undelete 适用于以下场景：误删除文件后的紧急恢复定期备份之前的文件恢复系统维护前的数据备份数据迁移后的遗漏文件恢复恶意软件攻击后的数据恢复2. 最佳实践一旦发现文件丢失，立即停止对文件系统的任何写入操作如果可能，将硬盘连接到另一台计算机进行恢复优先恢复到外部存储设备使用时间过滤缩小恢复范围，减少恢复时间和存储空间恢复后及时验证文件完整性建立定期备份机制，减少对恢复工具的依赖九、总结xfs_undelete 是一款针对 XFS 文件系统的专业恢复工具，填补了 XFS 文件系统恢复领域的空白。虽然受到 XFS 文件系统删除机制的限制，无法恢复文件名和路径，但通过时间范围过滤、文件类型过滤等功能，仍然可以为用户提供有效的数据恢复方案。对于使用 XFS 文件系统的系统管理员和数据恢复专业人员来说，xfs_undelete 是一个值得收藏的工具。在日常工作中，应该建立完善的备份机制，将数据恢复工具作为最后一道防线。参考资料xfs_undelete GitHub 仓库
有个朋友使用tar --remove-files操作，执行了两遍，造成数据丢失。如何理解tar --remove-filestar --remove-files 是一个 tar 命令的选项，用于在打包文件后删除源文件。下面是对该选项的解释和使用方法：tar 命令用于创建归档文件或提取归档文件中的内容。默认情况下，tar 命令在打包文件后不会删除源文件，而是保留原始文件。使用 tar --remove-files 选项可以在打包文件后删除源文件。这对于需要将文件打包并删除原始文件的情况非常有用，以释放磁盘空间或确保文件不被重复处理。以下是使用 tar --remove-files 的示例命令：tar -czvf archive.tar.gz --remove-files file1.txt file2.txt在上面的命令中，-czvf 选项用于创建一个压缩的归档文件 archive.tar.gz。--remove-files 选项告诉 tar 在打包文件后删除指定的源文件 file1.txt 和 file2.txt。请注意，使用 --remove-files 选项时要小心，因为它会永久删除源文件，无法恢复。在使用该选项之前，请确保你已经备份了重要的文件或确认不再需要这些文件。此外，tar 命令的不同版本可能会有略微不同的选项和行为，请查阅你所使用的 tar 版本的文档或使用 tar --help 命令获取更多详细信息。如何恢复linux误删文件如果你在Linux系统中误删了文件，可以尝试以下方法来恢复文件：使用回收站：如果你使用的是图形界面的文件管理器（如Nautilus、Nemo等），删除的文件可能会被移动到回收站（Trash）中。你可以打开回收站并还原误删的文件。使用命令行工具：如果你在命令行中删除了文件，可以尝试使用一些命令行工具来恢复它们。以下是一些常用的命令行工具：extundelete：用于恢复被ext2、ext3或ext4文件系统删除的文件。使用该工具需要在文件系统上运行，因此需要从另一个存储介质（如USB驱动器）或Live CD/USB中启动系统，并在那里安装和运行extundelete。testdisk：一个功能强大的工具，用于恢复被删除的分区和文件。它支持多种文件系统，并且也需要从另一个存储介质或Live CD/USB中启动系统来运行。photorec：也是testdisk软件包的一部分，专门用于恢复各种类型的文件，包括照片、视频和文档等。它可以在文件系统上运行，也可以从另一个存储介质或Live CD/USB中启动系统来运行。这些工具的使用方法和恢复步骤可能会有所不同，因此请参考它们的文档或使用帮助命令来了解详细的操作步骤。使用数据恢复软件：如果以上方法无法恢复文件，你可以尝试使用一些专业的数据恢复软件。这些软件通常具有更高级的恢复功能，但可能需要付费购买或提供试用版。一些常见的数据恢复软件包括Recuva、TestDisk、PhotoRec、EaseUS Data Recovery等。无论你使用哪种方法，重要的是在发现误删文件后尽快采取行动。避免写入新数据到误删文件所在的存储介质上，以减少文件被覆盖的风险，并尽快尝试恢复文件。如何使用testdisk恢复rm误删文件？如果你使用的是 CentOS 系统，你可以按照以下步骤使用 testdisk 工具来尝试恢复 rm 误删的文件：安装 testdisk：打开终端并使用以下命令安装 testdisk：sudo yum install testdisk启动 testdisk：在终端中输入 testdisk 命令来启动 testdisk。选择磁盘：testdisk 启动后，它会显示可用的磁盘列表。选择包含误删文件的磁盘，并按下 Enter 键。选择分区类型：根据你的磁盘分区类型选择适当的选项。通常，testdisk 会自动检测分区类型，你只需按照提示进行选择。选择分区：在分区列表中，选择包含误删文件的分区，并按下 Enter 键。选择分区表类型：根据你的分区表类型选择适当的选项。如果不确定，可以选择默认选项。分析分区：testdisk 将开始分析分区并扫描已删除的文件和目录。这可能需要一些时间，具体取决于分区的大小和复杂性。寻找被删除的文件：在分析完成后，testdisk 会显示找到的文件和目录列表。你可以使用键盘导航来浏览列表。恢复文件：使用键盘导航找到要恢复的文件或目录，并按下 C 键来复制它们到另一个位置。选择一个安全的目标位置，以免覆盖其他数据。完成恢复：完成文件恢复后，你可以退出 testdisk。请记住，在使用 testdisk 进行文件恢复时要小心谨慎，并遵循其文档中的指示。尽量避免在误删除文件的磁盘上写入新数据，以提高恢复成功的机会。需要注意的是，无法保证 testdisk 能够恢复所有的文件。恢复成功与文件是否被覆盖、文件系统的状态以及其他因素有关。因此，及时采取行动并备份重要数据是最佳实践。科科说，有人用过，可以恢复！！！