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成功了。

标签: none

添加新评论