Skip to content
Search RHEL

This page uses Chinese content. Search opens the Chinese documentation.

    Browse this documentation

    RHEL 10 LVM 高级:thin pool、thin snapshot 与 merge 回滚

    This content is not available in your language yet.

    thin provisioning 的核心是“先分配地址空间、按写入量消耗 pool”。thin snapshot 也共享 pool,所以既能快速回滚,也可能因为 pool 满而一起挂。本页在 393 的 2G 测试盘上做一遍 pool → thin volume → snapshot → merge。

    • 环境:PVE 393,RHEL 10.2;
    • 测试盘:/dev/sdb 2G(原 LUKS2 测试盘,已 wipefs);
    • 结果:VG vgtest 2G,thin pool 1G,thinvol 512M;
    • 测试后已清理。

    E3 记录:plans/content-expansion/evidence/rhel/rhel-lvm-advanced/run.json(5 步,含 lvs/snapshot/merge 输出 sha256)。

    • lvcreate --type thin-pool 建的是 pool,lvs -a 里会多出 pool_tdata、pool_tmeta;
    • lvcreate -V 512M --thin -n thinvol vgtest/pool 才是给文件系统用的 thin volume;
    • data_percent 是 pool 的实际占用,不是 thinvol 的 512M;
    • snapshot 也放在同一个 pool,pool 满会影响 origin。
    Terminal window
    sudo wipefs -a /dev/sdb
    sudo pvcreate /dev/sdb
    sudo vgcreate vgtest /dev/sdb
    sudo lvcreate --type thin-pool -L 1G -n pool vgtest
    sudo lvs -a vgtest
    LV VG LSize Pool Origin Data%
    [lvol0_pmspare] vgtest 4.00m
    pool vgtest 1.00g 6.29
    [pool_tdata] vgtest 1.00g
    [pool_tmeta] vgtest 4.00m

    pool 里已经有 6.29% 的元数据/初始占用。

    Terminal window
    sudo lvcreate -V 512M --thin -n thinvol vgtest/pool
    sudo mkfs.xfs /dev/vgtest/thinvol
    sudo mkdir -p /mnt/thin
    sudo mount /dev/vgtest/thinvol /mnt/thin
    echo v1 | sudo tee /mnt/thin/file
    $ df -h /mnt/thin
    /dev/mapper/vgtest-thinvol 448M 35M 414M 8% /mnt/thin

    512M 的 thinvol 格式化后可用 448M;lvs 的 data_percent 升到 12.59。

    Terminal window
    sudo lvcreate -s -n snap /dev/vgtest/thinvol
    echo v2 | sudo tee -a /mnt/thin/file
    sudo lvs -a -o lv_name,vg_name,lv_size,pool_lv,origin,data_percent vgtest
    thinvol vgtest 512.00m pool 12.59
    snap vgtest 512.00m pool thinvol 12.59

    此时 origin 是 v2,snapshot 保留 v1。

    Terminal window
    sudo umount /mnt/thin
    sudo lvconvert --merge vgtest/snap
    sudo mount /dev/vgtest/thinvol /mnt/thin
    cat /mnt/thin/file
    # v1

    --merge 把 snapshot 的内容合并回 origin,然后删除 snapshot;合并后 lvs 只剩 pool/thinvol。

    Terminal window
    sudo umount /mnt/thin
    sudo lvremove -f vgtest
    sudo vgremove -f vgtest
    sudo pvremove /dev/sdb
    sudo wipefs -a /dev/sdb
    sudo vgs vgtest # not found

    顺序不能反:先删 LV,再删 VG,最后删 PV。

    • pool 大小与 data_percent 监控;
    • thinvol 的虚拟大小 ≠ 实际占用;
    • snapshot 与 origin 同 pool;
    • merge 前确认回滚点;
    • 清理按 LV→VG→PV 顺序;
    • pool 满告警(data_percent/metadata_percent)。
    • 未测试 pool 满导致的 I/O error;
    • 未测试 thin pool 的 autoextend;
    • 未测试 cache/RAID 类型;
    • 未测试在线 merge(本次先 umount)。

    以下截图来自 PVE 上的 RHEL 10.2 实测环境。

    LVM 逻辑卷视图(lvs)
    LVM 逻辑卷视图(lvs)
    根分区与块设备(df/lsblk)
    根分区与块设备(df/lsblk)