跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    Rocky 10:LVM 快照与 merge 回滚(真机实测)

    在 Rocky Linux 10.2 虚拟机(内核 6.12.0-211.16.1.el10_2,LVM 2.03.36)中实测:loop 盘建 PV/VG/LV、XFS、fsfreeze + lvcreate -s、mount -o ro,nouuid 读快照、lvconvert --merge 回滚、重新挂载校验。日志:plans/content-expansion/evidence/logs/rocky-lvm-snapshot.log。

    这是真实 EL10 内核的虚拟机,不是共享宿主内核的容器;快照相关的内核行为(dm-snapshot)在此可信。

    Terminal window
    sudo fsfreeze -f /mnt/data
    sudo lvcreate -y -s -L 300M -n snap /dev/vglab/data
    sudo fsfreeze -u /mnt/data

    XFS 是写时一致性文件系统:挂载状态下直接打快照,可能把「元数据已改、数据未落盘」的中间态拍进去,快照里的文件系统就不一致。fsfreeze -f 把挂起写操作、刷盘,-u 再解冻。

    不加 fsfreeze 的后果不是必然失败,而是「快照可能不可用」——比报错更危险。

    Terminal window
    sudo mount -o ro,nouuid /dev/vglab/snap /mnt/snap
    ls /mnt/snap
    cat /mnt/snap/a.txt
    a.txt
    before-snapshot

    快照与源卷的 XFS UUID 相同,内核默认拒绝同时挂载两个同 UUID 的文件系统;nouuid 跳过这个检查。只读挂载还避免快照被写入。

    改数据:验证「快照冻结在那一刻」

    Section titled “改数据:验证「快照冻结在那一刻」”
    Terminal window
    echo "after-snapshot-change" > /mnt/data/b.txt
    rm -f /mnt/data/a.txt
    ls /mnt/data
    b.txt

    源卷变成只有 b.txt;而快照里仍是 a.txt 且内容是 before-snapshot——两边是不同时间点。

    Terminal window
    sudo umount /mnt/data
    sudo lvconvert --merge /dev/vglab/snap
    sudo lvchange -an vglab/data
    sudo lvchange -ay vglab/data
    Merging of volume vglab/snap started.
    vglab/data: Merged: 100.00%

    merge 报 100% 不代表能立刻挂载。实测只做 lvchange -ay 直接 mount 会得到:

    mount: /mnt/data: /dev/mapper/vglab-data already mounted or mount point busy.

    先 lvchange -an 再 -ay(完整去激活/再激活)之后挂载才成功。这是本页最有价值的一条——Merged: 100.00% 会让人误以为已经好了。

    Rocky Linux 10.2:快照内 before、merge 100%、回滚后 before

    Terminal window
    sudo mount /dev/vglab/data /mnt/data
    ls /mnt/data
    cat /mnt/data/a.txt
    ls /mnt/data/b.txt
    a.txt
    before-snapshot
    ls: cannot access '/mnt/data/b.txt': No such file or directory

    a.txt 回来了、b.txt 消失了——快照时间点之后的所有写入都被回滚。必须做这一步,只看 merge 百分比不算验证。

    下面这段终端录制把「建卷 → freeze → 打快照 → 改数据 → 读快照 → merge → 重新激活 → 校验」一次放完(.cast 只有 871 字节,默认不自动播放):

    LVM 快照与 merge 回滚(Rocky Linux 10.2)
    文字版(命令与输出) / Text transcript
    # 1. build a loop-backed LV for the lab
    truncate -s 1G /var/tmp/cast.img
    pvcreate -y "$L"; vgcreate vglab "$L"; lvcreate -y -L 800M -n data vglab
    mkfs.xfs -q /dev/vglab/data; mount /dev/vglab/data /mnt/data
    echo before > /mnt/data/a.txt
    # 2. freeze, snapshot, unfreeze
    fsfreeze -f /mnt/data
    lvcreate -y -s -L 200M -n snap /dev/vglab/data
    fsfreeze -u /mnt/data
    LV LSize Attr
    data 800.00m owi-aos---
    snap 200.00m swi-a-s---
    # 3. change the origin, then read the snapshot
    echo after > /mnt/data/b.txt; rm -f /mnt/data/a.txt
    mount -o ro,nouuid /dev/vglab/snap /mnt/snap
    cat /mnt/snap/a.txt # before
    # 4. merge back and reactivate
    lvconvert --merge /dev/vglab/snap
    vglab/data: Merged: 100.00%
    lvchange -an vglab/data; lvchange -ay vglab/data
    # 5. verify the rollback
    cat /mnt/data/a.txt # before
    命令与输出均为真实执行结果;仅当点击播放时才加载播放器脚本。
    • 不 fsfreeze:快照可能不一致,恢复时才发现;
    • 挂快照不加 nouuid:报 UUID 冲突;
    • merge 后直接 mount:EBUSY,先 lvchange -an && -ay;
    • merge 前没卸载:lvconvert --merge 要求源卷未挂载。
    Terminal window
    sudo dnf install -y lvm2 xfsprogs
    truncate -s 2G /var/tmp/snap.img
    L=$(sudo losetup -f --show /var/tmp/snap.img)
    sudo pvcreate -y "$L" && sudo vgcreate vglab "$L"
    sudo lvcreate -y -L 1G -n data vglab
    sudo mkfs.xfs -q /dev/vglab/data
    sudo mkdir -p /mnt/data /mnt/snap && sudo mount /dev/vglab/data /mnt/data
    echo before | sudo tee /mnt/data/a.txt >/dev/null && sync
    sudo fsfreeze -f /mnt/data
    sudo lvcreate -y -s -L 300M -n snap /dev/vglab/data
    sudo fsfreeze -u /mnt/data
    sudo rm /mnt/data/a.txt
    sudo umount /mnt/data && sudo lvconvert --merge /dev/vglab/snap
    sudo lvchange -an vglab/data && sudo lvchange -ay vglab/data
    sudo mount /dev/vglab/data /mnt/data && cat /mnt/data/a.txt

    检查:

    1. lvs -o lv_attr 里快照属性以 s 开头
    2. mount -o ro,nouuid 能读到 before
    3. merge 输出 Merged: 100.00%
    4. 回滚后 cat /mnt/data/a.txt 输出 before

    常见问题

    快照一定要 fsfreeze 吗?

    对 XFS/ext4 这类日志文件系统,挂载状态下打快照必须冻结才能保证一致;不冻结的快照可能能挂载但数据不一致,恢复时才暴露问题。

    为什么挂快照要加 nouuid?

    快照复制了源文件系统的 UUID,内核默认不允许两个同 UUID 的 XFS 同时挂载;nouuid 跳过该检查,配合 ro 只读使用。

    merge 报 100% 后挂载 EBUSY 怎么办?

    做一次完整去激活/再激活:lvchange -an vglab/data && lvchange -ay vglab/data,再 mount;只 -ay 不够(实测)。