使用 LVM 创建根文件系统快照

来自 ArchWiki

本文介绍如何在系统启动时设置根文件系统 LVM 快照创建。这些快照可以用于完整系统备份,最大限度地减少停机时间,或用于测试系统更新并可选择回滚。

准备工作

你需要一个使用 LVM 根文件系统和 systemd 的系统。确保 LVM 快照 的先决条件已正确设置。

设置

选项 1:辅助脚本

有一个 AUR 软件包可用,make-lvm-snapshotAUR,它可以帮助自动化以下过程。它实现了与本文中包含的类似的服务和目标文件。项目 README 包含重要的设置信息。

选项 2:手动配置

如果你更喜欢完全“手动”的设置,你将需要编写一个 systemd 服务,以便在系统启动期间创建根卷的干净快照。

创建

/etc/systemd/system/mk-lvm-snapshots.service
[Unit]
Description=make LVM snapshots
Requires=local-fs-pre.target
Wants=local-fs.target
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs-pre.target
Before=local-fs.target

[Install]
WantedBy=make-snapshots.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/lvcreate -L10G -n snap-root -s lvmvolume/root

调整 lvcreate 命令以匹配你的根卷组和卷名。如有必要,调整快照大小。如果应在启动期间快照其他文件系统,你可以使用额外的 lvcreate 命令扩展 ExecStart 属性,并用  ; 分隔(请注意分号前后都有空格,详情请参阅 systemd.service(5) § COMMAND LINES)。

注意: 你应该在运行的系统中测试 lvcreate 命令,直到它按预期工作。使用 lvremove 删除测试快照。从运行系统获取的快照不如在单用户模式或启动期间获取的快照一致。

创建一个新的 systemd 目标

/etc/systemd/system/make-snapshots.target
[Unit]
Description=Make Snapshots
Requires=multi-user.target

如果 multi-user.target 不是你的默认目标,请调整基本目标。如果你想进入桌面环境,你需要将其更改为 graphical.target

启用 mk-lvm-snapshots.service

如果系统使用新目标启动,则 LVM 快照将在挂载本地文件系统后立即创建。要获得启动此目标的 GRUB 菜单项,请基于你的正常启动的 grub.cfg 条目创建 /boot/grub/custom.cfg。内核命令行被扩展为启动新的 make-snapshots.target

### make snapshots ###
menuentry 'Arch GNU/Linux, make snapshots' --class arch --class gnu-linux --class gnu --class os {
...
        echo    'Loading Linux core repo kernel ...'
        linux   /boot/vmlinuz-linux root=/dev/lvmvolume/root ro systemd.unit=make-snapshots.target
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initramfs-linux.img
}

如果 grub.cfg 发生更改,请记住调整 custom.cfg

使用此 grub 条目重启系统后,lvs 应该会显示新创建的快照。

提示: 要获取新服务的消息,请以 root 身份运行 journalctl -u mk-lvm-snapshots.service

用法

备份

要使用此功能进行完整系统备份,请使用快照创建目标重启你的系统。挂载快照卷(以及其他需要的卷),最好使用只读 (-o) 选项。然后备份你的系统,例如使用 tar,如 使用 tar 进行完整系统备份 中所述。

在备份期间,你可以继续正常使用你的系统,因为对常规卷的所有更改在快照中都是不可见的。备份后不要忘记删除快照卷——由于写时复制操作,对常规卷的更改将占用快照中的空间。如果快照空间被完全使用,并且 LVM 无法自动扩展快照,LVM 将拒绝进一步写入你的常规卷或删除快照,这应该避免。

回滚更新

LVM 快照的另一个用途是测试和回滚更新。在这种情况下,为处于已知良好状态的系统创建快照,然后在之后执行更新或更改。

如果你想永久保留更新,只需使用 lvremove 删除快照。如果你想回滚到快照状态,请对快照执行 lvconvert --merge。在下次系统重启期间(使用默认目标),快照将被合并回你的常规卷。快照之后对卷所做的所有更改都将被撤消。

注意: 合并快照后,快照将不再存在。如果需要使用回滚选项进行进一步测试,请重新创建新的快照。