如何恢复bcache设备来管理文件系统

时间:2014-04-02 18:54:11

标签: linux filesystems block-device diskcache bcache

我的笔记本电脑上有一个20 GB的SSD设备,我决定尝试使用bcache。它似乎有效,但一段时间以来,我在启动时遇到错误:

error on 0f3bbb55-6839-4ed6-8127-7976a969f726: corrupted btree at bucket 17571, block 483, 61 keys, disabling caching

我想我可以尝试修复这个,但我已经决定我可能最好只是禁用bcache - 我对此不太了解这可能会导致丢失数据/头发,我认为我最好将分区用作交换,以便更快地进行休眠。

我的问题是,如何在不重新格式化支持设备的情况下在设备上安全停止使用bcache?

我使用/ dev / sda7作为我的后备设备,/ dev / sdb2作为缓存设备(/ dev / sdb1是root)。

如果重要的话,我用内核3.13.0-21-generic运行Ubuntu 14.04。

更新:我基本上正在寻找一种能够恢复make-bcache -B所做更改的解决方案。 FWIW,我最终解决了#34;这可以通过将所有内容移动到新分区并删除旧分区(请参阅下面的评论),但我会留下这个问题以防万一有人有实际的解决方案。

3 个答案:

答案 0 :(得分:3)

我最近对此有一个时间敏感问题,以下文字保存了我的培根:

  

D)在没有bcache的情况下恢复数据:

     

如果内核中没有bcache,则支持文件系统   器件仍可以8KiB偏移量使用。所以要么通过loopdev   使用--offset 8K创建的后备设备或由...定义的任何值    - 最初使用make-bcache格式化bcache时的数据偏移量。

     

例如:       losetup -o 8192 /dev/loop0 /dev/your_bcache_backing_dev

来自https://www.kernel.org/doc/Documentation/bcache.txt

这具有不修改驱动器上的分区表的额外好处,因此您可以复制一些数据并可能将其重新安装回原始主机。

答案 1 :(得分:2)

如果你了解内部结构,那就不是很难了。我从blocks读到要知道,为了将普通分区转换为bcache,它会稍微收缩一个分区,然后在那里添加一个bcache超级块。所以分区数据仍然存在。我做了一个测试,发现bcache超级块是8192字节大:

for i in {1..20}; do dd if=my_bcache_device skip=$i | file -; done

因此,要将其转换回来,只需更改分区表,以便以后启动8192个字节。使用gdisk(或fdisk,如果你使用MBR),删除分区,然后在新的地方重新创建它,你完成了:-)如果你愿意,可以稍后放大(但我没试过)这一点)。

请注意,如果您的bcache很脏(并且您不能再使用它),那么您必须fsck您的分区并弄乱数据损坏。我很幸运,手动fsck后只有少数文件被破坏了。

答案 2 :(得分:1)

一种解决方案是将设备从缓存中分离,并在no cache或直通模式下使用它。为此,请运行root

echo 1 > /sys/block/<device>/bcache/detach

(其中<device>是缓存后备设备,在您的情况下为/dev/sda7。)

这将从高速缓存中分离后备设备,以便不再使用高速缓存,而是直接访问所有读取和写入的驱动器。如果您的缓存没有处于损坏状态,这也会将任何脏数据从缓存写回到支持设备;在你腐败的状态下,你可能会失去运气。

您仍然需要通过/dev/bcache0/界面访问设备,但不会执行缓存。