如何将bcache设备恢复到规则文件系统

Gre*_*lec 8 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
Run Code Online (Sandbox Code Playgroud)

我想我可以尝试修复这个,但我已经决定我可能更好的只是禁用bcache - 我不太了解这可能会丢失数据/头发如果出现问题,我认为我会更好关闭使用分区作为交换更快的冬眠.

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

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

如果重要的话,我正在使用内核3.13.0-21-generic运行Ubuntu 14.04.

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

STR*_*RML 7

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

D)不使用bcache恢复数据:

如果bcache在内核中不可用,则备份设备上的文件系统仍然可用,偏移量为8KiB。因此,可以通过使用--offset 8K创建的后备设备的loopdev,或者通过最初使用格式化bcache时由--data-offset定义的任何值make-bcache

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

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

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


lil*_*jwg 5

如果你了解内部原理,这并不难。我从中了解到,为了将普通分区转换为 bcache,它会稍微缩小分区,然后在其中添加 bcache 超级块。所以分区数据仍保留在那里。我做了一个测试,发现 bcache 超级块有 8192 字节大:

for i in {1..20}; do dd if=my_bcache_device skip=$i | file -; done
Run Code Online (Sandbox Code Playgroud)

因此,要将其转换回来,只需更改分区表,使其在 8192 字节之后开始。使用 gdisk(或 fdisk,如果您使用 MBR),删除分区,然后在新位置重新创建它,就完成了:-) 如果需要,您可以稍后放大它(但我没有尝试这样做)。

请注意,如果您的 bcache 脏了(并且您无法再使用它),则必须对分区进行 fsck 并弄乱损坏的数据。我很幸运,在手动 fsck 后只有几个文件被损坏。


dav*_*idg 1

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

echo 1 > /sys/block/<device>/bcache/detach
Run Code Online (Sandbox Code Playgroud)

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

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

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