我的笔记本电脑上有一个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;这可以通过将所有内容移动到新分区并删除旧分区(请参阅下面的评论),但我会留下这个问题以防万一有人有实际的解决方案。
答案 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/
界面访问设备,但不会执行缓存。