8

我的笔记本电脑上有一个 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,我最终通过将所有内容移动到新分区并删除旧分区来“解决”这个问题(请参阅下面的评论),但如果有人有实际的解决方案,我会留下这个问题。

4

3 回答 3

11

我最近遇到了一个时间敏感的问题,下面的文字保存了我的培根:

D) 不使用 bcache 恢复数据:

如果 bcache 在内核中不可用,则支持设备上的文件系统在 8KiB 偏移处仍然可用。因此,无论是通过使用 --offset 8K 创建的后备设备的 loopdev,还是在您最初使用make-bcache.

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

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

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

于 2017-07-06T13:37:17.207 回答
5

如果您了解内部情况,这并不难。我从中读取知道,为了将普通分区转换为 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 后只有少数文件损坏。

于 2016-05-14T12:47:51.307 回答
1

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

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

(在您的情况下<device>,缓存支持设备在哪里/dev/sda7)。

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

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

于 2014-04-25T14:08:40.177 回答