Ubuntu 18.04 在root文件上,系统启用lvmcache
虽然18.04有点老,但是还有再用。且还遇到了问题,所以就写写
1 root文件系统必须是lvm的逻辑卷
具体如何创建lvm逻辑卷,搜一下,应该很容易能找到。所以这里省略了......
2 /boot使用独立分区
/boot分区一般给个500+MiB就差不多够用了。
为什么要这样呢?据说是因grub读不了lvmcache(我没试过,但其他人的说法我信了),
如果不独立分区的话,/boot中的内核、grub、initrd就都在lvmcache上了,
grub无法读取这些数据,引导不了系统。
3 安装必要程序
sudo apt install -y thin-provisioning-tools
4 启用lvmcache
首先保存如下代码:
#!/bin/bash
ssd=$2 # pv 用于作为缓存,存储空间(可以整个磁盘/磁盘分区)
vg=$(basename $(dirname "$3"))
lv=$(basename "$3")
function cache(){
local ssd_size meta_size cache_size
ssd_size=$(pvs ${ssd} --units m|grep -v PSize |awk '{print $5}'|sed 's|\.[0-9]*m||g')
meta_size=$(((${ssd_size}/800)*8))
cache_size=$(( ((${ssd_size}-${meta_size}*2)/8)*8 ))
vgextend ${vg} ${ssd}
#lvcreate -n cache -L ${cache_size}MiB ${vg} ${ssd} && \
#lvcreate -n cachemeta -L ${meta_size}MiB ${vg} ${ssd} && \
#lvconvert --type cache-pool --poolmetadata ${vg}/cachemeta ${vg}/cache && \
#lvconvert --type cache --cachepool ${vg}/cache --cachemode writeback ${vg}/$lv
lvcreate --type cache-pool -n cache -L ${cache_size}MiB ${vg} ${ssd} && \
lvconvert --type cache --cachepool ${vg}/cache --cachemode writeback ${vg}/$lv
}
function vg_name()
{
pvdisplay "$1"|grep 'VG Name'|awk '{print $3}'
}
function uncache()
{
vg0=$(vg_name ${ssd})
test "x${vg0}" = "x${vg}" || {
echo "bad pv"
exit 1
}
lvconvert --uncache ${vg}/$lv && {
lvremove ${vg}/cachemeta
lvremove ${vg}/cache
vgreduce ${vg} ${ssd}
}
}
function usage()
{
echo "$0 [cache | uncache] cache_pv vg/lv"
exit 0
}
( test -z "$1" || test -z "$2" || test -z "$vg" || test "$vg" = "." || test -z "$lv" || test "$lv" = "." ) && usage
lvp=/dev/${vg}/${lv}
test -b ${lvp} || {
echo "$lvp is not exist"
exit 1
}
test -b ${ssd} || {
echo "$ssd is not exist"
exit 2
}
$1
假设代码保存为lvmcache,挂在到root文件系统的lvm逻辑卷为/dev/root/ubuntu,
用于缓存的磁盘分区为/dev/sddX,为/dev/root/ubuntu,启用cache:
bash lvmcache cache /dev/sddX /dev/root/ubuntu
然后一路按'y'就可以了。
5 更新initrd
因为ubuntu 18.04的thin-provisioning-tools程序包,
没自动配置initrd支持lvmcache。所以我们需要手动搞一下,代码如下(copy from 23.10):
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/sbin/pdata_tools
ln -s pdata_tools ${DESTDIR}/usr/sbin/cache_check
ln -s pdata_tools ${DESTDIR}/usr/sbin/thin_check
manual_add_modules dm-cache
manual_add_modules dm-cache-smq
manual_add_modules dm-thin-pool
保存到:/usr/share/initramfs-tools/hooks/thin-provisioning-tools
更新initrd,命令如下:
sudo update-initramfs -k all -u -t
重启系统
如果能够顺利,回归系统,说明root文件系统启用lvmcache成功了。