Linux 如何将bcache设备还原为常规设备

Linux 如何将bcache设备还原为常规设备,linux,filesystems,block-device,diskcache,bcache,Linux,Filesystems,Block Device,Diskcache,Bcache,我的笔记本电脑上有一个20GB的SSD设备,我决定尝试使用bcache。它似乎起作用了,但有一段时间,我在启动时遇到了一个错误: error on 0f3bbb55-6839-4ed6-8127-7976a969f726: corrupted btree at bucket 17571, block 483, 61 keys, disabling caching 我想我可以尝试修复这个问题,但我决定禁用bcache可能会更好——我对这方面的了解还不够,如果出现故障,可能会丢失数据/头发,我认为

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

一个解决方案是将设备从缓存中分离,并在
无缓存
或直通模式下使用。要执行此操作,请以root用户身份运行:

echo 1 > /sys/block/<device>/bcache/detach
echo 1>/sys/block//bcache/detach
(其中
是缓存备份设备,
/dev/sda7

这将使备份设备与缓存分离,以便不再使用缓存,而是直接访问驱动器进行所有读写操作。如果缓存未处于损坏状态,这也会将缓存中的任何脏数据写回备份设备;然而,在你堕落的状态下,你可能是运气不佳


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

如果您了解内部结构,这并不难。我从中了解到,为了将普通分区转换为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之后,只有少数文件被损坏。

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

D) 在不使用bcache的情况下恢复数据:

如果bcache在内核中不可用,则备份上的文件系统 该设备在8KiB偏移量下仍然可用。因此,要么通过一个环网 使用--offset 8K或由定义的任何值创建的支持设备的 --最初使用
make bcache
格式化bcache时的数据偏移量

例如:
losetup-o 8192/dev/loop0/dev/your\u bcache\u backing\u dev


这样做的另一个好处是不修改驱动器上的分区表,因此您可以复制一些数据,并可能将其重新装载回其原始主机。

谢谢-我相信这基本上就是设备所处的状态-安装良好,而且似乎没有错误。我希望找到一个解决方案,使bcache-B基本上不受影响。最后,我采用了暴力路线:*使用此处的说明调整了分区的大小:*创建新分区并将所有数据从备份分区复制到该分区*删除备份分区并调整新的非bcache分区的大小这花费了很长时间,但成功了:)