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_thresholdsnapshot_autoextend_percent 参数来设置自动扩展。此配置允许 dmeventd 在用量达到定义的阈值时自动扩展快照。

COW 快照允许您访问文件系统在创建快照时的只读版本。这可启用备份或数据分析,而不中断原始文件系统上的持续操作。虽然挂载并使用了快照,但原始逻辑卷及其文件系统可以继续更新和正常使用。

以下流程概述了如何从卷组 vg001 创建名为 origin 的逻辑卷,然后创建名为 snap 的快照。

先决条件

  • 管理访问权限.
  • 您已创建了一个卷组。如需更多信息,请参阅创建 LVM 卷组

流程

  1. 从卷组 vg001 创建一个名为 origin 的逻辑卷:

    # lvcreate -L 1G -n origin vg001
  2. 创建名为 snap 的快照 /dev/vg001/origin LV,大小为 100 MB

    # lvcreate --size 100M --name snap --snapshot /dev/vg001/origin
  3. 显示原始卷以及当前使用的快照卷的百分比:

    # 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 文件系统。

流程

  1. 合并快照卷。以下命令将快照卷 vg001/snap 合并到其 origin 中:

    # lvconvert --merge vg001/snap
    Merging of volume vg001/snap started.
      vg001/origin: Merged: 100.00%
  2. 查看原始卷:

    # 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 同时挂载多个文件系统。

先决条件

流程

  1. 创建一个包含以下内容的 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。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 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 挂载了快照,或手动挂载了它们。

流程

  1. 创建一个包含以下内容的 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。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 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 权限。
  • 您已为给定的卷组和逻辑卷创建了快照。

流程

  1. 创建一个包含以下内容的 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
  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 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 名称,为给定卷组和逻辑卷创建了快照。

流程

  1. 创建一个包含以下内容的 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 操作可能需要一些时间才能完成。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
  4. 重启主机,或使用以下步骤停止并重新激活逻辑卷:

    $ 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_> 作为快照名称创建了指定的快照。

流程

  1. 创建一个包含以下内容的 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。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.snapshot/README.md 文件
  • /usr/share/doc/rhel-system-roles/snapshot/ 目录
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.