掉lvm cache坑了!---更新(启用ssd缓存后的lvm、重启后无法进入系统的问题规避)
问题背景
今天刚试着将原来的hyper-V NAS虚拟机转到ESXi新机器,启用一块闲置的500G NVMe固态硬盘。考虑到NAS中用的大容量硬盘都是机械盘,而且为了降低噪音,选的都是低转速的。
因此想着把这块不大不小的NVMe固态用起来。网上一搜,就看到LVM + SSD Cache的文章,其中这篇比较常见:https://www.cnblogs.com/jfLin/p/9542812.html
但是我觉得这篇讲得更好:https://man.archlinux.org/man/lvmcache.7
问题经过
有了文档知道,根据上面第二篇文档,做了以下实验:
现在情况是:已经有lvm卷,其中卷组(vg)名为 nas, 逻辑卷(lv)名为data,NVME硬盘在/dev/nvme0n1,目的是给 nas/data这个LV增加一个SSD Cache。
步骤1、SSD Cache,要求SSD所在LV和原数据LV在同一个卷组(VG中),所以第一步,需要将给SSD盘(或者分区)创建物理卷(PV):
pvcreate /dev/nvme0n1
步骤2、将PV加入数据LV同一个卷组:
vgextend nas /dev/nvme0n1
步骤3、考虑到lvm的cache有两种方法:一种是dm-cache(对常用的读、写数据都做缓存),另一种是dm-writecache(只对待写入的数据进行缓存)。为了节省SSD写入,我决定采用dm-writecache方式。
其中又对应着两种缓存卷的模式:cachepool(缓存池)、cachevol(缓存卷),其中缓存池只用于dm-cache,而缓存卷(cachevol)可用于dm-cache或者dm-writecache。
所以,我将ssd LV卷格创建为cachevol:
首先,要将目标数据LV(准备加载ssd缓存卷的LV)停用:
命令格式如下:lvchange --activate n
lvchange --activate n nas/data
然后,创建缓存卷,命令格式如下:
lvcreate --activate n --size
我在使用的时候,用了自己习惯的-n , -L 参数,注意在创建的时候,需要加入 --activate n(创建后不激活逻辑卷)
lvcreate --activate n -n datacache -L 256G nas /dev/nvme0n1
接下来,将缓存卷挂到数据卷上去,命令格式如下:
lvconvert --type writecache --cachevol
lvconvert --type writecache --cachevol datacache nas/data
最后,激活数据卷,命令格式如下:
lvchange --activate y <vg/main-lv>
lvchange --activate y nas/data
问题来了
在完成上述操作之后,当时数据卷看起来是可以正常访问的。但是,reboot机器后,就卡在了加载带缓存的数据卷那里。
解决办法
既然卡在了加载带缓存的数据卷那里,那就在启动的时候不挂载带缓存的 nas01/data 数据卷、待系统启动完成后,再挂载。
第一步、将/etc/fstab中挂载待缓存的数据卷的挂载语句注释掉;
第二步、在 /etc/rc.local 中,添加下面两行:
lvchange --activate y nas/data
mount -t xfs /dev/mapper/nas-data /nas
重启验证:能够正常进入系统、正常挂载带缓存的数据卷。
=== 【以下步骤是历史操作,供参考,主要是带有一些创建cachepool的操作命令,如果使用dm-cache模式,可能有用】===
步骤3、为SSD硬盘(或分区)创建名为datacache的Cache LV池(自动包含cache、metadata):
lvcreate --type cache-pool -L 256G -n datacache nas /dev/nvme0n1
该命令,直接指定了数据大小(-L 256G),同时它会自动分配metadata的空间,不需要人工划分大小,非常方便!
步骤4、将Cache LV池转换为Cache(相当于绑定、激活Cache):
lvconvert --type cache --cachemode writethrough --cachepool datacache nas/data
上面的命令,用--cachemode 选项可以指定Cache的模式:writethrough或者writeback。
敲完命令一切正常,也提示Cache成功!
最后坑爹的一环出现了——重启系统后,系统挂了——启动过程中,加载了Cache的LVM都没有正常挂载,导致系统无法正常启动。网上有说修改grub和boot分区的,嫌麻烦,不想折腾了。
所以最后拆了cache LV池
lvconvert --uncache nas/data
关于修改后影响启动,这里有grub的官方说明:https://www.gnu.org/software/grub/manual/grub/html_node/LVM-cache-booting.html
===== 以上供参考 =====