Bcache是Linux内核块设备层cache,支持多块HDD使用同一块SSD作为缓存盘。它让SSD作为HDD的缓存成为了可能。由于SSD价格昂贵,存储空间小,而HDD价格低廉,存储空间大,因此采用SSD作为缓存,HDD作为数据存储盘,既解决了SSD容量太小,又解决了HDD运行速度太慢的问题。 注:Bcache是从Linux-3.10开始正式并入内核主线的,因此,要使用Bcache,需要将内核升级到3.10及以上版本才行。
Bcache支持三种缓存策略,分别是:writeback、writethrough、writearoud,默认使用writethrough,缓存策略可动态修改。
要使用Bcache,必须安装bcache-tools工具包,由于CentOS 7的源中没有bcache-tools,因此,需要手动下载源码包进行编译。源码在这:bcache-tools,下载之后,需要安装libblkid-devel依赖包方可进行编译,通过以下命令即可安装:
yum install libblkid-devel
安装libblkid-devel包成功之后,直接编译bcache-tools安装即可。
使用磁盘作为Bcache磁盘前,请先确保磁盘是空的,或者磁盘中的数据无关紧要。如果磁盘中有文件系统,将会出现如下错误:
[root@localhost ~]# make-bcache -C /dev/sdc
Device /dev/sdc already has a non-bcache superblock, remove it using wipefs and wipefs -a
[root@localhost ~]#
此时,需要使用wipefs命令,擦除磁盘中的超级块中的数据,这将使得原磁盘中的数据无法继续使用,也无法进行还原,因此,使用此命令前,请确保磁盘中的数据已经备份。
擦除磁盘中的超级块信息:
创建Bcache后端磁盘(HDD):
创建Bcache缓存磁盘(SSD):
查看Bcache磁盘:
要使用bcache磁盘,需要先将磁盘进行格式化,可以使用mkfs.ext4将bcache磁盘格式化成ext4,操作如下:
[root@localhost ~]# mkfs.ext4 -F /dev/bcache0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621438 blocks
131071 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]#
此时,即可进行挂载,如下:
[root@localhost ~]# mount /dev/bcache0 /mnt
[root@localhost ~]#
要为bcache后端磁盘添加缓存盘,在创建缓存盘成功之后,首先需要获取该缓存盘的cset.uuid,通过bcache-super-show命令查看:
[root@localhost ~]# bcache-super-show /dev/sdc
sb.magic ok
sb.first_sector 8 [match]
sb.csum E9D2701DC04A0A13 [match]
sb.version 3 [cache device]
dev.label (empty)
dev.uuid 000771bd-5c58-4713-9fba-23312efb01a8
dev.sectors_per_block 1
dev.sectors_per_bucket 1024
dev.cache.first_sector 1024
dev.cache.cache_sectors 20970496
dev.cache.total_sectors 20971520
dev.cache.ordered yes
dev.cache.discard no
dev.cache.pos 0
dev.cache.replacement 0 [lru]
cset.uuid d0079bae-b749-468b-ad0c-6fedbbc742f4
[root@localhost ~]#
如上命令结果所示,最后一行即为该缓存盘的cset.uuid,只要将此缓存盘的cset.uuid attach到bcache磁盘即可实现添加缓存操作,命令如下:
[root@localhost ~]# echo "d0079bae-b749-468b-ad0c-6fedbbc742f4" >/sys/block/bcache0/bcache/attach
[root@localhost ~]#
操作完成后,可以通过lsblk命令查看结果:
[root@localhost ~]# lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 10G 0 disk
└─bcache0 253:1 0 10G 0 disk /mnt
sdc 8:32 0 10G 0 disk
└─bcache0 253:1 0 10G 0 disk /mnt
[root@localhost ~]#
此时可以看到,sdc下也出现了bcache0设备,即表示缓存添加成功。
要将缓存盘从当前的后端磁盘删除,只需将缓存盘的cset.uuid detach到bcache磁盘即可实现,命令如下:
[root@localhost ~]# echo "d0079bae-b749-468b-ad0c-6fedbbc742f4" >/sys/block/bcache0/bcache/detach
[root@localhost ~]#
操作完成后,可以通过lsblk命令查看结果:
[root@localhost ~]# lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 10G 0 disk
└─bcache0 253:1 0 10G 0 disk /mnt
sdc 8:32 0 10G 0 disk
[root@localhost ~]#
此时可以看到,sdc下的bcache0设备不见了,即表示缓存删除成功。
注销缓存前,请先确保当前缓存盘没有作为缓存使用,即通过lsblk看不到缓存磁盘下面的bcahe设备,如果当前磁盘正在使用,而进行注销操作,可能导致缓存盘的数据不能及时写入后端磁盘,造成数据丢失。 通过缓存盘的cset.uuid,在/sys/fs/bcache/<cset.uuid>/unregister写入1,即可进行注销操作,操作如下:
[root@localhost ~]# echo 1>/sys/fs/bcache/d0079bae-b749-468b-ad0c-6fedbbc742f4/unregister
[root@localhost ~]#
操作完成后,通过ls查看/sys/fs/bcache/d0079bae-b749-468b-ad0c-6fedbbc742f4,如果该目录不存在,则表示注销成功。
停用后端磁盘前,请先确保当前磁盘没有附加缓存盘使用,如果当前磁盘正在使用缓存磁盘而进行操作,可能导致缓存盘的数据不能及时写入后端磁盘,造成数据丢失。
卸载后端磁盘
[root@localhost ~]# umount /dev/bcache0
[root@localhost ~]#
停用缓存磁盘
[root@localhost ~]# echo 1>/sys/block/bcache0/bcache/stop
[root@localhost ~]#
操作完成后,通过lsblk命令查看结果:
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 10G 0 disk
[root@localhost ~]#
此时,sdb设备下并无bcache磁盘,即表示bcache后端磁盘已经停用。
/etc/fstab文件保存着Linux系统启动过程中,使用的挂载配置,文件中的每一行都对应着系统中的一个挂载点,有关fstab文件的说明,在此不做介绍。 要想bcache磁盘在系统重启时,进行自动挂载,需要将配置写入fatab文件中,操作如下:
使用Bcache磁盘,当缓存使用writeback写回策略,在停用后端磁盘或者注销缓存磁盘时,一定要保证缓存盘已经完全从后端磁盘移除,否则可能导致数据丢失,甚至磁盘损坏。在缓存还在工作时,不能将磁盘进行热插拔,这将导致数据异常。
如果使用make-bcache命令出现了如下打印,那就说明当前磁盘已经是bcache磁盘,
[root@localhost ~]# make-bcache -B /dev/sdb
Already a bcache device on /dev/sdb, overwrite with --wipe-bcache
[root@localhost ~]#
加上 --wipe-bcache参数就可以了:make-bcache -B /dev/sdb --wipe-bcache
make-bcache支持快速创建后端磁盘和缓存磁盘,并自动化建立绑定两者的绑定关系,命令如下:
[root@localhost ~]# make-bcache -B /dev/sdb -C /dev/sdc --wipe-bcache
UUID: 8e8da86d-7cda-4e06-b05b-dd7309c33cf6
Set UUID: ff92c353-bfcf-4f51-b2b8-8eb7792d491e
version: 0
nbuckets: 20480
block_size: 1
bucket_size: 1024
nr_in_set: 1
nr_this_dev: 0
first_bucket: 1
UUID: 4df35dfa-00f7-4c27-9838-e6853cdfaf48
Set UUID: ff92c353-bfcf-4f51-b2b8-8eb7792d491e
version: 1
block_size: 1
data_offset: 16
[root@localhost ~]#
通过lsblk命令查看结果:
[root@localhost ~]# lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 10G 0 disk
└─bcache3 253:3 0 10G 0 disk
sdc 8:32 0 10G 0 disk
└─bcache3 253:3 0 10G 0 disk
[root@localhost ~]#
此时,sdc已经作为sdb的缓存盘了,无需再进行添加缓存的操作了。
通常,在操作过程中,由于没有完全的注销缓存或者停用后端磁盘而导致出现:Can't open dev /dev/sd: Device or resource busy错误,此时,只需要找到磁盘所在的节点,缓存盘则注销,后端磁盘则停用即可。
Bcache作为新的缓存方案,给系统运行速度带来了极大地改善,因此,选择Bcache作为缓存是不二之选。