67.8. 逻辑卷的快照
使用 LVM 快照功能,您可以在特定时刻创建卷(例如 /dev/sda)的虚拟镜像,而不会导致服务中断。
67.8.1. 快照卷的概述
当您制作快照后修改原始卷(源头)时,快照功能会对修改的数据区域创建一个副本来作为更改前的状态,以便可以重建卷的状态。当您创建快照时,需要对原始卷有完全的读写权限。
因为快照只复制创建快照后更改的数据区域,因此快照功能只需要少量的存储。例如,对于很少更新的原始卷,原始容量的 3-5% 就足以进行快照维护。它不提供备份过程的替代品。快照副本是虚拟副本,不是实际的介质备份。
快照的大小控制为存储原始卷的更改而预留的空间量。例如:如果您创建了一个快照,然后完全覆盖了原始卷,则快照应至少与原始卷大小一样方可保存更改。您应该定期监控快照的大小。例如:一个以读为主的短期快照(如 /usr
)需要的空间小于卷的长期快照,因为它包含很多写入,如 /home
。
如果快照满了,则快照就会失效,因为它无法跟踪原始卷的变化。但是,您可以将 LVM 配置为每当使用量超过 snapshot_autoextend_threshold
值时就自动扩展快照,以免快照失效。快照是完全可调整大小的,您可以执行以下操作:
- 如果您有存储容量,您可以增加快照卷的大小,以防止其被删除。
- 如果快照卷大于您的需要,您可以缩小卷的大小来释放空间,以供其他逻辑卷使用。
快照卷提供以下优点:
- 大多数情况下,当需要对逻辑卷执行备份时制作快照,而不用停止持续更新数据的活动系统。
-
您可以在快照文件系统上执行
fsck
命令来检查文件系统的完整性,并确定原始文件系统是否需要文件系统修复。 - 由于快照是读/写的,因此您可以通过制作快照并对快照运行测试来对生产数据测试应用程序,而无需接触真实数据。
- 您可以创建 LVM 卷来用于 Red Hat Virtualization 。您可以使用 LVM 快照来创建虚拟客户端镜像的快照。这些快照可方便修改现有客户虚拟机或者使用最小附加存储创建新客户虚拟机。
67.8.2. 创建写时复制快照
创建后,写时复制(COW)快照不包含任何数据。相反,它会在创建快照时引用原始卷的数据块。当原始卷中的数据更改时,COW 系统会在进行更改前将原始数据复制到快照。这样,快照的大小仅随着更改而增长,在创建快照时存储原始卷的状态。通过最小数据更改,COW 快照对于短期备份和情况效率更高,提供了一种空间节约的方法来捕获并恢复到特定时间点。当您创建 COW 快照时,根据原始卷的预期更改来分配足够的存储。
在创建快照前,务必要考虑存储要求和快照的预期期限。快照的大小应该足以捕获其预期生命周期期间的更改,但它不能超过原始 LV 的大小。如果您期望更改率较低,则较小的快照大小为 10%-15%。对于具有高变化率的 LV,您可能需要分配 30% 或更多。
定期监控快照的存储使用情况非常重要。如果快照达到其分配的空间 100%,它将无效。您可以使用 lvs
命令显示快照的信息。
必须在填写快照之前扩展快照。这可以通过使用 lvextend
命令手动完成此操作。或者,您可以通过在 /etc/lvm/lvm.conf
文件中设置 snapshot_autoextend_threshold
和 snapshot_autoextend_percent
参数来设置自动扩展。此配置允许 dmeventd
在用量达到定义的阈值时自动扩展快照。
COW 快照允许您访问文件系统在创建快照时的只读版本。这可启用备份或数据分析,而不中断原始文件系统上的持续操作。虽然挂载并使用了快照,但原始逻辑卷及其文件系统可以继续更新和正常使用。
以下流程概述了如何从卷组 vg001 创建名为 origin 的逻辑卷,然后创建名为 snap 的快照。
先决条件
- 管理访问权限.
- 您已创建了一个卷组。如需更多信息,请参阅创建 LVM 卷组。
流程
从卷组 vg001 创建一个名为 origin 的逻辑卷:
# lvcreate -L 1G -n origin vg001
创建名为 snap 的快照 /dev/vg001/origin LV,大小为 100 MB :
# lvcreate --size 100M --name snap --snapshot /dev/vg001/origin
显示原始卷以及当前使用的快照卷的百分比:
# lvs -a -o +devices LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices origin vg001 owi-a-s--- 1.00g /dev/sde1(0) snap vg001 swi-a-s--- 100.00m origin 0.00 /dev/sde1(256)
其它资源
-
系统中
lvcreate (8)
,lvextend (8)
, 和lvs (8)
man page -
/etc/lvm/lvm.conf
文件
67.8.3. 将快照合并到其原始卷中
使用 lvconvert
命令和 --merge
选项,将快照合并到其原始(源头)卷中。如果您丢失了数据或文件,您可以执行系统回滚,否则的话需要将系统恢复到之前的状态。合并快照卷后,得到的逻辑卷具有原始卷的名称、次要号码和 UUID。在合并过程中,对原始卷的读取和写入将会被指向要合并的快照。当合并完成后,会删除合并的快照。
如果原始卷和快照卷都没有打开且处于活跃状态,则合并会立即开始。否则,合并会在原始卷或快照激活后,或两者都关闭后开始。您可以在原始卷激活后,将快照合并到一个不能关闭的原始卷中,如 root
文件系统。
流程
合并快照卷。以下命令将快照卷 vg001/snap 合并到其 origin 中:
# lvconvert --merge vg001/snap Merging of volume vg001/snap started. vg001/origin: Merged: 100.00%
查看原始卷:
# lvs -a -o +devices LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices origin vg001 owi-a-s--- 1.00g /dev/sde1(0)
其它资源
-
系统上的
lvconvert (8)
手册页
67.8.4. 使用快照 RHEL 系统角色创建 LVM 快照
使用新的 snapshot
RHEL 系统角色,您现在可以创建 LVM 快照。此系统角色还可以通过将 snapshot_lvm_action
参数设置为 check
,来检查是否有足够空间用于创建的快照,且与其名称没有冲突。要挂载创建的快照,请将 snapshot_lvm_action
设置为 mount
。
在以下示例中,设置了 nouuid
选项,且仅在使用 XFS 文件系统时才需要此选项。XFS 不支持使用相同的 UUID 同时挂载多个文件系统。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Run the snapshot system role hosts: managed-node-01.example.com vars: snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 percent_space_required: 25 mountpoint: /data1_snapshot options: nouuid mountpoint_create: true - name: data2 snapshot vg: data_vg lv: data2 percent_space_required: 25 mountpoint: /data2_snapshot options: nouuid mountpoint_create: true tasks: - name: Create a snapshot set ansible.builtin.include_role: name: rhel-system-roles.snapshot vars: snapshot_lvm_action: snapshot - name: Verify the set of snapshots for the LVs ansible.builtin.include_role: name: rhel-system-roles.snapshot vars: snapshot_lvm_action: check snapshot_lvm_verify_only: true - name: Mount the snapshot set ansible.builtin.include_role: name: rhel-system-roles.snapshot vars: snapshot_lvm_action: mount
这里,
snapshot_lvm_set
参数描述了同一卷组中特定的逻辑卷(LV)。您还可以在设置此参数时指定不同 VG 种的 LV。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在受管节点上,查看创建的快照:
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data1 data_vg owi-a-s--- 1.00g data1_snapset1 data_vg swi-a-s--- 208.00m data1 0.00 data2 data_vg owi-a-s--- 1.00g data2_snapset1 data_vg swi-a-s--- 208.00m data2 0.00
在受管节点上,通过检查 /data1_snapshot 和 /data2_snapshot 是否存在,来验证挂载操作是否成功:
# ls -al /data1_snapshot # ls -al /data2_snapshot
其它资源
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
文件 -
/usr/share/doc/rhel-system-roles/snapshot/
目录
67.8.5. 使用 snapshot RHEL 系统角色卸载 LVM 快照
您可以通过将 snapshot_lvm_action
参数设置为 umount
来卸载特定的快照或所有快照。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已使用名称 <_snapset1_> 为一组快照创建了快照。
-
您已通过将
snapshot_lvm_action
设置为mount
挂载了快照,或手动挂载了它们。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:卸载特定的 LVM 快照:
--- - name: Unmount the snapshot specified by the snapset hosts: managed-node-01.example.com vars: snapshot_lvm_snapset_name: snapset1 snapshot_lvm_action: umount snapshot_lvm_vg: data_vg snapshot_lvm_lv: data2 snapshot_lvm_mountpoint: /data2_snapshot roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_lv
参数描述了特定的逻辑卷(LV),snapshot_lvm_vg
参数描述了特定的卷组(VG)。卸载一组 LVM 快照:
--- - name: Unmount a set of snapshots hosts: managed-node-01.example.com vars: snapshot_lvm_action: umount snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 mountpoint: /data1_snapshot - name: data2 snapshot vg: data_vg lv: data2 mountpoint: /data2_snapshot roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_set
参数描述了同一 VG 中的特定 LV。您还可以在设置此参数时指定不同 VG 种的 LV。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
其它资源
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
文件 -
/usr/share/doc/rhel-system-roles/snapshot/
目录
67.8.6. 使用 snapshot RHEL 系统角色扩展 LVM 快照
使用新的 snapshot
RHEL 系统角色,您现在可以通过将 snapshot_lvm_action
参数设置为 extend
来扩展 LVM 快照。您可以将 snapshot_lvm_percent_space_required
参数设置为扩展快照后应该分配给快照的所需空间。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已为给定的卷组和逻辑卷创建了快照。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:通过为
percent_space_required
参数指定值来扩展所有 LVM 快照:--- - name: Extend all snapshots hosts: managed-node-01.example.com vars: snapshot_lvm_action: extend snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 percent_space_required: 40 - name: data2 snapshot vg: data_vg lv: data2 percent_space_required: 40 roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_set
参数描述了同一 VG 中的特定 LV。您还可以在设置此参数时指定不同 VG 种的 LV。通过为集合中每对 VG 和 LV 的
percent_space_required
设置不同的值来扩展 LVM 快照:--- - name: Extend the snapshot hosts: managed-node-01.example.com vars: snapshot_extend_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 percent_space_required: 30 - name: data2 snapshot vg: data_vg lv: data2 percent_space_required: 40 tasks: - name: Extend data1 to 30% and data2 to 40% vars: snapshot_lvm_set: "{{ snapshot_extend_set }}" snapshot_lvm_action: extend ansible.builtin.include_role: name: rhel-system-roles.snapshot
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
在受管节点上,查看快照是否扩展了 30% :
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data1 data_vg owi-a-s--- 1.00g data1_snapset1 data_vg swi-a-s--- 308.00m data1 0.00 data2 data_vg owi-a-s--- 1.00g data2_snapset1 data_vg1 swi-a-s--- 408.00m data2 0.00
其它资源
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
文件 -
/usr/share/doc/rhel-system-roles/snapshot/
目录
67.8.7. 使用 snapshot RHEL 系统角色恢复 LVM 快照
使用新的 snapshot
RHEL 系统角色,现在您可以通过将 snapshot_lvm_action
参数设置为 revert
,将 LVM 快照恢复回其原始卷。
如果逻辑卷和快照卷都不是打开和活动的,则恢复操作立即开始。否则,它会在原始卷或快照都激活或两者都关闭后开始。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已使用 <_snapset1_> 作为 snapset 名称,为给定卷组和逻辑卷创建了快照。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:将特定的 LVM 快照恢复到其原始卷:
--- - name: Revert a snapshot to its original volume hosts: managed-node-01.example.com vars: snapshot_lvm_snapset_name: snapset1 snapshot_lvm_action: revert snapshot_lvm_vg: data_vg snapshot_lvm_lv: data2 roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_lv
参数描述了特定的逻辑卷(LV),snapshot_lvm_vg
参数描述了特定的卷组(VG)。将一组 LVM 快照恢复到其原始卷:
--- - name: Revert a set of snapshot hosts: managed-node-01.example.com vars: snapshot_lvm_action: revert snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 - name: data2 snapshot vg: data_vg lv: data2 roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_set
参数描述了同一 VG 中的特定 LV。您还可以在设置此参数时指定不同 VG 种的 LV。注意revert
操作可能需要一些时间才能完成。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
重启主机,或使用以下步骤停止并重新激活逻辑卷:
$ umount /data1; umount /data2 $ lvchange -an data_vg/data1 data_vg/data2 $ lvchange -ay data_vg/data1 data_vg/data2 $ mount /data1; mount /data2
验证
在受管节点上,查看恢复的快照:
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data1 data_vg -wi-a----- 1.00g data2 data_vg -wi-a----- 1.00g
其它资源
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
文件 -
/usr/share/doc/rhel-system-roles/snapshot/
目录
67.8.8. 使用 snapshot RHEL 系统角色删除 LVM 快照
使用新的 snapshot
RHEL 系统角色,您现在可以通过指定快照的前缀或模式,并将 snapshot_lvm_action
参数设置为 remove
,来删除所有 LVM 快照。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 您已使用 <_snapset1_> 作为快照名称创建了指定的快照。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:删除特定的 LVM 快照:
--- - name: Remove a snapshot hosts: managed-node-01.example.com vars: snapshot_lvm_snapset_name: snapset1 snapshot_lvm_action: remove snapshot_lvm_vg: data_vg roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_vg
参数描述了卷组中的特定逻辑卷(LV)。删除一组 LVM 快照:
--- - name: Remove a set of snapshots hosts: managed-node-01.example.com vars: snapshot_lvm_action: remove snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 - name: data2 snapshot vg: data_vg lv: data2 roles: - rhel-system-roles.snapshot
这里,
snapshot_lvm_set
参数描述了同一 VG 中的特定 LV。您还可以在设置此参数时指定不同 VG 种的 LV。
验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
其它资源
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
文件 -
/usr/share/doc/rhel-system-roles/snapshot/
目录