如何安装和使用flashcache/bcache将HDD缓存到SSD?

我想知道是否有人尝试过安装和运行使用flashcachebcache进行SSD缓存的内核?
你是如何成功实现的呢?

1好问题。在我的一些回答中,我一直建议使用flashcache(12)。它似乎是这项工作的最佳工具,仅次于dm-cache。对于那些寻找Ubuntu/Linux下Intel Smart Response替代方案的人来说,它也是相关的。 - gertvdijk
我也在考虑将其作为Intel SRT的替代品。Arch Wiki 这里 在更多的话中说,它不适合胆小的人。问题是,我计划在我的唯一一台用于工作和娱乐的电脑上尝试它,所以我有些担心,并希望在这里找到一个操作指南。你认为在虚拟机上运行Ubuntu并在硬盘上有一个基于文件的驱动器,再加上一个基于文件的SSD驱动器来进行测试,是否可行?如果可以,我愿意尝试一下 :) - kapad
这是一个很好的问题,但是使用虚拟机作为测试平台的答案被认为是完整的吗?很多人没有必要的硬件来真正回答这个问题。 - RobotHumans
@AbrahamVanHelpsing 对我来说这样也可以。我认为将主机上的RAM磁盘呈现为虚拟磁盘给虚拟机使用,可以很好地模拟SSD。 - gertvdijk
4你已经尝试过这个Flashcache了吗?http://www.gerrit-tamboer.net/using-flashcache-to-speed-up-your-io-on-ubuntu-12-04/ - jasmines
@jasmines 不错的链接。打算试一试通过设置虚拟设备来实现,但我实际上想知道是否可能像Intel SRT那样利用flashcache设备以完全缓存并加快整个操作系统分区,包括已安装的应用程序和引导文件等。你知道这是否可行吗?怎样做呢? - kapad
@kapad 是的,这是完全可能的。与教程中的 /home 不同,你需要一些更多的技巧来在 / 上完成此操作,比如使用带有额外步骤的 Live CD。这正是我想在答案中看到的内容。但是...剩下的时间不多了,无法得到悬赏的答案了。 - gertvdijk
5dm-cache现已合并到稳定的3.9版Linux内核发布中。我猜这个获得26票的问题现在应该有一个答案了。 :) - gertvdijk
希望dm-cache能在Ubuntu 13.10中可用。 - Uli
就在上个月,我把我的Swap空间迁移到了SSD上,并进行了格式化。该死! - kapad
4个回答

有一个转换工具可以在现有设备上启用bcache(声明:我写过)。对于全新安装来说,这也是最佳选择,因为当前发行版的安装程序不知道如何创建bcache设备(在这种情况下:先在HDD上进行安装)。
请参阅将根文件系统转换为bcacheblocksREADME中了解详细说明。
bcache需要Linux 3.10或更高版本,在saucy中可用,并且可以从http://kernel.ubuntu.com/~kernel-ppa/mainline/?C=M;O=D手动安装(查找最新的标记发布,目前是v3.11.5-saucy,并安装与您的架构匹配的deb包)。 bcache-toolsblocks可以从我的存储ppa安装。

1这个工具在当前的Ubuntu版本(15.04)上已经损坏了;请参考https://github.com/g2p/maintboot/issues/1和https://github.com/g2p/blocks/issues/13。 - Jean Jordaan
实际上,当前工具本身并没有损坏(在昨天测试了一个350GB的硬盘)。但是,由于maintboot已经损坏,当前版本不能在系统运行时转换系统磁盘(//home/usr/等)。作为一种替代方案,您可以使用一个live USB棒,在其中安装blocks并用其来转换您的磁盘。但请注意,此工具仅适用于主MBR和GPT分区表,并且需要在每个分区之前多1MiB的额外空间。 - ntninja

好的,我们得到了bcache的答案,但没有flashcache的答案。我选择了flashcache,因为我已经有一个现有的安装,所以bcache是不考虑的。对我来说,它似乎更容易设置。我选择了DKMS方法,这样我就不会在每次内核升级时被困在重建模块/工具的循环中。
这些步骤在Github上的README-DKMS中有详细说明。 构建模块 第一件事是安装建筑前提条件: sudo apt-get install dkms build-essential linux-headers-$(uname -r) git
然后获取源代码: git clone git://github.com/facebook/flashcache; cd flashcache 构建并安装模块: make -f Makefile.dkms
创建一个flashcache设备
(在此示例中,我使用了writeback缓存 - 默认值- 但flashcache也可以进行writearound和writethrough)
对非根(未挂载在/的)设备进行缓存 sudo flashcache_create -p back fcache /dev/sdbX /dev/sdaX 其中fcache是创建的设备(/dev/mapper/fcache),/dev/sdaX是SSD分区(或整个磁盘),/dev/sdbX是HDD分区。
缓存您的根设备
如果要缓存根设备,还有一些额外的步骤。您将需要Ubuntu LiveCD/USB来完成此部分。
  1. cd /path/to/flashcache/source

  2. make -f Makefile.dkms boot_conf

  3. 编辑/boot/grub/grub.cnf和/etc/fstab以从/dev/mapper/fcache启动(我不认为这一步是真正必要的,但它说需要)。确保记录下原始根设备的UUID。

  4. 使用LiveCD/LiveUSB重新启动。

  5. 挂载根设备:mount /dev/sda4 /mnt(/dev/sda4是我的Linux根分区)

  6. cd /mnt/path/to/flashcache/source

  7. sudo apt-get install dkms build-essential linux-headers-$(uname -r)

  8. make; sudo make install在live环境中不需要进行整个DKMS设置

  9. 卸载根设备:sudo umount /mnt

  10. sudo flashcache_create -p back fcache /dev/sdbX /dev/disk/by-uuid/[UUID]其中fcache是已创建的设备(应与/etc/fstab和/boot/grub/grub.cnf中设置的相同,在我的情况下是fcache),/dev/sdbX是SSD分区(或整个磁盘),[UUID]是根分区的UUID。

  11. 重新启动!

使用根设备时的注意事项

当使用flashcache作为根设备时,一个小烦恼是grub-probe无法检测到根设备,并可能导致启动菜单出现两个Ubuntu条目。但实际上,这并不重要,因为上面的make -f Makefile.dkms boot_conf步骤会在您的initrd中安装一些脚本,用于检测和使用flashcache设备。


2我看到至少在raring版本中有flashcache-dkms和flashcache-utils的软件包。安装会有什么变化? - ivant
哦,真的吗?我没注意到。我也在用Raring,但是是从Git仓库安装的。我得看一下软件包,但我可以想象你应该能够跳过前几个部分,然后继续进行启动根设备的过程。 - Chuck R
1ubuntu 13.10的flashcache-dkms软件包不包含flashcache模块和二进制文件到initramfs中,因此如果您将root设备设置为flashcache,您将无法启动它。我已经创建了一个bug:https://bugs.launchpad.net/ubuntu/+source/flashcache/+bug/1290148 我按照上述描述从源代码构建了flashcache,并且能够成功启动以下链路:sda7 -> flashcache -> dm-crypt -> lvm -> ext4。只需将flashcache设备添加到/etc/crypttab并运行update-initramfs -u即可。 - Martin Vysny
你能否在grub文件中添加一条注释,说明你所做的更改? - kapad
我不再修改grub.cfg文件,似乎没有必要。然而,你可以像这样进行更改:linux /boot/vmlinuz-3.19.0-51-lowlatency root=UUID=0a540b91-5990-4df0-bc99-5d6e2cd3fed6 ro recovery nomodeset 改为 linux /boot/vmlinuz-3.19.0-51-lowlatency root=/dev/mapper/fcache ro recovery nomodeset(即更改root=参数)。 - Chuck R

事先警告:bcache 不能用于您现有的 Ubuntu 安装。如果您需要操作系统的 SSD 缓存,您应该等待未来或特殊版本的 Ubuntu 安装程序,该安装程序可以设置您的 SSD 缓存。请参阅 Oli 在这里的答案:bcache 需要全新安装吗?

对于其他人想要一个用于非操作系统数据的 bcache 磁盘:

第一件要做的事是升级您的内核,如果您使用的是 13.04 或更早版本,请使用内核主线 PPA。有关使用说明,请参阅此处:

https://wiki.ubuntu.com/Kernel/MainlineBuilds

确保在启动时选择3.9或更高的内核,否则它将无法工作并且您的驱动器会消失。
安装bcache-tools,目前您需要从git存储库中安装:
git clone http://evilpiepirate.org/git/bcache-tools.git

如果您成功为Debian打包了bcache-tools,请告诉我们,我们会为您更新这个问题。(bcache-tools的构建依赖项是uuid-devlibblkid-dev。它们必须安装才能构建bcache-tools。)
一旦您准备好了所有工具,您可以尝试按照这里的指南进行操作:

http://atlas.evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt

这个指南展示了如何格式化固态硬盘和机械硬盘,并将它们连接在一起,使用bcache创建一个新的设备块。如果你觉得这些说明不清楚,请留言,我会更新这个答案并进行简化。

能否创建一个运行3.9内核的启动盘,然后在这个盘上创建bcache驱动并安装Ubuntu? - kapad
可以的,但是你需要确保在启动时Ubuntu安装程序有正确的驱动程序,并且可能需要将引导设置在bcache之外,这样grub才能找到它。 - Martin Owens -doctormo-

我想在这里评论一下当我安装了一个新的内核时发生的事情。我只是在我的/home/文件夹分区上使用flashcache。我安装了一个新的内核,启动进入它时停在了启动过程中,并显示找不到/dev/mapper/home_cached,当你收到这个消息时有3个选择,我选择了以root用户登录并尝试修复它的选项。我首先尝试加载flashcache模块,但它说找不到。所以我想我必须为刚刚安装的这个新内核编译和安装它。我仍然在/root/目录下有/flashcache/文件夹,所以我进入其中并运行了...
make -f Makefile.dkms boot_conf

然后我跑了
make install

然后我使用以下命令加载了flashcache模块
modprobe flashcache

然后我只需要加载我的现有的flashcache设备,它是...
flashcache_load /dev/sdb1

然后只需挂载我的主目录分区。
mount /home

然后在命令行中使用“exit”退出root用户登录状态,系统应该会继续正常启动。一切都完成了!

我很好奇这个还能不能用,我最终决定不再使用Flashcache,而是在64GB的固态硬盘上安装了Arch(尽管Linux内核认为它只有32GB),这是由于内部固件的原因。我可以看到这对于一些Steam游戏来说作为缓存驱动器会很有益处。 - Ubu the Tech Guru