我正在尝试模拟存储系统的计划升级。为此,我在虚拟机中使用较小的磁盘重新创建了设置。
准备
起点是具有 raid5 的 LV、跨 3 个 PV 的 2 个条带以及单个 PV 上的缓存,设置如下:
pvcreate /dev/sdd /dev/sde /dev/sdf vgcreate vg01 /dev/sdd /dev/sde /dev/sdf lvcreate -n origin_lv -l 8180 -i 2 --type raid5 vg01 \ /dev/sdd /dev/sde /dev/sdf
这会导致 VG 具有 raid5,分布在 3 个设备上。然后我执行了以下操作来创建缓存卷:
pvcreate /dev/sdc1
vgextend vg01 /dev/sdc1
lvcreate -n origin_lv_cache -L 10G vg01 /dev/sdc1
pvcreate /dev/sdc2
vgextend vg01 /dev/sdc2
lvcreate -n origin_lv_cache_meta -L 1G vg01 /dev/sdc2
创建缓存池:
lvconvert \
--type cache-pool \
--poolmetadata vg01/origin_lv_cache_meta \
vg01/origin_lv_cache
并将其附加到原点 LV:
lvconvert \
--type cache \
--cachepool vg01/origin_lv_cache \
vg01/origin_lv
>>>> output: "Logical volume vg01/origin_lv is now cached"
然后我执行 luksFormat 和 mkfs,得到一个完美可挂载的文件系统。
问题
现在,我想增加容量。为此,我尝试了以下方法:
lvconvert --splitcache vg01/origin_lv
删除缓存。这会将缓存中的所有内容同步到实际 LV,然后我可以执行以下操作:
pvcreate /dev/sdg
vgextend vg01 /dev/sdg
添加新的 PV,然后:
lvconvert --stripes 3 vg01/origin_lv [所有以前的设备] [新设备]
正如预期的那样,这会导致 LV 的空间增加 50%。现在我尝试重新连接缓存,甚至删除缓存卷并重新创建它们,但是当我尝试将其重新连接到实际 LV 时,我得到了以下信息:
lvconvert \
--type cache-pool \
--poolmetadata vg01/origin_lv_cache_meta \
vg01/origin_lv_cache
输出:
Do you want wipe existing metadata of cache pool vg01/origin_lv_cache? [y/n]: y
LV origin_lv, segment 1 invalid: reshape for cache segment.
Internal error: LV segments corrupted in origin_lv.
但是,我可以正常挂载和读取/写入底层 LV,只是无法重新连接缓存。
知道我这里缺少什么吗?
答案1
事实证明,fsresize 无法感知底层同步状态。使用 lvs 检查同步状态并等待 100% 同步,然后调整大小即可正常工作。