跳转到内容
搜索 AlmaLinux 文档

    浏览当前文档目录

    AlmaLinux 10:用 LVM 快照做升级回滚

    在 AlmaLinux 10.2 虚拟机(内核 6.12.0-211.64.1.el10_2,LVM 2.03.36)中实测完整流程:建 LV、写文件、冻结打快照、只读挂载核对、删除文件、merge 回滚、重新挂载验证。日志:plans/content-expansion/evidence/logs/alma-lvm-snapshot.log。

    升级前打快照,出事时 lvconvert --merge 回滚——但前提是快照本身一致。挂载中的文件系统直接打快照,可能拍到「日志未落盘」的中间状态,回滚后文件系统反而损坏。

    所以顺序是:冻结 → 打快照 → 解冻 → 升级。

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

    -L 300M 是 COW 空间:源卷写入越多,快照消耗越快;写满后快照失效(lvs 会显示 Data% 100)。升级类操作要留足够余量,或升级期间不写业务数据。

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

    nouuid 解决同 UUID 无法同时挂载的问题;ro 保证不会往快照里写。升级前用这一步确认「快照里确实是当前状态」。

    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%

    实测:只 lvchange -ay 后 mount 会报 already mounted or mount point busy;必须 -an 再 -ay(完整去激活/再激活)。这一步把「merge 完成」和「卷可挂载」区分开。

    AlmaLinux 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

    快照后的写入(b.txt)消失,快照时的文件(a.txt)恢复。回滚验证必须看到这个结果,不能只信 merge 百分比。

    1. 卸载业务挂载或停止写入(数据库用 fsfreeze 或停库);
    2. fsfreeze -f → lvcreate -s → fsfreeze -u;
    3. mount -o ro,nouuid 核对快照内容;
    4. 执行升级(dnf upgrade);
    5. 失败则 umount → lvconvert --merge → lvchange -an/-ay → 挂载校验;
    6. 成功后 lvremove 快照,释放 COW 空间。

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

    LVM 快照与 merge 回滚(AlmaLinux 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
    命令与输出均为真实执行结果;仅当点击播放时才加载播放器脚本。
    • COW 空间不足:升级期间大量写入把 300M 用满,快照失效;
    • 忘了 fsfreeze:快照回滚后文件系统不一致;
    • merge 后直接 mount:EBUSY,先 -an 再 -ay;
    • 快照留着不删:长期占用空间并拖慢源卷写性能。

    练习:模拟一次「升级失败回滚」

    Section titled “练习:模拟一次「升级失败回滚」”
    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 good | sudo tee /mnt/data/app.conf >/dev/null && sync
    sudo fsfreeze -f /mnt/data && sudo lvcreate -y -s -L 300M -n snap /dev/vglab/data && sudo fsfreeze -u /mnt/data
    echo broken | sudo tee /mnt/data/app.conf >/dev/null # 模拟升级写坏配置
    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/app.conf

    检查:

    1. lvs 中快照 Data% 很小(说明 COW 空间充足)
    2. 回滚后 app.conf 内容恢复为 good
    3. mount -o ro,nouuid 能读到快照内 good
    4. 清理后 vgs 不再有 vglab

    常见问题

    快照空间要留多少?

    至少覆盖升级期间的写入量。COW 空间写满后快照失效(Data% 到 100),回滚就不可用了;保守做法是按源卷已用空间的 20–30% 起步。

    为什么 merge 后要 lvchange -an 再 -ay?

    实测 merge 完成后设备状态没完全就绪,直接挂载报 EBUSY;完整去激活再激活会重新建立设备映射,之后挂载正常。

    快照能当备份吗?

    不能。快照与原卷在同一存储上,盘坏了一起丢;它只适合做升级/变更前的短期回滚点。