如何将bcache设备还原为regulare文件系统

我的笔记本电脑上有一个20GB的SSD设备,我决定尝试bcache。 这似乎工作,但一段时间以来,我一直在启动时出现错误:

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

我想我可以尝试和修复这个,但我已经决定,我可能会更好,只是禁用bcache – 我不知道足够的风险丢失数据/头发,如果事情打破,我想我会更好closures使用分区作为交换更快的冬眠。

我的问题是,如何安全地停止在设备上使用bcache而不重新格式化后备设备?

我使用/ dev / sda7作为备份设备,/ dev / sdb2作为caching设备(/ dev / sdb1是root)。

如果有关系,我使用内核3.13.0-21-generic运行Ubuntu 14.04。

更新:我基本上寻找一个解决scheme,恢复由make-bcache -B所做的更改。 FWIW,我最终通过将所有内容移动到一个新的分区并删除旧分区来解决这个问题(见下面的注释),但是如果有人有实际的解决scheme,我会留下这个问题。

一种解决方案是将设备从缓存中分离出来,并且不使用no cache或直通模式。 为此,请以root身份运行:

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

(其中<device>是缓存支持设备,在你的情况下是/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(或使用MBR的fdisk),删除分区,然后在新的位置重新创建分区,然后完成:-)如果需要,可以放大(但我没有试过)。

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

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

D)恢复没有bcache的数据:

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

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

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

这还有一个好处,就是不要修改驱动器上的分区表,所以你可以复制一些数据并将其重新装回原来的主机。