问题背景

今天刚试着将原来的hyper-V NAS虚拟机转到ESXi新机器,启用一块闲置的500G NVMe固态硬盘。考虑到NAS中用的大容量硬盘都是机械盘,而且为了降低噪音,选的都是低转速的。

因此想着把这块不大不小的NVMe固态用起来。网上一搜,就看到LVM + SSD Cache的文章,其中这篇比较常见:


问题经过

有了文档知道,根据上面第二篇文档,做了以下实验:

现在情况是:已经有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 </dev/fast-pv>

我在使用的时候,用了自己习惯的-n , -L 参数,注意在创建的时候,需要加入 --activate n(创建后不激活逻辑卷)

lvcreate --activate n -n datacache -L 256G nas /dev/nvme0n1

接下来,将缓存卷挂到数据卷上去,命令格式如下:

lvconvert --type writecache --cachevol <vg/main-lv>

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


===== 以上供参考 =====