如何从 bcache 中删除缓存设备?

Ada*_*ski 8 linux memory bcache

我相信,一旦我确定我的缓存设备状态是“干净的”:

$ sudo cat /sys/block/bcache0/bcache/state
Run Code Online (Sandbox Code Playgroud)

我可以在关机或使用 liveCD 启动时将其从机器上物理移除,并使用以下命令清理超级块:

$ sudo dd if=/dev/zero of=<backing device for cache> bs=1024 count=1024
Run Code Online (Sandbox Code Playgroud)

但我找不到任何地方确认,这个程序不会搞砸任何事情。

Mar*_*ich 13

bcache只在 writethrough 配置中使用,即使bcache在机器运行时缓存设备消失,IIRC也不喜欢。bcache如果发生这种情况,预计设备会完全停止。

我没有尝试在机器断电时移除缓存设备,所以我不能说什么。我确实认为这bcache仍然很敏感,所以我建议你先用虚拟机或物理测试机试试。


要安全地移除缓存设备,您可以将缓存集与 bcache 设备分离:

echo <cache-set-uuid> > /sys/block/bcache0/bcache/detach
Run Code Online (Sandbox Code Playgroud)

要确定必要的缓存集 UUID,请查看/sys/fs/bcache/

host ~ # ll /sys/fs/bcache/
total 0
drwxr-xr-x 7 root root    0 Feb 19 00:11 eb99feda-fac7-43dc-b89d-18765e9febb6
--w------- 1 root root 4096 Feb 19 00:11 register
--w------- 1 root root 4096 Feb  7 07:17 register_quiet
Run Code Online (Sandbox Code Playgroud)

因此,例如在这种情况下,运行:

echo eb99feda-fac7-43dc-b89d-18765e9febb6 > /sys/block/bcache0/bcache/detach
Run Code Online (Sandbox Code Playgroud)

state文件应该说no cache后:

host ~ # cat /sys/block/bcache0/bcache/state
no cache
Run Code Online (Sandbox Code Playgroud)

  • 我可能在这里遗漏了一些警告,但是 AFAICT 不需要将缓存 UUID 回显到 /sys/block/bcache0/bcache/detach,您可以只回显“1”。至少,这在内核 3.13 上对我有用。但是,对于附加,您需要提供 UUID。 (6认同)

Ada*_*ski 4

假设你已经成功设置了一个bcache,你已经在处理它了,放了很多重要的数据,太大了,无法简单地备份并重新开始,当你意识到,你最好更换缓存设备。您可以这样做。该解决方案基于 VM 试验。

假设我们正在谈论设备/dev/bcache0,新的缓存设备是/dev/sdf1,支持设备是/dev/md1。所有命令均由 root 完成。

  1. 确保没有任何东西正在使用该 bcache0 设备。
  2. 按任意顺序进行
    1. 正如 Martin von Wittich 所写,通过将 setUUID 回显到 中来删除缓存设备/sys/block/bcache0/bcache/detach。如果要对缓存设备重新分区,则需要重新启动,因为除非您取消注册,否则 bcache 仍会锁定分区。
    2. format- 新的缓存设备并make-bcache -C /dev/sdf1记下该设备的 setUUID。
  3. 使用新的缓存集注册我们的支持设备:

    echo [setUUID of new cache device] >/sys/block/bcache0/bcache/attach

无需重新启动。