如何取消删除btrfs分区上的文件?


19

如何取消删除(恢复)btrfs分区上的已删除文件?

我尚未拍摄快照,因此无法使用该功能。我知道有一些 用于其他Linux文件系统的工具,但是google尚未提供针对btrfs的任何工具。我碰到一个模糊的提法,即btrfs包含一个未删除的工具,但我找不到它。在尝试用于另一个文件系统的工具之前,我先在这里问。

更多信息:

  • (两个)删除的文件被远程rsync命令删除而出错。
  • 这些是小的纯文本文件。
  • 我知道文件的名称。
  • 我也许能够记住文件中的一些字符串。
  • 该磁盘是常规HDD,但很大(2TB)。
  • 我正在运行具有所有最新更新的Kubuntu 12.04(beta2)。
  • 我尚未将任何新数据写入删除文件的分区。
  • 我没有这些文件的快照或备份。(上次备份仅比这些文件早几个小时。)
  • 奇怪的是,与ext3 / 4相比,COW文件系统似乎具有更少的文件取消删除选项。

Answers:


7

由于您的文件较小且纯文本,因此,我尝试将“字符串”的输出扫描到文件系统所在的设备中,即

strings /dev/sda1 | less

然后使用“ /”搜索该文件中可能包含的字符串。找到文本后,将其开头以“ m”定界,然后移至末尾并使用“ | cat> file”将其保存到文件中。

实际上,几年前,当我在另一个文件系统上遇到类似的情况且没有取消删除时,我已经做到了,它对我来说非常有用。


4

约尔格·沃尔特(JörgWalter)btrfs-undelete使用find-root和中的和restore工具实现了一个shell脚本btrfs-progs,可以在此处找到,并应帮助处于类似位置的其他人。

由于它是根据GPLv2许可的,因此我不能在此包括它。


3
值得注意的是,该脚本至少有一个路径被硬编码(可能是错误地编码),并且还存在其他一些问题,因此购买者请注意,使用前必须对其进行编辑。
gamen

2
这是原始脚本的清理版本:gist.github.com/Changaco/45f8d171027ea2655d74
Changaco 2015年

“由于它是根据GPLv2许可的,因此我不能在此处包含它”-也许您应该阅读GPLv2所说的内容,因为这毫无意义。
s语2016年

4
@slang也许您应该阅读本网站的服务条款?贡献必须根据知识共享署名相同方式共享3.0许可进行许可。
suriv '17

@suriv-我想我可以理解他们这样做的原因,但这很烦人。特别是因为CC-BY-SA的限制仅比GPL略多(除了GPLv3的专利资料)。
五花八门

2

如果您的btrfs驱动器具有子卷,则需要将其他-r <subvol-id>选项传递给btrfs restore。不幸的是,那里的脚本(如发布的一个user414471(http://oelkers.de/tips/undeleteBtrfs.sh))没有选择权,但是可以对此进行调整。

如果要手动执行此操作,则需要使用以下方法获取正确的subvol-id:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

或者选择:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

之后,您使用btrfs-find-root来获取要还原到的块号(通常是在当前根数最大的块号之前的那个)。为此,您需要首先将默认子卷设置为要还原文件的子卷(然后再还原此更改):

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

您最终可以使用btrfs restorewith -r <subvol-id>进行恢复(--dry-run如果需要,可以首先使用参数):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

有关所有这些的更多信息,请参见:https//btrfs.wiki.kernel.org/index.php/Restore


在Fedora 26系统上对此进行了测试-在那里,该btrfs-find-root步骤永不终止(即在100%CPU上的<250 GB FS上运行3小时)。另请参见类似的故事spinics.net/lists/linux-btrfs/msg61361.html
maxschlepzig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.