Red Hat Training

A Red Hat training course is available for RHEL 8

管理存储设备

Red Hat Enterprise Linux 8

在 Red Hat Enterprise Linux 8 中部署和配置单节点存储

Red Hat Customer Content Services

摘要

本文档提供如何有效管理 Red Hat Enterprise Linux 8 中的存储设备的步骤。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要提交更复杂的反馈,请创建一个 Bugzilla ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 可用存储选项概述

Red Hat Enterprise Linux 8 中提供了多个本地、远程和基于集群的存储选项。

本地存储意味着存储设备安装在系统上或直接附加到系统。

使用远程存储时,设备可以通过 LAN、互联网或使用光纤通道网络进行访问。高级别 Red Hat Enterprise Linux 存储图描述了不同的存储选项

图 1.1. 高级别 Red Hat Enterprise Linux 存储图

高级别 RHEL 存储图

1.1. 本地存储概述

Red Hat Enterprise Linux 8 提供多个本地存储选项。

基本磁盘管理

使用 partedfdisk,您可以创建、修改、删除和查看磁盘分区。以下是分区布局标准:

主引导记录(MBR)
它用于基于 BIOS 的计算机。您可以创建主分区、扩展分区及逻辑分区。
GUID 分区表(GPT)
它使用全局唯一标识符(GUID),提供唯一磁盘和 GUID 分区。

要加密分区,您可以使用 Linux Unified Key Setup-on-disk-format(LUKS)。要加密分区,选择安装过程中的选项,系统会显示输入密码短语的提示。这个密码短语用于解锁加密密钥。

存储消耗选项
Non-Volatile Dual In-line Memory Modules(NVDIMM)管理
它是内存和存储的组合。您可以在连接到您的系统的 NVDIMM 设备中启用和管理各种存储类型。
块存储管理
数据以块形式存储,每个块都有唯一的标识符。
文件存储
数据存储在本地系统中的文件级别。这些数据可使用 XFS(默认)或者 ext4 本地访问,并使用 NFS 和 SMB 通过网络访问。
逻辑卷
逻辑卷管理器(LVM)

它从物理设备中创建逻辑设备。逻辑卷(LV)是物理卷(PV)和卷组(VG)的组合。配置 LVM 包括:

  • 从硬盘创建 PV。
  • 从 PV 创建 VG。
  • 从 VG 创建 LV,分配挂载点到 LV。
Virtual Data Optimizer(VDO)

它被用来通过重复数据删除(deduplication)、压缩和精简置备来减少数据。在 LV 下使用 VDO 可以帮助:

  • 扩展 VDO 卷
  • 通过多个设备生成 VDO 卷
本地文件系统
XFS
默认 RHEL 文件系统。
ext4
传统的文件系统。
Stratis
它只是一个技术预览。Stratis 是一个支持高级存储功能的混合用户和内核本地存储管理系统。

1.2. 远程存储概述

以下是 Red Hat Enterprise Linux 8 中的远程存储选项:

存储连接选项
iSCSI
RHEL 8 使用 targetcli 工具来添加、删除、查看和监控 iSCSI 存储间的连接。
光纤频道(FC)

Red Hat Enterprise Linux 8 提供以下原生光纤频道驱动程序:

  • lpfc
  • qla2xxx
  • Zfcp
Non-volatile Memory Express(NVMe)

允许主机软件实用程序与固态驱动器通信的接口。使用以下类型的光纤传输来通过光纤配置 NVMe:

  • NVMe over fabrics 使用远程直接内存访问(RDMA)。
  • 使用光纤通道(FC)的 NVMe over fabrics.
设备映射器多路径(DM 多路径)
允许您将服务器节点和存储阵列间的多个 I/O 路径配置为单一设备。这些 I/O 路径是可包含独立电缆、交换机和控制器的物理 SAN 连接。
网络文件系统
  • NFS
  • SMB

1.3. GFS2 文件系统概述

Red Hat Global File System 2 (GFS2) 是一个 64 位对称集群文件系统,它提供了一个共享名称空间,并管理共享一个常见块设备的多个节点间的一致性。GFS2 文件系统旨在提供尽量与本地文件系统类似的功能,同时在节点间强制实施完整集群一致性。为达到此目的,节点在文件系统资源中使用集群范围的锁定方案。这个锁定方案使用 TCP/IP 等通讯协议来交换锁定信息。

在某些情况下,Linux 文件系统 API 不允许具有集群特性的 GFS2 完全透明。例如,在 GFS2 中使用 POSIX 锁定的程序应该避免使用 GETLK 功能,因为在集群的环境中,该进程 ID 可能用于集群中的不同节点。然而,多数情况下 GFS2 文件系统的功能和本地文件系统的功能是一样的。

Red Hat Enterprise Linux (RHEL) Resilient Storage Add-On提供 GFS2,它依赖于 RHEL High Availability 附加组件来提供 GFS2 所需的集群管理功能。

gfs2.ko 内核模块实施 GFS2 文件系统,并在 GFS2 集群节点中载入。

要获得最佳 GFS2 性能,请务必考虑基础设计中给出的性能注意事项。和本地文件系统一样,GFS2 依赖于页面缓存以便通过本地缓存来提高经常使用数据的性能。为了在集群中的节点间保持一致性,缓存控制由 glock 状态机器提供。

1.4. Gluster 存储概述

红帽 Gluster 存储(RHGS)是一款软件定义型存储平台,可在集群中部署。它将多个服务器的磁盘存储资源整合到单一全局命名空间中。GlusterFS 是一种开源分布式文件系统,适用于云和混合解决方案。

卷构成了 GlusterFS 的基础,并提供不同的要求。每个卷是 brick 的集合,它们是基本存储单元,由受信存储池中服务器上的导出目录表示。

可用的 GlusterFS 卷类型如下:

  • 分布式 GlusterFS 卷是每个文件存储在一个 brick 中的默认卷,文件不能在不同 brick 之间共享。
  • 复制的 GlusterFS 卷类型复制用户数据,使得一个 brick 出现故障时仍然可以访问该数据。
  • 分布式复制 GlusterFS 卷是一个混合卷,可在大量系统上分发副本。它适用于存储可扩展性和高可靠性至关重要的环境。

1.5. Ceph 存储概述

红帽 Ceph 存储(RHCS)是一款可扩展、开放、软件定义型存储平台,它将最稳定版本的 Ceph 存储系统与 Ceph 管理平台、部署实用程序和支持服务相结合。

红帽 Ceph 存储专为云基础架构和 Web 规模对象存储而设计。Red Hat Ceph Storage 集群由以下类型的节点组成:

Red Hat Ceph Storage Ansible 管理节点

此类节点充当之前版本的红帽 Ceph 存储的传统 Ceph 管理节点。这种类型的节点提供以下功能:

  • 集中存储集群管理
  • Ceph 配置文件和密钥
  • (可选)用于在因为安全原因无法访问互联网的节点上安装 Ceph 的本地存储库
监控节点

每个监控器节点都运行 monitor 守护进程(ceph-mon),守护进程维护集群映射的副本。集群映射包含集群拓扑。连接 Ceph 集群的客户端从 monitor 中检索 cluster map 的当前副本,使客户端能够从集群读取和写入数据。

重要

Ceph 可以使用一个监控器运行;但是,为了保证生产集群中的高可用性,红帽将仅支持具有至少三个 monitor 节点的部署。红帽建议为超过 750 OSD 的存储集群部署总计 5 个 Ceph Monitor。

OSD 节点

每个对象存储设备(OSD)节点都运行 Ceph OSD 守护进程(ceph-osd),它与附加到节点的逻辑磁盘交互。Ceph 在这些 OSD 节点上存储数据。

Ceph 可在只有很少 OSD 节点的环境中运行,默认为三个。但对于生产环境,自中等范围环境开始(例如,在一个存储集群中包括 50 个 OSD)才可能看到其在性能方面的优势。理想情况下,Ceph 集群具有多个 OSD 节点,通过创建 CRUSH map 来允许隔离的故障域。

MDS 节点
每个元数据服务器(MDS)节点运行 MDS 守护进程(ceph-mds),它管理与 Ceph 文件系统(CephFS)中存储的文件相关的元数据。MDS 守护进程也协调对共享集群的访问。
对象网关节点
Ceph 对象网关节点运行 Ceph RADOS 网关守护进程(ceph-radosgw),它是基于 librados 构建的对象存储接口,为应用提供 Ceph 存储集群的 RESTful 网关。Ceph 对象网关支持两个接口:
S3
通过与 Amazon S3 RESTful API 的大子集兼容的接口提供对象存储功能。
Swift
通过与 OpenStack Swift API 的大集兼容的接口提供对象存储功能。

其它资源

第 2 章 使用 RHEL 系统角色管理本地存储

要使用 Ansible 管理 LVM 和本地文件系统(FS),您可以使用 storage 角色,这是 RHEL 8 中可用的 RHEL 系统角色之一。

使用 storage 角色可让您从 RHEL 7.7 开始,在多个机器和逻辑卷中自动管理磁盘和逻辑卷中的文件系统。

有关 RHEL 系统角色以及如何应用它们的更多信息,请参阅 RHEL 系统角色简介

2.1. 存储角色简介

storage 角色可以管理:

  • 磁盘上未被分区的文件系统
  • 完整的 LVM 卷组,包括其逻辑卷和文件系统

使用 storage 角色,您可以执行以下任务:

  • 创建文件系统
  • 删除文件系统
  • 挂载文件系统
  • 卸载文件系统
  • 创建 LVM 卷组
  • 删除 LVM 卷组
  • 创建逻辑卷
  • 删除逻辑卷
  • 创建 RAID 卷
  • 删除 RAID 卷
  • 创建带有 RAID 的 LVM 池
  • 删除带有 RAID 的 LVM 池

2.2. 在存储设备角色中识别存储设备的参数

您的 storage 角色配置只会影响您在以下变量中列出的文件系统、卷和池。

storage_volumes

在所有要管理的未分区磁盘中的文件系统列表。

当前不支持的分区。

storage_pools

要管理的池列表。

目前唯一支持的池类型是 LVM。使用 LVM 时,池代表卷组(VG)。每个池中都有一个要由角色管理的卷列表。对于 LVM,每个卷对应一个带文件系统的逻辑卷(LV)。

2.3. 在块设备中创建 XFS 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色,以使用默认参数在块设备中创建 XFS 文件系统。

警告

storage 角色只能在未分区、整个磁盘或者逻辑卷(LV)中创建文件系统。它不能在分区中创建文件系统。

例 2.1. 在 /dev/sdb 上创建 XFS 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中是 barefs )目前是任意卷。storage 角色根据在 disks: 属性中列出的磁盘设备识别卷。
  • 您可以省略 fs_type: xfs 行,因为 XFS 是 RHEL 8 中的默认文件系统。
  • 要在 LV 中创建文件系统,在 disks: 属性中提供 LVM 设置,包括保护卷组。详情请参阅 管理逻辑卷的 Ansible playbook 示例

    不要提供到 LV 设备的路径。

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.4. 永久挂载文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来立即和永久挂载 XFS 文件系统。

例 2.2. 在 /dev/sdb 上将文件系统挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • 此 playbook 将文件系统添加到 /etc/fstab 文件中,并立即挂载文件系统。
  • 如果 /dev/sdb 设备或挂载点目录中的文件系统不存在,则 playbook 会创建它们。

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.5. 管理逻辑卷的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。这个 playbook 应用 storage 角色在卷组中创建 LVM 逻辑卷。

例 2.3. 在 myvg 卷组中创建 mylv 逻辑卷的 playbook

- hosts: all
  vars:
    storage_pools:
      - name: myvg
        disks:
          - sda
          - sdb
          - sdc
        volumes:
          - name: mylv
            size: 2G
            fs_type: ext4
            mount_point: /mnt
  roles:
    - rhel-system-roles.storage
  • myvg 卷组由以下磁盘组成:

    • /dev/sda
    • /dev/sdb
    • /dev/sdc
  • 如果 myvg 卷组已存在,则 playbook 会将逻辑卷添加到卷组中。
  • 如果 myvg 卷组不存在,则 playbook 会创建它。
  • playbook 在 mylv 逻辑卷中创建 Ext4 文件系统,并在其中永久挂载文件系统 /mnt

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.6. 启用在线块丢弃的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来挂载启用了在线块丢弃的 XFS 文件系统。

例 2.4. 一个 playbook,它在 /mnt/data/ 上启用在线块丢弃功能

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
        mount_options: discard
  roles:
    - rhel-system-roles.storage

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.7. 创建和挂载 Ext4 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来创建和挂载 Ext4 文件系统。

例 2.5. 在 /dev/sdb 上创建 Ext4 并挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: ext4
        fs_label: label-name
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • playbook 在 /dev/sdb 磁盘上创建文件系统。
  • playbook 会永久将文件系统挂载到 /mnt/data 目录中。
  • 文件系统的标签是 label-name

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.8. 创建和挂载 ext3 文件系统的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来创建和挂载 Ext3 文件系统。

例 2.6. 在 /dev/sdb 上创建 Ext3 并挂载到 /mnt/data 的 playbook

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: ext3
        fs_label: label-name
        mount_point: /mnt/data
  roles:
    - rhel-system-roles.storage
  • playbook 在 /dev/sdb 磁盘上创建文件系统。
  • playbook 会永久将文件系统挂载到 /mnt/data 目录中。
  • 文件系统的标签是 label-name

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.9. 使用存储 RHEL 系统角色重新定义现有 Ext4 或 Ext3 文件系统大小的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来调整块设备中现有 Ext4 或 Ext3 文件系统的大小。

例 2.7. 在磁盘上设置单个卷的 playbook

---
- name: Create a disk device mounted on /opt/barefs
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - /dev/sdb
	size: 12 GiB
        fs_type: ext4
        mount_point: /opt/barefs
  roles:
    - rhel-system-roles.storage
  • 如果上例中的卷已存在,若要调整卷的大小,您需要运行同一个 playbook,这与参数 size 的值不同。例如:

例 2.8. 调整 ext4 大小的 playbook /dev/sdb

---
- name: Create a disk device mounted on /opt/barefs
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - /dev/sdb
	size: 10 GiB
        fs_type: ext4
        mount_point: /opt/barefs
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中为barefs)当前是任意卷。存储角色根据 disk: 属性中列出的磁盘设备识别卷。
注意

在其它文件系统中使用 Resizing 操作可能会破坏您要使用的设备中的数据。

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.10. 使用存储 RHEL 系统角色在 LVM 上调整现有文件系统大小的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用存储 RHEL 系统角色来重新定义带有文件系统的 LVM 逻辑卷的大小。

警告

在其它文件系统中使用 Resizing 操作可能会破坏您要使用的设备中的数据。

例 2.9. 调整 myvg 卷组中现有 mylv1 和 myvl2 逻辑卷大小的 playbook

---

- hosts: all
   vars:
    storage_pools:
      - name: myvg
        disks:
          - /dev/sda
          - /dev/sdb
          - /dev/sdc
        volumes:
            - name: mylv1

            size: 10 GiB
            fs_type: ext4
            mount_point: /opt/mount1
            - name: mylv2
            size: 50 GiB
            fs_type: ext4
            mount_point: /opt/mount2

- name: Create LVM pool over three disks
  incude_role:
    name: rhel-system-roles.storage
  • playbook 在 mylv 逻辑卷中创建 Ext4 文件系统,并在 /mnt 挂载点永久挂载文件系统。

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.11. 使用存储 RHEL 系统角色创建交换分区的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来创建交换分区(如果不存在),或使用默认参数在块设备中修改交换分区(如果已存在)。

例 2.10. 在 /dev/sdb 上创建或修改现有 XFS 的 playbook

---
- name: Create a disk device with swap
- hosts: all
  vars:
    storage_volumes:
      - name: swap_fs
        type: disk
        disks:
          - /dev/sdb
	size: 15 GiB
        fs_type: swap
  roles:
    - rhel-system-roles.storage
  • 卷名称(示例中为swap_fs )目前是任意卷。storage 角色根据在 disks: 属性中列出的磁盘设备识别卷。

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.12. 使用存储系统角色配置 RAID 卷

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上配置 RAID 卷。在本小节中,您将了解如何使用可用参数设置 Ansible playbook,以配置 RAID 卷以满足您的要求。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要部署 storage 解决方案的系统中安装 Red Hat Ansible Automation Platform。

  • 已安装该系统中要运行 playbook 的 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用 storage 系统角色部署 RAID 卷的系统。

流程

  1. 使用以下内容 playbook.yml 创建新文件:

    - hosts: all
      vars:
        storage_safe_mode: false
        storage_volumes:
          - name: data
            type: raid
            disks: [sdd, sde, sdf, sdg]
            raid_level: raid0
            raid_chunk_size: 32 KiB
            mount_point: /mnt/data
            state: present
      roles:
        - name: rhel-system-roles.storage
    警告

    设备名称在某些情况下可能会改变,例如:当您在系统中添加新磁盘时。因此,为了避免数据丢失,我们不建议在 playbook 中使用特定的磁盘名称。

  2. 可选。验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • 有关 RAID 的详情,请参阅管理 RAID
  • 有关存储系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.13. 使用存储系统角色使用 RAID 配置 LVM 池

通过 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上使用 RAID 配置 LVM 池。在本小节中,您将了解如何使用可用参数设置 Ansible playbook,以配置使用 RAID 的 LVM 池。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要部署 storage 解决方案的系统中安装 Red Hat Ansible Automation Platform。

  • 已安装该系统中要运行 playbook 的 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用 storage 系统角色配置带有 RAID 的 LVM 池的系统。

流程

  1. 使用以下内容 playbook.yml 创建新文件:

    - hosts: all
      vars:
        storage_safe_mode: false
        storage_pools:
          - name: my_pool
            type: lvm
            disks: [sdh, sdi]
            raid_level: raid1
            volumes:
              - name: my_pool
                size: "1 GiB"
                mount_point: "/mnt/app/shared"
                fs_type: xfs
                state: present
      roles:
        - name: rhel-system-roles.storage
    注意

    要使用具有 RAID 的 LVM 池,您必须使用 raid_level 参数指定 RAID 类型。

  2. 可选。验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • 有关 RAID 的详情,请参阅管理 RAID
  • 有关存储系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

2.14. 使用存储角色创建 LUKS 加密卷

您可以通过运行 Ansible playbook,使用 storage 角色创建并配置使用 LUKS 加密的卷。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要创建卷的系统中安装 Red Hat Ansible Automation Platform。

  • 您已在 Ansible 控制器上安装了 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用存储系统角色部署 LUKS 加密卷的系统。

流程

  1. 使用以下内容 playbook.yml 创建新文件:

    - hosts: all
      vars:
        storage_volumes:
          - name: barefs
            type: disk
            disks:
             - sdb
            fs_type: xfs
            fs_label: label-name
            mount_point: /mnt/data
            encryption: true
            encryption_password: your-password
      roles:
       - rhel-system-roles.storage
  2. 可选:验证 playbook 语法:

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

其它资源

  • 如需更多信息,请安装 rhel-system-roles 软件包并查看以下目录:

    • /usr/share/doc/rhel-system-roles/storage/
    • /usr/share/ansible/roles/rhel-system-roles.storage/

第 3 章 分区入门

作为系统管理员,您可以使用以下步骤创建、删除和修改各种磁盘分区。

有关在块设备中使用分区的优缺点概述,请参阅以下 KBase 文章:

3.1. 重新划分现存分区的大小

作为系统管理员,您可以显示块设备的分区表来查看分区布局和单个分区的详情。

3.1.1. 使用 parted 查看分区表

这个步骤描述了如何使用 parted 工具查看块设备的分区表。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要检查的设备的路径替换 block-device:例如 /dev/sda
  2. 查看分区表:

    (parted) print
  3. 另外,使用以下命令切换到您想要检查下一个设备的另一个设备:

    (parted) select block-device

其它资源

  • parted(8) man page。

3.1.2. parted print 的输出示例

本节提供了 parted shell 中的 print 命令输出示例,并描述输出中的字段。

例 3.1. print 命令的输出

Model: ATA SAMSUNG MZNLN256 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  269MB   268MB   primary   xfs          boot
 2      269MB   34.6GB  34.4GB  primary
 3      34.6GB  45.4GB  10.7GB  primary
 4      45.4GB  256GB   211GB   extended
 5      45.4GB  256GB   211GB   logical

下面是这些字段的描述:

Model: ATA SAMSUNG MZNLN256 (scsi)
磁盘类型、制造商、型号号和接口。
Disk /dev/sda: 256GB
到块设备和存储容量的文件路径。
Partition Table: msdos
磁盘标签类型。
Number
分区号。例如:带有次号码 1 的分区对应 /dev/sda1
StartEnd
在分区启动和结束的设备中的位置。
Type
有效类型为 metadata、free、primary、extended 或 logical。
File system
文件系统类型。如果设备的 File system 字段没有显示值,这意味着其文件系统类型未知。parted 工具无法识别加密设备的文件系统。
Flags
列出为分区设置的标记。可用标记有 bootrootswaphiddenraidlvmlba

3.2. 在磁盘中创建分区表

作为系统管理员,您可以使用不同类型的分区表格式化块设备来启用该设备的分区。

警告

使用分区表格式化块设备会删除该设备中所有存储的数据。

3.2.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用主引导记录(MBR)分区表格式化的设备中,您可以使用:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最多分区数为 128。尽管 GPT 规范通过增大为分区表保留的区域来允许更多分区,但 parted 工具使用的常见做法是将其限制为 128 分区足够区域。
注意

红帽建议,除非您有其他原因,否则至少应创建以下分区swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀指定分区大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

3.2.2. 分区表类型比较

本节比较您可以在块设备中创建的不同类型的分区表的属性。

表 3.1. 分区表类型

分区表最多分区数最大分区大小

主引导记录(MBR)

4 个主分区,或 3 个主分区和一个扩展分区中的 12 个逻辑分区

2TiB

GUID 分区表(GPT)

128

8ZiB

3.2.3. MBR 磁盘分区

本章图表显示分区表与实际磁盘分开。但这并不完全准确。实际上,分区表被保存在磁盘的最开始,并在任何文件系统或用户数据之前。为了简洁,下图将它们分开。

图 3.1. 有 MBR 分区表的磁盘

未使用的分区驱动器

如上图所示,分区表被分为四节(四个主分区)。主分区是在硬盘中只能包含一个逻辑驱动器(或部分)的分区。每个部分都可以保存定义单个分区所需的信息,即分区表只能定义四个分区。

每个分区表条目包含分区的几个重要特征:

  • 磁盘上分区开始和结束的地方。
  • 分区是否 活跃。只能有一个分区被标记为活跃分区。
  • 分区的类型。

起点和结束点定义了分区的大小和在磁盘中的位置。"active(活跃)"标志是被某些操作系统引导装载程序使用。换句话说,位于被标记为"活跃"的分区中的操作系统会被引导。

类型是一个数字,用于识别分区预定的用法。某些操作系统使用分区类型表示特定的文件系统类型,将分区标记为与特定操作系统关联的分区,表示该分区包含可引导的操作系统,或者三个操作系统的某种组合。

下图显示了含有单一分区的驱动器示例:

图 3.2. 只有一个分区的磁盘

dos 单个分区

这个例子里的单个分区被标记为 DOS。这个标签显示分区类型,DOS 是最常见的分区类型之一。

3.2.4. 扩展 MBR 分区

如果四个分区不足,您可以使用扩展分区来创建额外的分区。您可以把分区类型设置为"Extended"来达到此目的。

扩展分区本身就如同磁盘驱动器一样 - 它有自己的分区表,指向一个或多个分区(现在称为逻辑分区,而不是四个主分区),它完全包含在扩展的分区中。下图显示了一个带有一个主分区的磁盘驱动器,另一个扩展分区包含两个逻辑分区(以及一些未分区的可用空间):

图 3.3. 带主和扩展 MBR 分区的磁盘

扩展分区

如图表中所暗示,主分区和逻辑分区之间有一个区别 - 主分区和扩展分区的数量只能是 4 个,但逻辑分区的数量没有固定限制。但是,由于在 Linux 中访问分区的方式,单个磁盘驱动器上无法定义超过 15 个逻辑分区。

3.2.5. MBR 分区类型

下表显示了一些常用的 MBR 分区类型和用于代表它们的十六进制数字。

表 3.2. MBR 分区类型

MBR 分区类型

MBR 分区类型

00

Novell Netware 386

65

DOS 12-bit FAT

01

PIC/IX

75

XENIX root

O2

Old MINIX

80

XENIX usr

O3

Linux/MINUX

81

DOS 16-bit ⇐32M

04

Linux swap

82

Extended

05

Linux native

83

DOS 16-bit >=32

06

Linux extended

85

OS/2 HPFS

07

Amoeba

93

AIX

08

Amoeba BBT

94

AIX bootable

09

BSD/386

a5

OS/2 Boot Manager

0a

OpenBSD

a6

Win95 FAT32

0b

NEXTSTEP

a7

Win95 FAT32(LBA)

0c

BSDI fs

b7

Win95 FAT16(LBA)

0e

BSDI swap

b8

Win95 Extended (LBA)

0f

Syrinx

c7

Venix 80286

40

CP/M

db

Novell

51

DOS access

e1

PRep Boot

41

DOS R/O

e3

GNU HURD

63

DOS secondary

f2

Novell Netware 286

64

BBT

ff

3.2.6. GUID 分区表

GUID 分区表(GPT)是基于使用全局唯一标识符(GUID)的分区方案。GPT 的开发目的是弥补 MBR 分区表的限制,特别是对磁盘的最大可寻址存储空间的限制。MBR 无法寻址大于 2 TiB 的存储(等同于大约 2.2 TB),而 GPT 可以用于大于这个存储限制的硬盘,其可寻址的最大磁盘大小为 2.2 ZiB。另外,GPT 默认支持创建最多 128 个主分区。这个号码可以通过为分区表分配更多空间来扩展。

注意

GPT 有基于 GUID 的分区类型。请注意,某些分区需要一个特定的 GUID。例如:EFI 引导装载程序的系统分区需要 GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B

GPT 磁盘使用逻辑块寻址(LBA),分区布局如下:

  • 为了保持与 MBR 磁盘的向后兼容性,GPT 的第一个扇区(LBA 0)保留用于 MBR 数据,它称为"保护 MBR"。
  • 主 GPT 标头从设备的第二个逻辑块(LBA 1)开始。标头中包含磁盘 GUID、主分区表的位置、从属 GPT 标头的位置、自身的 CRC32 checksum 以及主分区表。它还指定表上的分区条目数目。
  • 默认情况下,主 GPT 包括 128 个分区条目,每个条目大小为 128 字节,其分区类型 GUID 和唯一分区 GUID。
  • 二级 GPT 与主 GPT 相同。它主要用作恢复的备份表,以防主分区表损坏。
  • 辅助 GPT 标头位于磁盘的最后一个逻辑扇区,在主标头损坏时可用于恢复 GPT 信息。它包含磁盘 GUID、二级分区表和主 GPT 标头的位置、自身的 CRC32 checksums 校验、从属分区表,以及可能的分区条目数目。

图 3.4. 带有 GUID 分区表的磁盘

GPT 分区
重要

必须有一个 BIOS 引导分区才能成功安装引导装载程序到包含 GPT(GUID 分区表)的磁盘中。这包括 Anaconda 初始化的磁盘。如果磁盘已经包含 BIOS 引导分区,则它可以被重复使用。

3.2.7. 使用 parted 在磁盘中创建分区表

这个步骤描述了如何使用 parted 工具格式化带有分区表的块设备。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要创建分区表的设备的路径替换 block-device:例如 /dev/sda
  2. 确定该设备中是否已有一个分区表:

    (parted) print

    如果设备已经包含分区,将在后续步骤中删除它们。

  3. 创建新分区表:

    (parted) mklabel table-type
    • 用预期的分区表类型来替换 table-type

      • msdos 用于 MBR
      • gpt 用于 GPT

    例 3.2. 创建 GPT 表

    例如,要在磁盘中创建 GPT 表,请使用:

    (parted) mklabel gpt

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  4. 查看分区表以确认分区表是否存在:

    (parted) print
  5. 退出 parted shell:

    (parted) quit

其它资源

  • parted(8) man page。

后续步骤

3.3. 创建分区

作为系统管理员,您可以在磁盘上创建新分区。

3.3.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用主引导记录(MBR)分区表格式化的设备中,您可以使用:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最多分区数为 128。尽管 GPT 规范通过增大为分区表保留的区域来允许更多分区,但 parted 工具使用的常见做法是将其限制为 128 分区足够区域。
注意

红帽建议,除非您有其他原因,否则至少应创建以下分区swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀指定分区大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

3.3.2. 分区类型

本节描述了指定分区类型的不同属性。

分区类型或标志

分区类型或标志仅供运行中的系统少用。但是,分区类型与实时生成器有关,如 systemd-gpt-auto-generator,它们使用分区类型自动识别和挂载设备。

  • parted 工具通过将分区类型映射到标记来提供对分区类型的一些控制。parted 实用程序只能处理某些分区类型:例如 LVM、swap 或 RAID。
  • fdisk 工具通过指定十六进制代码来支持全范围的分区类型。
分区文件系统类型

在创建分区时,parted 工具接受文件系统类型参数。该值用于:

  • 在 MBR 中设定分区标记,或者
  • 在 GPT 中设定分区 UUID 类型。例如, swapfathfs 文件系统类型设置了不同的 GUID。默认值为 Linux Data GUID。

参数不会以任何形式修改分区中的文件系统。它只区分受支持的标志或 GUID。

支持以下文件系统类型:

  • xfs
  • ext2
  • ext3
  • ext4
  • fat16
  • fat32
  • hfs
  • hfs+
  • linux-swap
  • ntfs
  • reiserfs

3.3.3. 分区命名方案

Red Hat Enterprise Linux 使用基于文件的命名方案,格式为 /dev/xxyN

设备和分区名称由以下结构组成:

/dev/
这是所有设备文件所在的目录名称。由于分区放置在硬盘中,而硬盘是设备,代表所有可能分区的文件位于 /dev 中。
xx
分区名的前两个字母标明分区所在设备的类型,通常是 sd
y
这个字母标明分区所在的设备。例如:第一个硬盘为 /dev/sda,第二个硬盘为 /dev/sdb,以此类推。在超过 26 个驱动器的系统中,您可以使用更多字母。例如: /dev/sdaa1
N
最后的字母代表分区的数字。前四个分区(主分区或扩展分区)由 14 进行编号。逻辑分区从 5 开始。例如: /dev/sda3 是第一个硬盘上的第三个主分区或扩展分区,/dev/sdb6 是第二个硬盘中的第二个逻辑分区。驱动器分区编号只适用于 MBR 分区表。请注意,N 并不总是意味着分区。
注意

即使 Red Hat Enterprise Linux 可以识别和引用 所有类型的磁盘分区,它可能无法读取文件系统,因此无法访问分区类型中保存的数据。然而,在很多情况下,成功访问专用于另一个操作系统的分区中的数据是可能的。

3.3.4. 挂载点和磁盘分区

在 Red Hat Enterprise Linux 中,每个分区都被用来成为支持一组文件和目录所必需的存储的一部分。这可使用名为 mounting 的进程完成,该进程可将分区和目录相关联。挂载分区后,可以从指定的目录(称为挂载点 )开始使用其存储。

例如:如果分区 /dev/sda5 挂载到 /usr/,这意味着 /usr/ 下的所有文件和目录实际都驻留在 /dev/sda5 中。因此 /usr/share/doc/FAQ/txt/Linux-FAQ 文件将存储在 /dev/sda5 中,而 /etc/gdm/custom.conf 文件则不会。

继续这个示例,/usr/ 以下一个或多个目录可能是其他分区的挂载点。例如,一个 /dev/sda7 分区可挂载到 /usr/local 上,这意味着 /usr/local/man/whatis 将位于 /dev/sda7 中而不是 /dev/sda5

3.3.5. 使用 parted 创建分区

这个步骤描述了如何使用 parted 工具在块设备中创建新分区。

先决条件

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要创建分区的设备的路径替换 block-device:例如 /dev/sda
  2. 查看当前的分区表来确定是否有足够空闲空间:

    (parted) print
    • 如果没有足够的可用空间,您可以调整现有分区的大小。更多信息请参阅 第 3.5 节 “重新定义分区尺寸”
    • 从分区表中决定:

      • 新分区的开始和结束点
      • 在 MBR 上,它应该是什么分区类型。
  3. 创建新分区:

    (parted) mkpart part-type name fs-type start end
    • 根据您在分区表里决定的,用 primarylogicalextended 替换 part-type。这只适用于 MBR 分区表。
    • 使用任意分区名称替换 name。对于 GPT 分区表,这是必需的。
    • 使用 xfsext2ext3ext4fat16fat32hfshfs+linux-swapntfsreiserfs 之一替换 fs-typefs-type 参数是可选的。请注意,parted 不会在分区中创建文件系统。
    • 用从磁盘开头起计算分区开始和结束点的大小替换start end。您可以使用大小后缀,如 512MiB20GiB1.5TiB。默认大小 MB。

    例 3.3. 创建小的主分区

    例如:要在 MBR 表中创建主分区(从 1024MiB 到 2048MiB),使用:

    (parted) mkpart primary 1024MiB 2048MiB

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  4. 查看分区表以确认创建的分区位于分区表中,并带有正确的分区类型、文件系统类型和大小:

    (parted) print
  5. 退出 parted shell:

    (parted) quit
  6. 使用以下命令等待系统注册新设备节点:

    # udevadm settle
  7. 验证内核是否识别了新的分区:

    # cat /proc/partitions

其它资源

  • parted(8) man page。

3.3.6. 使用 fdisk 设置分区类型

这个步骤描述了如何使用 fdisk 实用程序设置分区类型或标志。

先决条件

  • 磁盘上有一个分区。

流程

  1. 启动交互式 fdisk shell:

    # fdisk block-device
    • 使用您要设置分区类型的设备的路径替换 block-device:例如 /dev/sda
  2. 查看当前的分区表以确定副分区号码:

    Command (m for help): print

    您可以在 Type 列中看到当前的分区类型及其对应的类型 ID(在 Id 列中)。

  3. 输入分区类型命令并使用它的副号码选择分区:

    Command (m for help): type
    Partition number (1,2,3 default 3): 2
  4. 另外,还可列出可用的十六进制代码:

    Hex code (type L to list all codes): L
  5. 设置分区类型:

    Hex code (type L to list all codes): 8e
  6. 编写更改并退出 fdisk shell:

    Command (m for help): write
    The partition table has been altered.
    Syncing disks.
  7. 验证您的更改:

    # fdisk --list block-device

3.4. 删除分区

作为系统管理员,您可以删除不再用来释放磁盘空间的磁盘分区。

警告

删除分区将删除保存在分区中的所有数据。

3.4.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用主引导记录(MBR)分区表格式化的设备中,您可以使用:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最多分区数为 128。尽管 GPT 规范通过增大为分区表保留的区域来允许更多分区,但 parted 工具使用的常见做法是将其限制为 128 分区足够区域。
注意

红帽建议,除非您有其他原因,否则至少应创建以下分区swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀指定分区大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

3.4.2. 使用 parted 删除分区

这个步骤描述了如何使用 parted 工具删除磁盘分区。

流程

  1. 启动交互式 parted shell:

    # parted block-device
    • 使用您要删除分区的设备的路径替换 block-device:例如 /dev/sda
  2. 查看当前的分区表以确定要删除的分区的副号码:

    (parted) print
  3. 删除分区:

    (parted) rm minor-number
    • 使用您要删除的分区的次要号码替换 minor-number:例如: 3

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  4. 确认分区已从分区表中被删除:

    (parted) print
  5. 退出 parted shell:

    (parted) quit
  6. 确定内核知道已删除该分区:

    # cat /proc/partitions
  7. 如果分区存在,从 /etc/fstab 文件中删除它。找到声明已删除分区的行,并将其从 文件中删除。
  8. 重新生成挂载单元以便您的系统注册新的 /etc/fstab 配置:

    # systemctl daemon-reload
  9. 如果您删除了交换分区或删除了 LVM 部分,请从 /etc/default/grub 文件中的内核命令行中删除所有对分区的引用,并重新生成 GRUB 配置:

    • 在基于 BIOS 的系统中:

      # grub2-mkconfig --output=/etc/grub2.cfg
    • 在基于 UEFI 的系统中:

      # grub2-mkconfig --output=/etc/grub2-efi.cfg
  10. 要在早期引导系统中注册更改,重建 initramfs 文件系统:

    # dracut --force --verbose

其它资源

  • parted(8) man page

3.5. 重新定义分区尺寸

作为系统管理员,您可以扩展分区来利用未使用的磁盘空间,或者缩小分区以达到不同的目的。

3.5.1. 修改磁盘分区前的注意事项

本节列出了在创建、删除或重新定义分区大小前需要考虑的关键点。

注意

本节不涵盖 DASD 分区表,它特定于 IBM Z 构架。有关 DASD 的详情请参考:

分区的最大数量

设备中的分区数量受分区表类型的限制:

  • 在使用主引导记录(MBR)分区表格式化的设备中,您可以使用:

    • 最多四个主分区,或者
    • 最多有三个主分区,以及一个扩展分区,其中包括多个逻辑分区。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最多分区数为 128。尽管 GPT 规范通过增大为分区表保留的区域来允许更多分区,但 parted 工具使用的常见做法是将其限制为 128 分区足够区域。
注意

红帽建议,除非您有其他原因,否则至少应创建以下分区swap/boot// (root)。

分区的最大大小

设备中的分区大小受分区表类型的限制:

  • 在使用主引导记录(MBR) 分区表格式化的设备中,最大值为 2TiB。
  • 在使用 GUID 分区表(GPT) 格式化的设备中,最大大小为 8ZiB。

如果要创建一个大于 2TiB 的分区,该磁盘必须使用 GPT 格式化。

大小协调

parted 工具可让您使用多个不同的后缀指定分区大小:

MiB、GiB 或 TiB

大小为 2 的指数代表。

  • 分区的起点与根据大小指定的扇区一致。
  • 结束点与指定大小减 1 扇区一致。
MB、GB 或 TB

以 10 的指数表示容量。

起始和结束点在指定单元的一半内一致:例如,使用 MB 后缀时 ±500KB。

3.5.2. 使用 parted 重新定义分区大小

这个过程使用 parted 工具重新定义磁盘分区大小。

先决条件

  • 如果您想缩小分区,备份保存在分区上的数据。

    警告

    缩小分区可能会导致分区上的数据丢失。

  • 如果要将分区大小调整为大于 2TiB,磁盘必须使用 GUID 分区表(GPT)进行格式化。有关如何格式化磁盘的详情请参考 第 3.2 节 “在磁盘中创建分区表”

流程

  1. 如果您想缩小分区,首先缩小它上面的文件系统,使其不大于重新定义大小的分区。请注意 XFS 不支持缩小。
  2. 启动交互式 parted shell:

    # parted block-device
    • 使用您要重新定义分区大小的设备的路径替换 block-device: 例如 /dev/sda
  3. 查看当前的分区表:

    (parted) print

    从分区表中决定:

    • 分区的从号码
    • 调整大小后现有分区的位置和新结束点
  4. 重新定义分区大小:

    (parted) resizepart minor-number new-end
    • 使用您要重新划分大小的分区的副号码替换 minor-number:例如: 3
    • 用决定重新定义大小的新分区的结束点(从磁盘开始计算)替换 new-end。您可以使用大小后缀,如 512MiB20GiB1.5TiB。默认大小 MB。

    例 3.4. 扩展分区

    例如,要将位于磁盘开头的分区大小扩展为 2GiB,请使用:

    (parted) resizepart 1 2GiB

    输入此命令后,这些更改就会生效,因此在执行前请先重新检查。

  5. 查看分区表以确认重新定义大小的分区位于分区表中,大小正确:

    (parted) print
  6. 退出 parted shell:

    (parted) quit
  7. 验证内核是否识别了新的分区:

    # cat /proc/partitions
  8. 如果您扩展了分区,也扩展了它上面的文件系统。详情请参阅(参考)。

其它资源

  • parted(8) man page。

3.6. 重新分区磁盘策略

重新分区磁盘的方法有几种。本节讨论以下可能的方法:

  • 有可用的未分区的空闲空间
  • 有可用的未使用过的分区
  • 被活跃使用的分区内有可用的空闲空间

请注意,本节仅讨论前面提到的概念,不包括关于如何执行磁盘重新分区步骤的任何流程步骤。

注意

为了清晰起见,以下示意图进行了简化,不反映您在实际安装 Red Hat Enterprise Linux 时遇到的确切分区布局。

3.6.1. 使用未分区的空闲空间

在这种情况下,已定义的分区不会跨越整个硬盘,留下不属于任何定义的分区的未分配空间。下图显示了以下情况:

图 3.5. 有未分区的可用空间的磁盘

unpart 空间

在上例中,第一个图表示一个具有一个主分区的磁盘,以及一个具有未分配空间的未定义分区的磁盘,第二个图代表了具有两个定义分区且分配空间的磁盘。

未使用的硬盘也属于这一类别。唯一的区别在于,所有空间并非任何定义的分区的一部分

无论哪种情况,您都可以从未使用的空间创建必要的分区。这种情境很可能是新磁盘。大部分预安装的操作系统都被配置为占据磁盘驱动器上所有可用空间。

3.6.2. 使用未使用分区中的空间

在这种情况下,您可以有一个或者多个不再使用的分区。下图显示了这种情况。

图 3.6. 有未使用分区的磁盘

未使用的分区

在上例中,第一个图表示带有未使用分区的磁盘,第二个图表示为 Linux 重新分配未使用的分区。

在这种情况下,您可以使用分配给未使用分区的空间。您必须删除分区,然后在其位置创建适当的 Linux 分区。您可以删除未使用的分区并在安装过程中手动创建新分区。

3.6.3. 使用活跃分区中的空闲空间

这是最常见的情况。它也是最难以处理的,因为即使您有足够的可用空间,它也当前被分配给已在使用的分区。如果您购买了一台带有预安装软件的计算机,硬盘很可能有一个大型分区存放操作系统和数据。

除了向系统添加新硬盘驱动器外,您还可以从破坏性和非破坏性重新分区中选择。

3.6.3.1. 破坏性重新分区

这会删除分区并创建几个较小的分区。您必须进行完整备份,因为原始分区中的所有数据都会被破坏。创建两个备份,使用验证(如果您的备份软件中可用),并在删除分区前尝试从备份中读取数据

警告

如果在该分区上安装了操作系统,必须重新安装它才能使用该系统。请注意,一些与预安装操作系统一起销售的计算机可能不包括安装介质来重新安装原始操作系统。在销毁原始分区及其操作系统安装前,您应该检查是否对您的系统适用。

为现有操作系统创建一个更小的分区后,您可以重新安装软件,恢复您的数据并启动 Red Hat Enterprise Linux 安装。

图 3.7. 在磁盘上进行破坏性重新分区动作

dstrct reprt
警告

原有分区中的数据将会丢失。

3.6.3.2. 非破坏性重新分区

通过非破坏性重新分区,您将执行一个程序,使大分区减小而不丢失该分区中存储的任何文件。这个方法通常是可靠的,但在大型驱动器上可能非常耗时。

非破坏性重新分区过程很简单,它由三个步骤组成:

  1. 压缩和备份现存数据
  2. 重新划分现存分区的大小
  3. 创建新分区

每个步骤都会详细介绍。

3.6.3.2.1. 压缩现有数据

第一步要压缩现存分区上的数据。这样做的原因是重新排列数据,以最大化分区"结尾"的可用空间。

图 3.8. 磁盘压缩

compression

在上例中,第一个图在压缩前代表磁盘,压缩后的第二个图表代表磁盘。

这一步骤至关重要。如果没有它,数据的位置可能会阻止分区的大小调整为所需的范围。请注意,有些数据无法移动。在这种情况下,它会严重限制新分区的大小,并且可能强制您以破坏性方式重新分区磁盘。

3.6.3.2.2. 重新定义现有分区大小

下图显示了实际调整大小的流程。虽然重新定义大小操作的实际结果会有所不同,具体取决于所使用的软件,但在大多数情况下,新释放空间用于创建与原始分区相同的类型未格式化的分区。

图 3.9. 分区在磁盘上调整大小

部分调整大小

在上例中,第一个图表示重新定义大小前的分区,调整大小后的第二个图表。

务必要了解重新定义软件大小对新释放空间有什么作用,以便您可以执行相应的步骤。在此处演示的情形中,最好删除新的 DOS 分区并创建适当的 Linux 分区或分区。

3.6.3.2.3. 创建新分区

重新定义现存分区大小 示例中所述,创建新分区可能也可能不是必需的。然而,除非重新分区软件支持安装 Linux 系统,您很可能需要删除在调整大小过程中创建的分区。

图 3.10. 带有最终分区配置的磁盘

nondestruct fin

在上例中,第一个图表示配置前的磁盘,配置后是第二个图表。

第 4 章 持久性命名属性概述

作为系统管理员,您需要引用使用持久性命名属性的存储卷来构建比多个系统引导更可靠存储设置。

4.1. 非持久性命名属性的缺陷

Red Hat Enterprise Linux 提供识别存储设备的多种方法。在使用正确的选项时,务必要使用正确的选项来识别每个设备,以避免意外访问错误的设备,特别是在安装到或重新格式化驱动器时。

通常,Linux 中使用非持久性名称来指代存储设备,格式为 /dev/sd(major number)(minor number)检测到后为每个设备分配主号码和副号码范围以及关联的 sd 名称。这意味着,当设备检测顺序改变时,主号码和副号码范围与关联的 sd 名称之间的关联可能会改变。

在以下情况下可能会在以下情况下更改排序:

  • 系统引导过程的并行化会根据每个系统引导的顺序检测到存储设备。
  • 磁盘无法启动或响应 SCSI 控制器。这会导致通常的设备探测不会检测到它。该磁盘不能被系统访问,后续的设备将具有它们的主号码和副号码范围,包括相关的 sd 名称。例如:如果没有检测到通常称为 sdb 的磁盘,通常称为 sdc 的磁盘会显示为 sdb
  • SCSI 控制器(主机总线适配器或 HBA)无法初始化,从而导致没有检测到与该 HBA 连接的所有磁盘。所有连接到随后探测的 HBA 的磁盘都会被分配不同的主号码和副号码范围,以及不同的关联的 sd 名称。
  • 如果系统中存在不同类型的 HBA,则驱动初始化顺序会改变。这会导致连接到那些 HBA 的磁盘以不同顺序被检测到。当将 HBA 移动到系统的不同 PCI 插槽时也会出现这种情况。
  • 例如,在探测存储设备时,通过光纤通道、iSCSI 或 FCoE 适配器连接到系统的磁盘可能无法访问,例如,存储阵列或干预交换机被关闭。如果存储阵列的在线需要比系统启动的时间更长,则系统在电源失败后重启时会出现这种情况。虽然某些光纤通道驱动程序支持一种机制来指定持久性 SCSI 目标 ID 到 WWPN 映射,但这不会导致主号码和副号码范围,以及相关的 sd 名称,它只提供一致的 SCSI 目标 ID 号。

这使得您不希望在引用设备时使用主号码和副号码范围或者关联的 sd 名称,比如在 /etc/fstab 文件中。可能挂载了错误的设备,并可能导致数据崩溃。

然而,偶尔也会需要引用 sd 名称,即使使用了其它机制,比如当设备报告错误时。这是因为 Linux 内核在针对该设备的内核信息中使用 sd 名称(以及 SCSI host/channel/target/LUN 标题)。

4.2. 文件系统和设备识别符

这部分解释了识别文件系统和块设备的持久性属性之间的区别。

文件系统识别符

文件系统标识符与在块设备中创建的特定文件系统绑定。标识符也作为文件系统的一部分保存。如果您将文件系统复制到不同的设备中,它仍采用相同的文件系统识别符。另外,如果您重写该设备,比如使用 mkfs 程序进行格式化,则设备会丢失该属性。

文件系统识别符包括:

  • 唯一标识符(UUID)
  • 标签

设备识别符

设备标识符与块设备绑定:例如磁盘或者分区。如果您重写了该设备,比如使用 mkfs 程序进行格式化,则该设备会保留属性,因为它没有存储在文件系统中。

设备识别符包括:

  • World Wide Identifier (WWID)
  • 分区 UUID
  • 序列号

建议

  • 有些文件系统(比如逻辑卷)会跨越多个设备。红帽建议您使用文件系统识别符而不是设备标识符访问这些文件系统。

4.3. 使用 /dev/disk/ 中的 udev 机制管理的设备名称

本节列出了 udev 服务在 /dev/disk/ 目录中提供的不同类型的持久命名属性。

udev 机制用于 Linux 中所有设备,而不仅仅用于存储设备。对于存储设备,Red Hat Enterprise Linux 包含 udev 规则,它会在 /dev/disk/ 目录中创建符号链接。这可让您使用以下方法指向存储设备:

  • 其内容
  • 唯一标识符
  • 它们的序列号。

虽然 udev 命名属性是持久的,但它们在系统重启后不会自行改变,但有些也可以配置。

4.3.1. 文件系统识别符

/dev/disk/by-uuid/ 中的 UUID 属性

此目录中的条目提供一个符号链接名称,通过存储在该设备上的内容(即数据)中的唯一标识符 (UUID)指向存储设备。例如:

/dev/disk/by-uuid/3e6be9de-8139-11d1-9106-a43f08d823a6

您可以使用以下语法使用 UUID 引用 /etc/fstab 文件中的设备:

UUID=3e6be9de-8139-11d1-9106-a43f08d823a6

您可以在创建文件系统时配置 UUID 属性,您也可以稍后修改它。

/dev/disk/by-label/ 中的 Label 属性

这个目录中的条目提供了一个符号链接名称,它们使用保存在该设备中的内容(即数据)的一个 label 指向存储设备。

例如:

/dev/disk/by-label/Boot

您可以使用以下语法使用该标签指向 /etc/fstab 文件中的设备:

LABEL=Boot

您可以在创建文件系统时配置 Label 属性,您也可以稍后修改它。

4.3.2. 设备识别符

/dev/disk/by-id/ 中的 WWID 属性

全球识别符(WWID)是一个持久的、系统独立的标识符,SCSI 标准要求所有 SCSI 设备都使用它。保证 WWID 标识符对于每个存储设备都是唯一的,并且独立于用于访问该设备的路径。标识符是设备的属性,但不存储在设备上的内容(即数据)中。

可通过发出 SCSI 询问来检索设备识别产品数据(第 0x83页)或单元序列号(第 0x80页)来获取这个标识符。

Red Hat Enterprise Linux 自动维护从基于 WWID 的设备名称到该系统中的当前 /dev/sd 名称的正确映射。应用程序可以使用 /dev/disk/by-id/ 名称来引用磁盘上的数据,即使设备的路径有变化,即使从不同系统访问该设备也是如此。

例 4.1. WWID 映射

WWID 符号链接非持久性设备备注

/dev/disk/by-id/scsi-3600508b400105e210000900000490000

/dev/sda

具有页面 0x83 标识符的设备

/dev/disk/by-id/scsi-SSEAGATE_ST373453LW_3HW1RHM6

/dev/sdb

具有页面 0x80 标识符的设备

/dev/disk/by-id/ata-SAMSUNG_MZNLN256HMHQ-000L7_S2WDNX0J336519-part3

/dev/sdc3

磁盘分区

除了系统提供的持久名称外,您还可以使用 udev 规则实现您自己的持久名称,映射到存储的 WWID。

/dev/disk/by-partuuid 中的分区 UUID 属性

分区 UUID(PARTUUID)属性标识 GPT 分区表定义的分区。

例 4.2. 分区 UUID 映射

PARTUUID 符号链接非持久性设备

/dev/disk/by-partuuid/4cd1448a-01

/dev/sda1

/dev/disk/by-partuuid/4cd1448a-02

/dev/sda2

/dev/disk/by-partuuid/4cd1448a-03

/dev/sda3

/dev/disk/by-path/ 中的 Path 属性

此属性提供一个符号链接名称,通过用于访问该设备的硬件路径引用存储设备

如果硬件路径的任何部分(如 PCI ID、目标端口或 LUN 号)发生变化,Path 属性会失败。因此 Path 属性是不可靠的。但是 Path 属性在以下情况下可能有用:

  • 您需要识别您要替换的磁盘。
  • 您计划在特定位置的磁盘中安装存储服务。

4.4. 使用 DM 多路径的通用识别符

这部分论述了全球识别符(WWID)与设备映射器多路径配置中非持久性设备名称之间的映射。

如果系统中有多路径到某个设备,DM 多路径会使用 WWID 探测到这个设备。然后 DM 多路径会在 /dev/mapper/wwid 目录中显示单个"pseudo-device",如 /dev/mapper/3600508b400105df70000e00000ac0000

multipath -l 命令显示到非持久性标识符的映射:

  • Host:Channel:Target:LUN
  • /dev/sd 名称
  • major:minor 数字

例 4.3. 多路径配置中的 WWID 映射

multipath -l 命令的一个输出示例:

3600508b400105df70000e00000ac0000 dm-2 vendor,product
[size=20G][features=1 queue_if_no_path][hwhandler=0][rw]
\_ round-robin 0 [prio=0][active]
 \_ 5:0:1:1 sdc 8:32  [active][undef]
 \_ 6:0:1:1 sdg 8:96  [active][undef]
\_ round-robin 0 [prio=0][enabled]
 \_ 5:0:0:1 sdb 8:16  [active][undef]
 \_ 6:0:0:1 sdf 8:80  [active][undef]

DM 多路径自动维护每个基于 WWID 的设备名称正确的映射,使其与系统中对应的 /dev/sd 名称对应。这些名称可在路径更改之间保留,在从不同系统访问该设备时会保持一致。

当使用 DM Multipath 的 user_friendly_names 功能时,WWID 会映射为格式 /dev/mapper/mpathN 的名称。在默认情况下,这个映射在文件 /etc/multipath/bindings 中被维护。只要该文件被维护,这些 mpathN 名称就会保留。

重要

如果使用 user_friendly_names,那么集群中需要额外的步骤来获得一致的名称。

4.5. udev 设备命名规则的限制

以下是 udev 命名规则的一些限制:

  • 执行查询时可能无法访问该设备,因为 udev 机制可能依赖于在 udev 事件处理 udev 规则时查询存储设备的能力。当设备不在服务器机箱中时,这更可能会在光纤频道、iSCSI 或者 FCoE 存储设备中发生。
  • 内核可能会随时发送 udev 事件,从而导致规则被处理,并可能会导致在无法访问该设备时删除 /dev/disk/by-*/ 链接。
  • 生成 udev 事件和处理时可能会有延迟,比如当检测到大量设备时,用户空间 udevd 服务需要一些时间来处理每个事件的规则。这可能会导致内核探测到设备以及 /dev/disk/by-*/ 名称可用时造成延迟。
  • 规则调用的 blkid 等外部程序可能会在短时间内打开该设备,从而使设备无法被其他用途访问。
  • /dev/disk/ 中由 udev 机制管理的设备名称可能会在主发行版本间有所变化,需要您更新链接。

4.6. 列出持久性命名属性

这个步骤描述了如何找到非持久性存储设备的持久命名属性。

流程

  • 要列出 UUID 和标签属性,请使用 lsblk 实用程序:

    $ lsblk --fs storage-device

    例如:

    例 4.4. 查看文件系统的 UUID 和标签

    $ lsblk --fs /dev/sda1
    
    NAME FSTYPE LABEL UUID                                 MOUNTPOINT
    sda1 xfs    Boot  afa5d5e3-9050-48c3-acc1-bb30095f3dc4 /boot
  • 要列出 PARTUUID 属性,请使用带 --output +PARTUUID 选项的 lsblk 实用程序:

    $ lsblk --output +PARTUUID

    例如:

    例 4.5. 查看分区的 PARTUUID 属性

    $ lsblk --output +PARTUUID /dev/sda1
    
    NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT PARTUUID
    sda1   8:1    0  512M  0 part /boot      4cd1448a-01
  • 要列出 WWID 属性,检查 /dev/disk/by-id/ 目录中符号链接的目标。例如:

    例 4.6. 查看系统中所有存储设备的 WWID

    $ file /dev/disk/by-id/*
    
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001
    symbolic link to ../../sda
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1
    symbolic link to ../../sda1
    /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part2
    symbolic link to ../../sda2
    /dev/disk/by-id/dm-name-rhel_rhel8-root
    symbolic link to ../../dm-0
    /dev/disk/by-id/dm-name-rhel_rhel8-swap
    symbolic link to ../../dm-1
    /dev/disk/by-id/dm-uuid-LVM-QIWtEHtXGobe5bewlIUDivKOz5ofkgFhP0RMFsNyySVihqEl2cWWbR7MjXJolD6g
    symbolic link to ../../dm-1
    /dev/disk/by-id/dm-uuid-LVM-QIWtEHtXGobe5bewlIUDivKOz5ofkgFhXqH2M45hD2H9nAf2qfWSrlRLhzfMyOKd
    symbolic link to ../../dm-0
    /dev/disk/by-id/lvm-pv-uuid-atlr2Y-vuMo-ueoH-CpMG-4JuH-AhEF-wu4QQm
    symbolic link to ../../sda2

4.7. 修改持久性命名属性

这个步骤描述了如何更改文件系统的 UUID 或 Label persistent naming 属性。

注意

更改 udev 属性是在后台进行,可能需要很长时间。udevadm settle 命令会等待更改完全注册,这样可确保您的下一个命令能够正确使用新属性。

在以下命令中:

  • 使用您要设置的 UUID 替换 new-uuid,例如: 1cdfbc07-1c90-4984-b5ec-f61943f5ea50。您可以使用 uuidgen 命令生成 UUID。
  • 使用标签替换 new-label,例如 backup_data

先决条件

  • 如果您要修改 XFS 文件系统的属性,首先卸载它。

流程

  • 要更改 XFS 文件系统 的 UUID 或标签属性,请使用 xfs_admin 实用程序:

    # xfs_admin -U new-uuid -L new-label storage-device
    # udevadm settle
  • 要更改 ext4ext3ext2 文件系统的 UUID 或标签属性,请使用 tune2fs 工具:

    # tune2fs -U new-uuid -L new-label storage-device
    # udevadm settle
  • 要更改交换卷的 UUID 或标签属性,请使用 swaplabel 实用程序:

    # swaplabel --uuid new-uuid --label new-label swap-device
    # udevadm settle

第 5 章 使用 NVDIMM 持久性内存存储

作为系统管理员,您可以在连接到您的系统的非线性内存模块(NVDIMM)设备上启用和管理各种类型的存储。

有关在 NVDIMM 存储中安装 Red Hat Enterprise Linux 8,请参阅安装到 NVDIMM 设备

5.1. NVDIMM 持久内存技术

NVDIMM 持久内存(也称为存储类内存或 pmem )是内存和存储的组合。

NVDIMM 将存储的持久性与低访问延迟和高带宽动态 RAM(DRAM)相结合:

  • NVDIMM 存储是字节可寻址的,因此可使用 CPU 负载和存储说明访问它。除了访问基于块的传统存储所需的 read()write() 系统调用外,NVDIMM 还支持直接负载和存储编程模型。
  • NVDIMM 的性能特征与访问延迟非常低的 DRAM 非常低,通常以十亿纳秒为单位。
  • 当电源关闭时,保存在 NVDIMM 中的数据(如存储数据)会被保留。
  • 直接访问(DAX)技术使应用程序能够直接访问内存映射存储,无需通过系统页面缓存。这样便可为其他目的释放 DRAM。

在以下用例中 NVDIMM 很有用,比如:

数据库
NVDIMM 减少的存储访问延迟可显著提高数据库性能。
快速重启

快速重启也被称为热缓存效果。例如:文件服务器在启动后没有在内存中的文件内容。客户端连接和读取或者写入数据时,会在页面缓存中缓存这些数据。最后,缓存包括大多数热数据。重启后,该系统必须在传统存储上再次启动该进程。

如果应用程序设计正确,NVDIMM 可让应用程序在重启后保留热缓存。在本例中,不会涉及页面缓存:应用将数据直接缓存到持久内存中。

快速写缓存
在数据被存入持久介质前,文件服务器通常不会确认客户端的写入请求。使用 NVDIMM 作为快速写入缓存可让文件服务器快速确认写入请求,因为会较低延迟。

5.2. NVDIMM 交集和地区

NVDIMM 设备支持分组到交集区域。

NVDIMM 设备可以像常规 DRAM 一样分组为 interleave 组件。interleave 集与跨多个 DIMM 的 RAID 0 级别(条带)配置类似。Interleave 集也称为 区域(region)

交集具有以下优点:

  • NVDIMM 设备配置为交集时可受益于提升的性能。
  • 交集可将多个较小的 NVDIMM 设备组合成更大的逻辑设备。

NVDIMM 交集是在系统 BIOS 或 UEFI 固件中配置的。

Red Hat Enterprise Linux 为每个交集创建一个区域设备。

5.3. NVDIMM 命名空间

NVDIMM 区域被分成一个或多个命名空间。命名空间允许您根据命名空间类型,使用不同的方法访问该设备。

有些 NVDIMM 设备不支持区域中的多个命名空间:

  • 如果您的 NVDIMM 设备支持标签,您可以将区域重新划分到命名空间。
  • 如果您的 NVDIMM 设备不支持标签,则区域只能包含单个命名空间。在这种情况下,Red Hat Enterprise Linux 会创建一个覆盖整个区域的默认命名空间。

5.4. NVDIMM 访问模式

您可以将 NVDIMM 命名空间配置为使用以下模式之一:

sector

将存储显示为一个快速块设备。此模式适用于尚未修改为使用 NVDIMM 存储的旧应用程序,或用于利用完整 I/O 堆栈(包括设备映射器)的应用程序。

sector 设备可以与系统中的其它块设备相同。您可以在其中创建分区或文件系统,将其配置为软件 RAID 集的一部分,或者将其用作 dm-cache 的缓存设备。

此模式中的设备位于 /dev/pmemNs。请参阅创建命名空间后列出的 blockdev 值。

devdax,或者设备直接访问(DAX)

支持 NVDIMM 设备支持直接访问编程,如存储网络行业协会(SNIA)非Volatile Memory(NVM)编程模型规格中所述。在这种模式中,I/O 绕过内核的存储堆栈。因此无法使用设备映射器驱动程序。

设备 DAX 通过使用 DAX 字符设备节点提供对 NVDIMM 存储的原始访问。使用 CPU 缓存清除和隔离说明,可以使 devdax 设备中的数据持久化。某些数据库和虚拟机系统管理程序可能会从此模式中受益。无法在 devdax 设备中创建文件系统。

此模式中的设备位于 /dev/daxN.M。请参阅创建命名空间后列出的 chardev 值。

fsdax,或者文件系统直接访问(DAX)

支持 NVDIMM 设备支持直接访问编程,如存储网络行业协会(SNIA)非Volatile Memory(NVM)编程模型规格中所述。在这种模式中,I/O 绕过内核的存储堆栈,因此无法使用许多设备映射器驱动程序。

您可以在文件系统 DAX 设备中创建文件系统。

此模式中的设备位于 /dev/pmemN。请参阅创建命名空间后列出的 blockdev 值。

重要

文件系统 DAX 技术仅作为技术预览提供,红帽不提供支持。

raw

显示不支持 DAX 的内存磁盘。在这个模式中,命名空间有一些限制,不应使用。

此模式中的设备位于 /dev/pmemN。请参阅创建命名空间后列出的 blockdev 值。

5.5. 在 NVDIMM 上创建扇区命名空间以充当块设备

您可以在扇区模式(也称为 旧模式 )中配置 NVDIMM 设备来支持传统的基于块的存储。

您可以:

  • 将现有命名空间重新配置为扇区模式,或者
  • 如果有可用空间,创建一个新的 sector 命名空间。

先决条件

  • 一个 NVDIMM 设备被附加到您的系统。

5.5.1. 安装 ndctl

此流程安装 ndctl 工具,用于配置和监控 NVDIMM 设备。

流程

  • 要安装 ndctl 工具程序,请使用以下命令:

    # yum install ndctl

5.5.2. 将现有的 NVDIMM 命名空间重新配置为扇区模式

此流程将 NVDIMM 命名空间重新配置为扇区模式,以用作快速块设备。

警告

重新配置命名空间会删除以前存储在命名空间中的所有数据。

先决条件

流程

  1. 将所选命名空间重新配置为扇区模式:

    # ndctl create-namespace \
            --force \
            --reconfig=namespace-ID \
            --mode=sector

    例 5.1. 在扇区模式中重新配置 namespace1.0

    namespace1.0 命名空间重新配置为使用 sector 模式:

    # ndctl create-namespace \
            --force \
            --reconfig=namespace1.0 \
            --mode=sector
    
    {
      "dev":"namespace1.0",
      "mode":"sector",
      "size":"11.99 GiB (12.87 GB)",
      "uuid":"5805480e-90e6-407e-96a4-23e1cde2ed78",
      "raw_uuid":"879d9e9f-fd43-4ed5-b64f-3bcd0781391a",
      "sector_size":4096,
      "blockdev":"pmem1s",
      "numa_node":1
    }
  2. 重新配置的命名空间现在包括在 /dev 目录中,为 /dev/pmemNs

其它资源

  • ndctl-create-namespace(1) man page

5.5.3. 在扇区模式下创建新 NVDIMM 命名空间

此流程在 NVDIMM 设备上创建新扇区命名空间,可让您将其用作传统块设备。

先决条件

流程

  1. 列出系统中有可用空间的 pmem 区域。在以下示例中,空间位于 region5region4 区域:

    # ndctl list --regions
    
    [
      {
        "dev":"region5",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-7337419320239190016
      },
      {
        "dev":"region4",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-137289417188962304
      }
    ]
  2. 在任何可用区域中,分配一个或多个命名空间:

    # ndctl create-namespace \
            --mode=sector \
            --region=regionN \
            --size=namespace-size

    例 5.2. 在区域上创建命名空间

    以下命令在 region4 中创建 36-GiB 扇区命名空间:

    # ndctl create-namespace \
            --mode=sector \
            --region=region4 \
            --size=36G
  3. 新命名空间现在位于 /dev 目录中为 /dev/pmemNs

其它资源

  • ndctl-create-namespace(1) man page

5.6. 在 NVDIMM 上创建设备 DAX 命名空间

您可以在设备 DAX 模式下配置 NVDIMM 设备来支持有直接访问功能的字符存储。

您可以:

  • 将现有命名空间重新配置为设备 DAX 模式,或者
  • 如果有可用空间,创建一个新设备 DAX 命名空间。

先决条件

  • 一个 NVDIMM 设备被附加到您的系统。

5.6.1. 设备直接访问模式中的 NVDIMM

设备直接访问(设备 DAX,devdax)为应用程序提供了直接访问存储的方法,而无需文件系统。设备 DAX 的优点是它提供了一个有保证的故障粒度,可以使用 ndctl 工具的 --align 选项进行配置

对于 Intel 64 和 AMD64 构架,支持以下故障颗粒度:

  • 4 KiB
  • 2 MiB
  • 1 GiB

设备 DAX 节点只支持以下系统调用:

  • open()
  • close()
  • mmap()

不支持 read()write() 变体,因为设备 DAX 用例与持久内存编程相关联。

5.6.2. 安装 ndctl

此流程安装 ndctl 工具,用于配置和监控 NVDIMM 设备。

流程

  • 要安装 ndctl 工具程序,请使用以下命令:

    # yum install ndctl

5.6.3. 将现有 NVDIMM 命名空间重新配置为设备 DAX 模式

此流程将 NVDIMM 设备上的命名空间重新配置为设备 DAX 模式,并允许您在命名空间中存储数据。

警告

重新配置命名空间会删除以前存储在命名空间中的所有数据。

先决条件

流程

  1. 列出系统中的所有命名空间:

    # ndctl list --namespaces --idle
    
    [
      {
        "dev":"namespace1.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":1
      },
      {
        "dev":"namespace0.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":0
      }
    ]
  2. 重新配置任何命名空间:

    # ndctl create-namespace \
            --force \
            --mode=devdax \
            --reconfig=namespace-ID

    例 5.3. 将命名空间配置为设备 DAX

    以下命令为支持 DAX 的数据存储重新配置 namespace0.0。它与 2MiB 错误粒度一致,可确保一次 2-MiB 页中的操作系统错误:

    # ndctl create-namespace \
            --force \
            --mode=devdax \
            --align=2M \
            --reconfig=namespace0.0
  3. 命名空间现在包括在 /dev/daxN.M 路径中。

其它资源

  • ndctl-create-namespace(1) man page

5.6.4. 在设备 DAX 模式下创建新 NVDIMM 命名空间

此流程在 NVDIMM 设备上创建新设备 DAX 命名空间,可让您在命名空间中存储数据。

先决条件

流程

  1. 列出系统中有可用空间的 pmem 区域。在以下示例中,空间位于 region5region4 区域:

    # ndctl list --regions
    
    [
      {
        "dev":"region5",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-7337419320239190016
      },
      {
        "dev":"region4",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-137289417188962304
      }
    ]
  2. 在任何可用区域中,分配一个或多个命名空间:

    # ndctl create-namespace \
            --mode=devdax \
            --region=regionN \
            --size=namespace-size

    例 5.4. 在区域上创建命名空间

    以下命令在 region4 中创建 36-GiB 设备 DAX 命名空间。它与 2MiB 错误粒度一致,可确保一次 2-MiB 页中的操作系统错误:

    # ndctl create-namespace \
            --mode=devdax \
            --region=region4 \
            --align=2M \
            --size=36G
    
    {
      "dev":"namespace1.2",
      "mode":"devdax",
      "map":"dev",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"5ae01b9c-1ebf-4fb6-bc0c-6085f73d31ee",
      "raw_uuid":"4c8be2b0-0842-4bcb-8a26-4bbd3b44add2",
      "daxregion":{
        "id":1,
        "size":"35.44 GiB (38.05 GB)",
        "align":2097152,
        "devices":[
          {
            "chardev":"dax1.2",
            "size":"35.44 GiB (38.05 GB)"
          }
        ]
      },
      "numa_node":1
    }
  3. 命名空间现在包括在 /dev/daxN.M 路径中。

其它资源

  • ndctl-create-namespace(1) man page

5.7. 在 NVDIMM 上创建文件系统 DAX 命名空间

您可以在文件系统 DAX 模式中配置 NVDIMM 设备来支持有直接访问功能的文件系统。

您可以:

  • 将现有命名空间重新配置为文件系统 DAX 模式,或者
  • 如果有可用空间,请创建新文件系统 DAX 命名空间。
重要

文件系统 DAX 技术仅作为技术预览提供,红帽不提供支持。

先决条件

  • 一个 NVDIMM 设备被附加到您的系统。

5.7.1. 文件系统直接访问模式中的 NVDIMM

当以文件系统直接访问(文件系统 DAX, fsdax)模式配置 NVDIMM 设备时,可以在其上创建文件系统。

任何在这个文件系统中的文件上执行 mmap() 操作的应用程序都会直接访问其存储。这启用了 NVDIMM 的直接访问编程模型。文件系统必须使用 -o dax 选项挂载才能进行直接映射。

按页元数据分配

这个模式需要在系统 DRAM 或者 NVDIMM 设备本身中分配每个页面的元数据。每个 4 KiB 页的这个数据结构的开销是 64 字节:

  • 在小设备中,开销非常小,足以满足 DRAM 的要求。例如,16-GiB 命名空间只需要 256 MiB 作为页面结构。因为 NVDIMM 设备通常比较小且昂贵,所以最好将页面跟踪数据结构保存在 DRAM 中。
  • 在大小为 TB 或更大的 NVDIMM 设备中,存储页面跟踪数据结构所需的内存量可能会超过系统中 DRAM 的数量。一个 NVDIMM TiB 只需要 16 GiB 用于页面结构。因此,在这种情况下,最好在 NVDIMM 本身中存储数据结构。

您可以在配置命名空间时使用 --map 选项配置每个页面元数据的存储位置:

  • 要在系统 RAM 中分配,请使用 --map=mem
  • 要分配 NVDIMM,请使用 --map=dev
fsdax 中的分区和文件系统

当在 fsdax 设备中创建分区时,分区必须按页界限一致。在 Intel 64 和 AMD64 构架中,启动和结束分区至少需要 4 KiB 校对。2 MiB 是首选的校对。

在 Red Hat Enterprise Linux 8 中,作为技术预览可在 NVDIMM 上创建 XFS 和 ext4 文件系统。

5.7.2. 安装 ndctl

此流程安装 ndctl 工具,用于配置和监控 NVDIMM 设备。

流程

  • 要安装 ndctl 工具程序,请使用以下命令:

    # yum install ndctl

5.7.3. 将现有 NVDIMM 命名空间重新配置为文件系统 DAX 模式

此流程将 NVDIMM 设备上的命名空间重新配置为文件系统 DAX 模式,并允许您在命名空间中存储文件。

警告

重新配置命名空间会删除以前存储在命名空间中的所有数据。

先决条件

流程

  1. 列出系统中的所有命名空间:

    # ndctl list --namespaces --idle
    
    [
      {
        "dev":"namespace1.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":1
      },
      {
        "dev":"namespace0.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":0
      }
    ]
  2. 重新配置任何命名空间:

    # ndctl create-namespace \
            --force \
            --mode=fsdax \
            --reconfig=namespace-ID

    例 5.5. 将命名空间配置为文件系统 DAX

    要将 namespace0.0 用于支持 DAX 的文件系统,请使用以下命令:

    # ndctl create-namespace \
            --force \
            --mode=fsdax \
            --reconfig=namespace0.0
    
    {
      "dev":"namespace0.0",
      "mode":"fsdax",
      "size":"32.00 GiB (34.36 GB)",
      "uuid":"ab91cc8f-4c3e-482e-a86f-78d177ac655d",
      "blockdev":"pmem0",
      "numa_node":0
    }
  3. 命名空间现在包括在 /dev/pmemN 路径中。

其它资源

  • ndctl-create-namespace(1) man page

5.7.4. 在文件系统 DAX 模式下创建新 NVDIMM 命名空间

此流程在 NVDIMM 设备上创建新文件系统 DAX 命名空间,可让您在命名空间中存储文件。

先决条件

流程

  1. 列出系统中有可用空间的 pmem 区域。在以下示例中,空间位于 region5region4 区域:

    # ndctl list --regions
    
    [
      {
        "dev":"region5",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-7337419320239190016
      },
      {
        "dev":"region4",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-137289417188962304
      }
    ]
  2. 在任何可用区域中,分配一个或多个命名空间:

    # ndctl create-namespace \
            --mode=fsdax \
            --region=regionN \
            --size=namespace-size

    例 5.6. 在区域上创建命名空间

    以下命令在 region4 中创建 36-GiB 文件系统 DAX 命名空间:

    # ndctl create-namespace \
            --mode=fsdax \
            --region=region4 \
            --size=36G
    
    {
      "dev":"namespace4.0",
      "mode":"fsdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"9c5330b5-dc90-4f7a-bccd-5b558fa881fe",
      "blockdev":"pmem4",
      "numa_node":0
    }
  3. 命名空间现在包括在 /dev/pmemN 路径中。

其它资源

  • ndctl-create-namespace(1) man page

5.7.5. 在文件系统 DAX 设备中创建文件系统

这个过程在文件系统 DAX 设备中创建文件系统,并挂载文件系统。

流程

  1. 另外,还可在文件系统 DAX 设备中创建分区。请参阅 第 3.3 节 “创建分区”

    默认情况下,parted 工具在 1 MiB 边界对齐分区。对于第一个分区,指定 2 MiB 作为分区的起点。如果分区的大小是 2 MiB 的倍数,则所有其他分区也都一致。

  2. 在分区或者 NVDIMM 设备中创建 XFS 或者 ext4 文件系统。

    对于 XFS,禁用共享 copy-on-write 数据扩展,因为它们与 dax 挂载选项不兼容。另外,为了增加大页面映射的可能性,请设置条带单元和分条宽度。

    # mkfs.xfs -m reflink=0 -d su=2m,sw=1 fsdax-partition-or-device
  3. 使用 -o dax 挂载选项挂载文件系统:

    # mount -o dax fsdax-partition-or-device mount-point
  4. 应用程序现在可以使用持久内存并在挂载点目录中创建文件,打开文件,并使用 mmap 操作映射文件以进行直接访问。

其它资源

  • mkfs.xfs(8) man page

5.8. NVDIMM 持久内存故障排除

您可以在 NVDIMM 设备中检测并修复不同类型的错误。

先决条件

  • NVDIMM 设备已连接到您的系统并进行了配置。

5.8.1. 安装 ndctl

此流程安装 ndctl 工具,用于配置和监控 NVDIMM 设备。

流程

  • 要安装 ndctl 工具程序,请使用以下命令:

    # yum install ndctl

5.8.2. 使用 S.M.A.R.T 监控 NVDIMM 健康状况。

有些 NVDIMM 设备支持自助服务、分析和报告技术(S.M.A.R.T.)界面来获取健康信息。

重要

定期监控 NVDIMM 健康状况以防止数据丢失。如果 S.M.A.R.T. 报告 NVDIMM 设备的健康状况出现问题,则替换它,如 第 5.8.3 节 “检测和替换断开问题的 NVDIMM 设备” 所述。

先决条件

  • 在有些系统中,必须载入 acpi_ipmi 驱动程序才能检索健康信息:

    # modprobe acpi_ipmi

流程

  • 要访问健康信息,请使用以下命令:

    # ndctl list --dimms --health
    
    ...
        {
          "dev":"nmem0",
          "id":"802c-01-1513-b3009166",
          "handle":1,
          "phys_id":22,
          "health":
          {
            "health_state":"ok",
            "temperature_celsius":25.000000,
            "spares_percentage":99,
            "alarm_temperature":false,
            "alarm_spares":false,
            "temperature_threshold":50.000000,
            "spares_threshold":20,
            "life_used_percentage":1,
            "shutdown_state":"clean"
          }
         }
    ...

其它资源

  • ndctl-list(1) man page

5.8.3. 检测和替换断开问题的 NVDIMM 设备

如果您在系统日志或者 S.M.A.R.T. 中发现与 NVDIMM 相关的错误消息,这可能意味着 NVDIMM 设备失败。在这种情况下,需要:

  1. 检测哪个 NVDIMM 设备失败
  2. 备份保存的数据
  3. 物理替换该设备

流程

  1. 要检测出问题的设备,请使用以下命令:

    # ndctl list --dimms --regions --health --media-errors --human

    badblocks 字段显示哪些 NVDIMM 有问题。在 dev 字段中记录它的名称。

    例 5.7. NVDIMM 设备的健康状态

    在以下示例中,名为 nmem0 的 NVDIMM 有问题:

    # ndctl list --dimms --regions --health --media-errors --human
    
    ...
      "regions":[
        {
          "dev":"region0",
          "size":"250.00 GiB (268.44 GB)",
          "available_size":0,
          "type":"pmem",
          "numa_node":0,
          "iset_id":"0xXXXXXXXXXXXXXXXX",
          "mappings":[
            {
              "dimm":"nmem1",
              "offset":"0x10000000",
              "length":"0x1f40000000",
              "position":1
            },
            {
              "dimm":"nmem0",
              "offset":"0x10000000",
              "length":"0x1f40000000",
              "position":0
            }
          ],
          "badblock_count":1,
          "badblocks":[
            {
              "offset":65536,
              "length":1,
              "dimms":[
                "nmem0"
              ]
            }
          ],
          "persistence_domain":"memory_controller"
        }
      ]
    }
  2. 使用以下命令查找有问题的 NVDIMM 的 phys_id 属性:

    # ndctl list --dimms --human

    在前面的例子中,您知道 nmem0 是有问题的 NVDIMM。因此,找到 nmem0phys_id 属性。

    例 5.8. NVDIMM 的 phys_id 属性

    在以下示例中,phys_id0x10:

    # ndctl list --dimms --human
    
    [
      {
        "dev":"nmem1",
        "id":"XXXX-XX-XXXX-XXXXXXXX",
        "handle":"0x120",
        "phys_id":"0x1c"
      },
      {
        "dev":"nmem0",
        "id":"XXXX-XX-XXXX-XXXXXXXX",
        "handle":"0x20",
        "phys_id":"0x10",
        "flag_failed_flush":true,
        "flag_smart_event":true
      }
    ]
  3. 使用以下命令查找有问题的 NVDIMM 的内存插槽:

    # dmidecode

    在输出中,找到 Handle 标识符与有问题的 NVDIMM 的 phys_id 属性匹配的条目。Locator 字段列出了无法正常工作的 NVDIMM 使用的内存插槽。

    例 5.9. NVDIMM 内存插槽列表

    在以下示例中,nmem0 设备与 0x0010 标识符匹配,并使用 DIMM-XXX-YYYY 内存插槽:

    # dmidecode
    
    ...
    Handle 0x0010, DMI type 17, 40 bytes
    Memory Device
            Array Handle: 0x0004
            Error Information Handle: Not Provided
            Total Width: 72 bits
            Data Width: 64 bits
            Size: 125 GB
            Form Factor: DIMM
            Set: 1
            Locator: DIMM-XXX-YYYY
            Bank Locator: Bank0
            Type: Other
            Type Detail: Non-Volatile Registered (Buffered)
    ...
  4. 备份 NVDIMM 上的命名空间中的所有数据。如果您在替换 NVDIMM 前没有备份数据,当您从系统中删除 NVDIMM 时数据将会丢失。

    警告

    在某些情况下,比如 NVDIMM 完全无法正常工作,备份可能会失败。

    要防止这种情况,使用 S.M.A.R.T 定期监控 NVDIMM 设备,如 第 5.8.2 节 “使用 S.M.A.R.T 监控 NVDIMM 健康状况。” 所述,并在出现问题前替换失败的 NVDIMM。

    使用以下命令列出 NVDIMM 上的命名空间:

    # ndctl list --namespaces --dimm=DIMM-ID-number

    例 5.10. NVDIMM 命名空间列表

    在以下示例中, nmem0 设备包含需要备份的 namespace0.0namespace0.2 命名空间:

    # ndctl list --namespaces --dimm=0
    
    [
      {
        "dev":"namespace0.2",
        "mode":"sector",
        "size":67042312192,
        "uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "raw_uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "sector_size":4096,
        "blockdev":"pmem0.2s",
        "numa_node":0
      },
      {
        "dev":"namespace0.0",
        "mode":"sector",
        "size":67042312192,
        "uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "raw_uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "sector_size":4096,
        "blockdev":"pmem0s",
        "numa_node":0
      }
    ]
  5. 以物理方式替换失效的 NVDIMM。

其它资源

  • ndctl-list(1) man page
  • dmidecode(8) man page

第 6 章 丢弃未使用块

您可以在支持它们的块设备中执行或调度丢弃操作。

6.1. 块忽略操作

块忽略操作丢弃了被挂载的文件系统不再使用的块。它们在以下方面很有用:

  • 固态驱动器(SSD)
  • 精简置备存储

要求

基本文件系统的块设备必须支持物理的丢弃(discard)操作。

如果 /sys/block/device/queue/discard_max_bytes 文件中的值不是零,则代表支持物理丢弃操作。

6.2. 块丢弃操作的类型

您可以使用不同方法运行 discard 操作:

批量丢弃
由用户明确运行。它们丢弃所选文件系统中的所有未使用块。
在线丢弃
在挂载时指定。它们在没有用户干预的情况下实时运行。在线丢弃操作只丢弃从已使用到空闲的块。
定期丢弃
systemd 服务定期运行的批处理操作。

XFS 和 ext4 文件系统以及 VDO 支持所有类型。

建议

红帽建议您使用批处理或周期性丢弃。

仅在以下情况下使用在线丢弃:

  • 系统负载不允许使用批量丢弃,或者
  • 为了保持性能,需要在线丢弃操作。

6.3. 执行批块丢弃

这个过程执行批块丢弃操作,忽略挂载的文件系统中未使用的块。

先决条件

  • 挂载文件系统。
  • 文件系统底层的块设备支持物理忽略操作。

流程

  • 使用 fstrim 实用程序:

    • 要只在所选文件系统中执行丢弃,请使用:

      # fstrim mount-point
    • 要在所有挂载的文件系统中执行丢弃,请使用:

      # fstrim --all

如果您在其中执行 fstrim 命令:

  • 不支持丢弃操作的设备,或者
  • 由多个设备组成的逻辑设备(LVM 或者 MD),其中任意设备不支持丢弃操作:

下面的信息将显示:

# fstrim /mnt/non_discard

fstrim: /mnt/non_discard: the discard operation is not supported

其它资源

  • fstrim(8) man page

6.4. 启用在线块丢弃

这个过程启用在线块丢弃操作,该操作可自动丢弃所有支持的文件系统中未使用的块。

流程

  • 在挂载时启用在线丢弃:

    • 在手动挂载文件系统时,添加 -o discard 挂载选项:

      # mount -o discard device mount-point
    • 当永久挂载文件系统时,将 discard 选项添加到 /etc/fstab 文件中的挂载条目中。

其它资源

  • mount(8) man page
  • fstab(5) man page

6.5. 使用 RHEL 系统角色启用在线块丢弃

这部分论述了如何使用角色启用在线块丢弃 storage

先决条件

  • 已存在包括 storage 角色的 Ansible playbook。

如需有关如何应用此 playbook 的信息,请参阅 应用角色

6.5.1. 启用在线块丢弃的 Ansible playbook 示例

本节提供了一个 Ansible playbook 示例。此 playbook 应用 storage 角色来挂载启用了在线块丢弃的 XFS 文件系统。

例 6.1. 一个 playbook,它在 /mnt/data/ 上启用在线块丢弃功能

---
- hosts: all
  vars:
    storage_volumes:
      - name: barefs
        type: disk
        disks:
          - sdb
        fs_type: xfs
        mount_point: /mnt/data
        mount_options: discard
  roles:
    - rhel-system-roles.storage

其它资源

  • 有关 storage 系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

6.6. 启用定期块丢弃

这个过程启用一个 systemd 计时器,它会定期丢弃所有支持的文件系统中未使用的块。

流程

  • 启用并启动 systemd 计时器:

    # systemctl enable --now fstrim.timer

第 7 章 iSCSI 入门

Red Hat Enterprise Linux 8 使用 targetcli shell 作为命令行界面执行以下操作:

  • 添加、删除、查看和监控 iSCSI 存储间的连接来利用 iSCSI 硬件。
  • 将由文件、卷、本地 SCSI 设备或者 RAM 磁盘支持的本地存储资源导出到远程系统。

targetcli 工具具有基于树的布局,包括内置的标签页完成、自动完成支持和内联文档。

7.1. 添加 iSCSI 目标

作为系统管理员,您可以使用 targetcli 工具添加 iSCSI 对象。

7.1.1. 安装 targetcli

安装 targetcli 工具来添加、监控和删除 iSCSI 存储间的连接。

流程

  1. 安装 targetcli:

    # yum install targetcli
  2. 启动目标服务:

    # systemctl start target
  3. 将目标配置为在引导时启动:

    # systemctl enable target
  4. 在防火墙中打开端口 3260 并重新载入防火墙配置:

    # firewall-cmd --permanent --add-port=3260/tcp
    Success
    
    # firewall-cmd --reload
    Success
  5. 查看 targetcli 布局:

    # targetcli
    /> ls
    o- /........................................[...]
      o- backstores.............................[...]
      | o- block.................[Storage Objects: 0]
      | o- fileio................[Storage Objects: 0]
      | o- pscsi.................[Storage Objects: 0]
      | o- ramdisk...............[Storage Objects: 0]
      o- iscsi...........................[Targets: 0]
      o- loopback........................[Targets: 0]

其它资源

  • targetcli man page。

7.1.2. 创建 iSCSI 目标

创建 iSCSI 目标可让客户端的 iSCSI 发起程序访问服务器中的存储设备。目标和发起方都有唯一的标识名称。

先决条件

流程

  1. 进入 iSCSI 目录:

    /> iscsi/
    注意

    cd 命令用于更改目录以及列出要移动到的路径。

  2. 使用以下选项之一创建 iSCSI 对象:

    1. 使用默认目标名称创建 iSCSI 对象:

      /iscsi> create
      
      Created target
      iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.78b473f296ff
      Created TPG1
    2. 使用特定名称创建 iSCSI 对象:

      /iscsi> create iqn.2006-04.com.example:444
      
      Created target iqn.2006-04.com.example:444
      Created TPG1
      Here iqn.2006-04.com.example:444 is target_iqn_name

      iqn.2006-04.com.example:444 替换为特定目标名称。

  3. 验证新创建的目标:

    /iscsi> ls
    
    o- iscsi.......................................[1 Target]
        o- iqn.2006-04.com.example:444................[1 TPG]
            o- tpg1...........................[enabled, auth]
               o- acls...............................[0 ACL]
                o- luns...............................[0 LUN]
               o- portals.........................[0 Portal]

其它资源

  • targetcli man page。

7.1.3. iSCSI Backstore

iSCSI 后端存储支持将导出的 LUN 数据存储在本地计算机上的不同方法。创建存储对象定义了后端存储使用的资源。管理员可以选择 Linux-IO(LIO)支持的以下后端存储设备:

其它资源

  • targetcli man page。

7.1.4. 创建 fileio 存储对象

fileio 存储对象可以支持 write_backwrite_thru 操作。write_back 操作启用本地文件系统缓存。这提高了性能,但会增加数据丢失的风险。建议使用 write_back=false 来禁用 write_back 操作,而使用 write_thru 操作。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 创建一个 fileio 存储对象:

    /> backstores/fileio create file1 /tmp/disk1.img 200M write_back=false
    
    Created fileio file1 with size 209715200
  3. 验证创建的 fileio 存储对象:

    /backstores> ls

其它资源

  • targetcli man page。

7.1.5. 创建块存储对象

块驱动程序允许使用 /sys/block/ 目录中显示的任何块设备与 Linux-IO(LIO)一起使用。这包括物理设备(如 HDD、SSD、CD、DVD)和逻辑设备(如软件或硬件 RAID 卷或 LVM 卷)。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 创建 block 后端存储:

    /> backstores/block create name=block_backend dev=/dev/sdb
    
    Generating a wwn serial.
    Created block storage object block_backend using /dev/vdb.
  3. 验证创建的 block 存储对象:

    /backstores> ls
    注意

    您还可以在逻辑卷中创建块后备存储。

其它资源

  • targetcli man page。

7.1.6. 创建 pscsi 存储对象

您可以将任何支持直接传递 SCSI 命令的存储对象配置为没有 SCSI 模拟的后端存储,并带有一个底层 SCSI 设备,它出现在 /proc/scsi/scsilsscsi (如一个 SAS 硬盘)。这个子系统支持 SCSI-3 及更高系统。

警告

pscsi 应该只供高级用户使用。设备固件中通常不实施高级 SCSI 命令,如非对称逻辑单元分配(ALUA)或持久保留(例如,VMware ESX 和 vSphere 使用的命令),并可能导致故障或崩溃。当有疑问时,在生产环境中使用 block 后端存储。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 为物理 SCSI 设备创建一个 pscsi 后端存储,在这个示例中是使用 /dev/sr0 的 TYPE_ROM 设备:

    /> backstores/pscsi/ create name=pscsi_backend dev=/dev/sr0
    
    Generating a wwn serial.
    Created pscsi storage object pscsi_backend using /dev/sr0
  3. 验证创建的 pscsi 存储对象:

    /backstores> ls

其它资源

  • targetcli man page。

7.1.7. 创建内存副本 RAM 磁盘存储对象

内存复制 RAM 磁盘(ramdisk)为 RAM 磁盘提供完整的 SCSI 模拟和独立的内存映射,使用内存副本作为启动器。这为多会话提供了功能,在用于生产目的的快速和可变量存储中特别有用。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 创建 1GB RAM 磁盘后备存储:

    /> backstores/ramdisk/ create name=rd_backend size=1GB
    
    Generating a wwn serial.
    Created rd_mcp ramdisk rd_backend with size 1GB.
  3. 验证创建的 ramdisk 存储对象:

    /backstores> ls

其它资源

  • targetcli man page。

7.1.8. 创建 iSCSI 门户

创建 iSCSI 门户,为目标添加一个 IP 地址和端口来启用目标。

先决条件

流程

  1. 进入 TPG 目录:

    /iscsi> iqn.2006-04.example:444/tpg1/
  2. 使用以下选项之一创建 iSCSI 门户:

    1. 创建默认门户使用默认 iSCSI 端口 3260,并允许目标侦听该端口上的所有 IP 地址:

      /iscsi/iqn.20...mple:444/tpg1> portals/ create
      
      Using default IP port 3260
      Binding to INADDR_Any (0.0.0.0)
      Created network portal 0.0.0.0:3260
      注意

      当创建 iSCSI 目标时,也会创建一个默认门户网站。此门户设置为侦听所有 IP 地址,其默认端口号为: 0.0.0.0:3260

      删除默认门户网站:

      /iscsi/iqn-name/tpg1/portals delete ip_address=0.0.0.0 ip_port=3260

    2. 使用特定 IP 地址创建门户:

      /iscsi/iqn.20...mple:444/tpg1> portals/ create 192.168.122.137
      
      Using default IP port 3260
      Created network portal 192.168.122.137:3260
  3. 验证新创建的门户网站:

    /iscsi/iqn.20...mple:444/tpg1> ls
    
    o- tpg.................................. [enambled, auth]
        o- acls ......................................[0 ACL]
        o- luns ......................................[0 LUN]
        o- portals ................................[1 Portal]
           o- 192.168.122.137:3260......................[OK]

其它资源

  • targetcli man page。

7.1.9. 创建 iSCSI LUN

逻辑单元号(LUN)是受 iSCSI 后端存储支持的物理设备。每个 LUN 都有唯一的数字。

先决条件

流程

  1. 创建已创建的存储对象的 LUN:

    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/ramdisk/rd_backend
    Created LUN 0.
    
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/block/block_backend
    Created LUN 1.
    
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/fileio/file1
    Created LUN 2.
  2. 验证创建的 LUN:

    /iscsi/iqn.20...mple:444/tpg1> ls
    
    o- tpg.................................. [enambled, auth]
        o- acls ......................................[0 ACL]
        o- luns .....................................[3 LUNs]
        |  o- lun0.........................[ramdisk/ramdisk1]
        |  o- lun1.................[block/block1 (/dev/vdb1)]
        |  o- lun2...................[fileio/file1 (/foo.img)]
        o- portals ................................[1 Portal]
            o- 192.168.122.137:3260......................[OK]

    默认 LUN 名称从 0 开始。

    重要

    默认情况下,使用读写权限创建 LUN。如果在创建 ACL 后添加了新 LUN,LUN 会自动映射到所有可用 ACL,并可能导致安全风险。要创建具有只读权限的 LUN,请参考 第 7.1.10 节 “创建只读 iSCSI LUN”

  3. 配置 ACL。更多信息请参阅 第 7.1.11 节 “创建 iSCSI ACL”

其它资源

  • targetcli man page。

7.1.10. 创建只读 iSCSI LUN

默认情况下,使用读写权限创建 LUN。这个步骤描述了如何创建只读 LUN。

先决条件

流程

  1. 设置只读权限:

    /> set global auto_add_mapped_luns=false
    
    Parameter auto_add_mapped_luns is now 'false'.

    这样可防止 LUN 自动映射到现有 ACL,从而允许手动映射 LUN。

  2. 创建 LUN:

    /> iscsi/target_iqn_name/tpg1/acls/initiator_iqn_name/ create mapped_lun=next_sequential_LUN_number tpg_lun_or_backstore=backstore write_protect=1

    例如:

    /> iscsi/iqn.2006-04.example:444/tpg1/acls/2006-04.com.example.foo:888/ create mapped_lun=1 tpg_lun_or_backstore=/backstores/block/block2 write_protect=1
    
    Created LUN 1.
    Created Mapped LUN 1.
  3. 验证所创建的 LUN:

    /> ls
    
    o- / ...................................................... [...]
      o- backstores ........................................... [...]
      <snip>
      o- iscsi ......................................... [Targets: 1]
      | o- iqn.2006-04.example:444 .................. [TPGs: 1]
      |   o- tpg1 ............................ [no-gen-acls, no-auth]
      |     o- acls ....................................... [ACLs: 2]
      |     | o- 2006-04.com.example.foo:888 .. [Mapped LUNs: 2]
      |     | | o- mapped_lun0 .............. [lun0 block/disk1 (rw)]
      |     | | o- mapped_lun1 .............. [lun1 block/disk2 (ro)]
      |     o- luns ....................................... [LUNs: 2]
      |     | o- lun0 ...................... [block/disk1 (/dev/vdb)]
      |     | o- lun1 ...................... [block/disk2 (/dev/vdc)]
      <snip>

    mapping_lun1 行现在在结尾有(ro)(不像 mapping_lun0 的(rw))表示它是只读的。

  4. 配置 ACL。更多信息请参阅 第 7.1.11 节 “创建 iSCSI ACL”

其它资源

  • targetcli man page。

7.1.11. 创建 iSCSI ACL

targetcli 中,访问控制列表(ACL)用于定义访问规则,每个发起方都对 LUN 有独占访问权限。目标和发起方都有唯一的标识名称。您必须知道配置 ACL 的发起方的唯一名称。iSCSI 发起程序可在 /etc/iscsi/initiatorname.iscsi 文件中找到。

先决条件

流程

  1. 进入 acls 目录

    /iscsi/iqn.20...mple:444/tpg1> acls/
  2. 使用以下选项之一创建 ACL:

    1. 使用启动器上 /etc/iscsi/initiatorname.iscsi 文件中的启动器名称。
    2. 使用更容易记住的名称,请参阅 第 7.1.12 节 “创建 iSCSI 启动程序” 部分以确保 ACL 与启动器匹配。

      /iscsi/iqn.20...444/tpg1/acls> create iqn.2006-04.com.example.foo:888
      
      Created Node ACL for iqn.2006-04.com.example.foo:888
      Created mapped LUN 2.
      Created mapped LUN 1.
      Created mapped LUN 0.
      注意

      上例中使用的全局设置 auto_add_mapped_luns 会自动将 LUN 映射到任何创建的 ACL。

      您可以在目标服务器上的 TPG 节点中设置用户创建的 ACL:

      /iscsi/iqn.20...scsi:444/tpg1> set attribute generate_node_acls=1
  3. 验证创建的 ACL:

    /iscsi/iqn.20...444/tpg1/acls> ls
    
    o- acls .................................................[1 ACL]
        o- iqn.2006-04.com.example.foo:888 ....[3 Mapped LUNs, auth]
            o- mapped_lun0 .............[lun0 ramdisk/ramdisk1 (rw)]
            o- mapped_lun1 .................[lun1 block/block1 (rw)]
            o- mapped_lun2 .................[lun2 fileio/file1 (rw)]

其它资源

  • targetcli man page。

7.1.12. 创建 iSCSI 启动程序

iSCSI 启动程序形成连接 iSCSI 目标的会话。有关 iSCSI 目标的详情请参考 第 7.1.2 节 “创建 iSCSI 目标”。默认情况下,iSCSI 服务被启动,服务会在运行 lazily 命令后启动。iscsiadm如果 root 没有在 iSCSI 设备中,或者没有标记为 node.startup = automatic 的节点,则在执行需要 iscsidiscsi 内核模块启动的 iscsiadm 命令前,iSCSI 服务才会启动。

要强制 iscsid 守护进程运行和 iSCSI 内核模块载入:

# systemctl start iscsid.service

先决条件

流程

  1. 在客户端机器上安装 iscsi-initiator-utils:

    # yum install iscsi-initiator-utils
  2. 检查 initiator 名称:

    # cat /etc/iscsi/initiatorname.iscsi
    
    InitiatorName=2006-04.com.example.foo:888
  3. 如果 ACL 在 第 7.1.11 节 “创建 iSCSI ACL” 中被授予自定义名称,请相应地修改 /etc/iscsi/initiatorname.iscsi 文件。

    # vi /etc/iscsi/initiatorname.iscsi
  4. 发现目标并使用显示的目标 IQN 登录到目标:

    # iscsiadm -m discovery -t st -p 10.64.24.179
        10.64.24.179:3260,1 iqn.2006-04.example:444
    
    # iscsiadm -m node -T iqn.2006-04.example:444 -l
        Logging in to [iface: default, target: iqn.2006-04.example:444, portal: 10.64.24.179,3260] (multiple)
        Login to [iface: default, target: iqn.2006-04.example:444, portal: 10.64.24.179,3260] successful.

    10.64.24.179 替换为 target-ip-address。

    如果将对应的启动器名称添加到 ACL 中,如 第 7.1.11 节 “创建 iSCSI ACL” 所述,您可以使用此流程连接到同一目标的任何数量的启动器。

  5. 找到 iSCSI 磁盘名称并在这个 iSCSI 磁盘中创建文件系统:

    # grep "Attached SCSI" /var/log/messages
    
    # mkfs.ext4 /dev/disk_name

    使用 /var/log/messages 文件中显示的 iSCSI 磁盘名称替换 disk_name

  6. 挂载文件系统:

    # mkdir /mount/point
    
    # mount /dev/disk_name /mount/point

    使用分区的挂载点替换 /mount/point

  7. 编辑 /etc/fstab 文件以便在系统引导时自动挂载文件系统:

    # vi /etc/fstab
    
    /dev/disk_name /mount/point ext4 _netdev 0 0

    使用 iSCSI 磁盘名称替换 disk_name,使用分区的挂载点替换 /mount/point

其它资源

  • targetcli man page。
  • iscsiadm man page。

7.1.13. 为目标设置 Challenge-Handshake 验证协议

Challenge-Handshake Authentication Protocol (CHAP) 允许用户使用密码保护目标。发起方必须了解这个密码才能连接到目标。

先决条件

流程

  1. 设置属性身份验证:

    /iscsi/iqn.20...mple:444/tpg1> set attribute authentication=1
    
    Parameter authentication is now '1'.
  2. 设置 useridpassword

    /tpg1> set auth userid=redhat
    Parameter userid is now 'redhat'.
    
    /iscsi/iqn.20...689dcbb3/tpg1> set auth password=redhat_passwd
    Parameter password is now 'redhat_passwd'.

其它资源

  • targetcli man page。

7.1.14. 为发起方设置 Challenge-Handshake Authentication Protocol

Challenge-Handshake Authentication Protocol (CHAP) 允许用户使用密码保护目标。发起方必须了解这个密码才能连接到目标。

先决条件

流程

  1. iscsid.conf 文件中启用 CHAP 验证:

    # vi /etc/iscsi/iscsid.conf
    
    node.session.auth.authmethod = CHAP

    默认情况下,node.session.auth.authmethod 设置为 None

  2. iscsid.conf 文件中添加目标 usernamepassword:

    node.session.auth.username = redhat
    node.session.auth.password = redhat_passwd
  3. 启动 iscsid 守护进程:

    # systemctl start iscsid.service

其它资源

  • iscsiadm man page

7.2. 监控 iSCSI 会话

作为系统管理员,您可以使用 iscsiadm 工具监控 iSCSI 会话。

7.2.1. 使用 iscsiadm 程序监控 iSCSI 会话

这个步骤描述了如何使用 iscsiadm 监控 iscsi 会话。

默认情况下,iSCSI 服务被启动,服务会在运行 lazily 命令后启动。iscsiadm如果 root 没有在 iSCSI 设备中,或者没有标记为 node.startup = automatic 的节点,则在执行需要 iscsidiscsi 内核模块启动的 iscsiadm 命令前,iSCSI 服务才会启动。

要强制 iscsid 守护进程运行和 iSCSI 内核模块载入:

# systemctl start iscsid.service

先决条件

  • 在客户端机器中安装 iscsi-initiator-utils:

    yum install iscsi-initiator-utils

流程

  1. 查找正在运行的会话的信息:

    # iscsiadm -m session -P 3

    此命令显示会话或设备状态、会话 ID(sid)、一些协商参数,以及可通过会话访问的 SCSI 设备。

    • 对于较短的输出,例如,只显示 sid-to-node 映射,请运行:

      # iscsiadm -m session -P 0
              or
      # iscsiadm -m session
      
      tcp [2] 10.15.84.19:3260,2 iqn.1992-08.com.netapp:sn.33615311
      tcp [3] 10.15.85.19:3260,3 iqn.1992-08.com.netapp:sn.33615311

      这些命令以以下格式打印正在运行的会话列表: driver [sid] target_ip:port,target_portal_group_tag proper_target_name

其它资源

  • /usr/share/doc/iscsi-initiator-utils-version/README 文件。
  • iscsiadm man page。

7.3. 删除 iSCSI 目标

作为系统管理员,您可以删除 iSCSI 目标。

7.3.1. 使用 targetcli 工具删除 iSCSI 对象

这个步骤描述了如何使用 targetcli 工具删除 iSCSI 对象。

流程

  1. 从目标登出:

    # iscsiadm -m node -T iqn.2006-04.example:444 -u

    有关如何登录到目标的详情请参考 第 7.1.12 节 “创建 iSCSI 启动程序”

  2. 删除整个目标,包括所有 ACL、LUN 和门户:

    /> iscsi/ delete iqn.2006-04.com.example:444

    iqn.2006-04.com.example:444 替换为 target_iqn_name。

    • 删除 iSCSI 后端存储:

      /> backstores/backstore-type/ delete block_backend
      • 使用 fileioblockpscsiramdisk 替换 backstore-type
      • 使用您要删除的后端存储名称替换 block_backend
    • 要删除 iSCSI 目标的部分内容,如 ACL:

      /> /iscsi/iqn-name/tpg/acls/ delete iqn.2006-04.com.example:444
  3. 查看更改:

    /> iscsi/ ls

其它资源

  • targetcli man page。

7.4. DM 多路径覆盖设备超时

recovery_tmo sysfs 选项控制特定 iSCSI 设备的超时时间。以下选项全局覆盖 recovery_tmo 值:

  • replacement_timeout 配置选项会全局覆盖所有 iSCSI 设备的 recovery_tmo 值。
  • 对于由 DM 多路径管理的所有 iSCSI 设备,DM 多路径中的 fast_io_fail_tmo 选项全局覆盖 recovery_tmo 值。

    DM 多路径中的 fast_io_fail_tmo 选项会覆盖光纤通道设备的 fast_io_fail_tmo 选项。

DM 多路径 fast_io_fail_tmo 选项优先于 replacement_timeout。红帽不推荐使用 replacement_timeout 覆盖在由 DM 多路径管理的设备中的 recovery_tmo,因为 DM 多路径总是在 multipathd 服务重新加载时重置 recovery_tmo

第 8 章 使用光纤通道设备

RHEL 8 提供以下原生 Fibre Channel 驱动程序:

  • lpfc
  • qla2xxx
  • zfcp

8.1. 重新定义光纤逻辑单位大小

作为系统管理员,您可以调整光纤通道逻辑单元的大小。

流程

  1. 要确定哪些设备是 multipath 逻辑单元的路径:

    multipath -ll
  2. 要在使用多路径的系统中重新扫描光纤通道逻辑单元:

    $ echo 1 > /sys/block/sdX/device/rescan

其它资源

  • multipath man page。

8.3. Fibre Channel 配置文件

以下是 /sys/class/ 目录中为光纤通道提供用户空间 API 的配置文件列表。

项目使用以下变量:

H
主机号
B
总线号
T
目标
L
逻辑单元(LUN)
R
远程端口号
重要

如果您的系统使用多路径软件,红帽建议您在更改本部分所述值前咨询您的硬件厂商。

/sys/class/fc_transport/targetH:B:T/ 中的传输配置

port_id
24 位端口 ID/地址
node_name
64 位节点名称
port_name
64 位端口名称

远程端口配置 /sys/class/fc_remote_ports/rport-H:B-R/

  • port_id
  • node_name
  • port_name
  • dev_loss_tmo

    控制 scsi 设备从系统中删除的时间。dev_loss_tmo 触发器后,会删除 scsi 设备。在 multipath.conf 文件中,您可以将 dev_loss_tmo 设置为 infinity

    在 Red Hat Enterprise Linux 8 中,如果您没有设置 fast_io_fail_tmo 选项,dev_loss_tmo 会被限制为 600 秒。默认情况下,如果 multipathd 服务正在运行,则 在 Red Hat Enterprise Linux 8 中 fast_io_fail_tmo 被设置为 5 秒 ; 否则,它被设置为 off

  • fast_io_fail_tmo

    指定在将链接标记为"bad"之前要等待的秒数。链接被标记为错误后,现有正在运行的 I/O 或相应路径上的任何新 I/O 将失败。

    如果 I/O 位于被阻塞的队列中,在 dev_loss_tmo 过期且队列被取消阻塞前,它不会失败。

    如果 fast_io_fail_tmo 被设置为除 off 以外的任何值,dev_loss_tmo 将被取消操作。如果将 fast_io_fail_tmo 设置为 off,则在设备从系统中删除前不会出现 I/O 失败。如果 fast_io_fail_tmo 设为一个数字,则当 fast_io_fail_tmo 超时触发时 I/O 会马上失败。

主机配置 /sys/class/fc_host/hostH/

  • port_id
  • node_name
  • port_name
  • issue_lip

    指示驱动重新发现远程端口。

8.4. DM 多路径覆盖设备超时

recovery_tmo sysfs 选项控制特定 iSCSI 设备的超时时间。以下选项全局覆盖 recovery_tmo 值:

  • replacement_timeout 配置选项会全局覆盖所有 iSCSI 设备的 recovery_tmo 值。
  • 对于由 DM 多路径管理的所有 iSCSI 设备,DM 多路径中的 fast_io_fail_tmo 选项全局覆盖 recovery_tmo 值。

    DM 多路径中的 fast_io_fail_tmo 选项会覆盖光纤通道设备的 fast_io_fail_tmo 选项。

DM 多路径 fast_io_fail_tmo 选项优先于 replacement_timeout。红帽不推荐使用 replacement_timeout 覆盖在由 DM 多路径管理的设备中的 recovery_tmo,因为 DM 多路径总是在 multipathd 服务重新加载时重置 recovery_tmo

第 9 章 使用以太网配置光纤

根据 IEEE T11 FC-BB-5 标准,使用以太网(FCoE)的光纤通道是通过以太网传输光纤通道帧的协议。通常数据中心有一个专用的 LAN 和 Storage Area Network(SAN),它和它们自己的配置是相互分开的。FCoE 将这些网络合并为一个整合的网络结构。例如 FCoE 的优点是降低硬件和能源成本。

9.1. 在 RHEL 中使用硬件 FCoE HBA

在 Red Hat Enterprise Linux 中,您可以使用以下驱动程序支持的硬件 FCoE 主机总线适配器(HBA):

  • qedf
  • bnx2fc
  • fnic

如果您使用这样的 HBA,在 HBA 设置中配置 FCoE 设置。详情请查看适配器文档。

您在设置中配置了 HBA 后,从 Storage Area Network(SAN)中导出的逻辑单元号(LUN)将自动可用于 RHEL 作为 /dev/sd* 设备。您可以使用类似本地存储设备的设备。

9.2. 设置软件 FCoE 设备

软件 FCoE 设备可让您使用部分支持 FCoE 的以太网适配器访问 FCoE 的逻辑单元号(LUN)。

重要

RHEL 不支持需要 fcoe.ko 内核模块的软件 FCoE 设备。

完成此步骤后,RHEL 会自动访问 Storage Area Network(SAN)中导出的 LUN 作为 /dev/sd* 设备。您可以使用类似本地存储设备的设备。

先决条件

  • 主机总线适配器(HBA)使用 qedfbnx2fcfnic 驱动程序,不需要 fcoe.ko 内核模块。
  • SAN 使用 VLAN 来将存储流量与普通以太网流量分开。
  • 网络切换已被配置为支持 VLAN。
  • 服务器的 HBA 在它的 BIOS 中被配置。详情请查看您的 HBA 文档。
  • HBA 连接至网络,连接是在线的。

流程

  1. 安装 fcoe-utils 软件包:

    # yum install fcoe-utils
  2. /etc/fcoe/cfg-ethx 模板文件复制到 /etc/fcoe/cfg-interface_name。例如:如果要配置 enp1s0 接口使用 FCoE,输入:

    # cp /etc/fcoe/cfg-ethx /etc/fcoe/cfg-enp1s0
  3. 启用并启动 fcoe 服务:

    # systemctl enable --now fcoe
  4. 发现 FCoE VLAN ID,启动发起程序,并为发现的 VLAN 创建网络设备:

    # fipvlan -s -c enp1s0
    Created VLAN device enp1s0.200
    Starting FCoE on interface enp1s0.200
    Fibre Channel Forwarders Discovered
    interface       | VLAN | FCF MAC
    ------------------------------------------
    enp1s0          | 200  | 00:53:00:a7:e7:1b
  5. 可选: 要显示发现的目标、LUN 和与 LUN 关联的设备详情,请输入:

    # fcoeadm -t
    Interface:        enp1s0.200
    Roles:            FCP Target
    Node Name:        0x500a0980824acd15
    Port Name:        0x500a0982824acd15
    Target ID:        0
    MaxFrameSize:     2048 bytes
    OS Device Name:   rport-11:0-1
    FC-ID (Port ID):  0xba00a0
    State:            Online
    
    LUN ID  Device Name   Capacity   Block Size  Description
    ------  -----------  ----------  ----------  ---------------------
         0  sdb           28.38 GiB      512     NETAPP LUN (rev 820a)
         ...

    这个示例显示 SAN 中的 LUN 0 已作为 /dev/sdb 设备附加到主机中。

验证步骤

  • 使用 fcoeadm -i 命令显示所有活跃 FCoE 接口的信息:

    # fcoeadm -i
    Description:      BCM57840 NetXtreme II 10 Gigabit Ethernet
    Revision:         11
    Manufacturer:     Broadcom Inc. and subsidiaries
    Serial Number:    000AG703A9B7
    
    Driver:           bnx2x Unknown
    Number of Ports:  1
    
        Symbolic Name:     bnx2fc (QLogic BCM57840) v2.12.13 over enp1s0.200
        OS Device Name:    host11
        Node Name:         0x2000000af70ae935
        Port Name:         0x2001000af70ae935
        Fabric Name:       0x20c8002a6aa7e701
        Speed:             10 Gbit
        Supported Speed:   1 Gbit, 10 Gbit
        MaxFrameSize:      2048 bytes
        FC-ID (Port ID):   0xba02c0
        State:             Online

其它资源

  • 有关 fcoeadm 工具程序的详情,请查看 fcoeadm(8) man page。
  • 有关如何在系统引导时通过软件 FCoE 挂载存储的详情,请查看 /usr/share/doc/fcoe-utils/README 文件。

9.3. 其它资源

第 10 章 使用 eh_deadline 配置存储错误恢复的最大时间

您可以配置最大允许的时间来恢复失败的 SCSI 设备。这个配置保证了 I/O 响应时间,即使存储硬件因为失败而变得无响应。

10.1. eh_deadline 参数

SCSI 错误处理(EH)机制试图在失败的 SCSI 设备中执行错误恢复。SCSI 主机对象 eh_deadline 参数允许您配置恢复的最长时间。配置的时间过期后,SCSI EH 将停止并重置整个主机总线适配器(HBA)。

使用 eh_deadline 可缩短时间:

  • 关闭失败的路径,
  • 切换路径,或者
  • 禁用 RAID 分片。
警告

eh_deadline 过期时,SCSI EH 会重置 HBA,HBA 会影响该 HBA 上的所有目标路径,而不仅仅是失败的路径。如果由于其他原因无法使用冗余路径,则可能会出现 I/O 错误。只有在所有目标中有完全冗余的多路径配置时才启用 eh_deadline

eh_deadline 很有用的情况

在大多数情况下,您不需要启用 eh_deadline。在某些情况下,使用 eh_deadline 非常有用,例如光纤通道(FC)交换机和目标端口之间的链接丢失,并且 HBA 不会收到注册状态更改通知(RSCN)。在这种情况下,I/O 请求和错误恢复命令会随时超时,而不是遇到错误。在这个环境中的 eh_deadline 设置会为恢复时间设置一个上限。这可让失败的 I/O 在由 DM 多路径的另一个可用路径中检索。

在以下情况下,eh_deadline 功能不会提供额外的好处,因为 I/O 和错误恢复命令会立即失败,这样可允许 DM 多路径重试:

  • 如果启用了 RSCN
  • 如果 HBA 没有注册链接变得不可用

可能的值

eh_deadline 的值以秒为单位指定。

默认设置为 off,它会禁用时间限制并允许进行所有错误恢复。

10.2. 设置 eh_deadline 参数

这个过程配置 eh_deadline 参数的值来限制最大 SCSI 恢复时间。

流程

  • 您可以使用以下任一方法配置 eh_deadline

    sysfs
    将秒数写入 /sys/class/scsi_host/host*/eh_deadline 文件中。
    内核参数
    使用 scsi_mod.eh_deadline 内核参数为所有 SCSI HBA 设置默认值。

第 11 章 swap 入门

这部分论述了 swap 空间以及如何使用它。

11.1. 交换(swap)空间

当物理内存(RAM)已满时,将使用 Linux 中的交换空间。如果系统需要更多内存资源并且 RAM 已满,内存中的不活动页面将移到交换空间。虽然交换空间可以帮助具有少量 RAM 的计算机,但不应将其视为替代更多 RAM。交换空间位于硬盘驱动器上,其访问时间比物理内存要慢。交换空间可以是专用的交换空间分区(推荐)、交换文件,或者交换分区和交换文件的组合。

过去数年,推荐的 swap 空间会随系统中的 RAM 量增加而线性增大。然而,现代系统通常包含了成百 GB 内存。因此,推荐的 swap 空间被视为系统内存工作负载的功能,而不是系统内存。

第 11.2 节 “推荐的系统 swap 空间” 根据您的系统 RAM 量以及是否有足够的内存供系统休眠显示推荐的 swap 分区大小。推荐的 swap 分区会在安装过程中自动建立。但是,为了允许休眠,您需要在自定义分区阶段中编辑交换空间。

第 11.2 节 “推荐的系统 swap 空间” 中的建议对于内存不足的系统(1 GB 及更少)尤为重要。无法在这些系统上分配足够的交换空间可能会导致问题(如不稳定),甚至会导致安装的系统无法引导。

11.3. 添加 swap 空间

这部分论述了如何在安装后添加更多 swap 空间。例如,您可以将系统中的 RAM 量从 1 GB 升级到 2 GB,但只有 2 GB 交换空间。如果您执行内存密集型操作或运行需要大量内存的应用程序,则可能最好将交换空间大小增加到 4 GB。

有三个选项:创建新交换分区、创建新交换文件,或者在现有 LVM2 逻辑卷上扩展交换。建议您扩展现有逻辑卷。

11.3.1. 在 LVM2 逻辑卷中扩展 swap

这个步骤描述了如何在现有 LVM2 逻辑卷中扩展交换空间。假设 /dev/VolGroup00/LogVol01 是您要扩展为 2 GB 的卷。

先决条件

  • 有足够的磁盘空间。

流程

  1. 为关联的逻辑卷禁用交换:

    # swapoff -v /dev/VolGroup00/LogVol01
  2. 将 LVM2 逻辑卷大小调整为 2 GB:

    # lvresize /dev/VolGroup00/LogVol01 -L +2G
  3. 格式化新 swap 空间:

    # mkswap /dev/VolGroup00/LogVol01
  4. 启用扩展的逻辑卷:

    # swapon -v /dev/VolGroup00/LogVol01
  5. 要测试是否成功扩展并激活 swap 逻辑卷,请检查活跃 swap 空间:

    $ cat /proc/swaps
    $ free -h

11.3.2. 为 swap 创建 LVM2 逻辑卷

这个步骤描述了如何为 swap 创建 LVM2 逻辑卷。假设 /dev/VolGroup00/LogVol02 是您要添加的交换卷。

先决条件

  • 有足够的磁盘空间。

流程

  1. 创建大小为 2 GB 的 LVM2 逻辑卷:

    # lvcreate VolGroup00 -n LogVol02 -L 2G
  2. 格式化新 swap 空间:

    # mkswap /dev/VolGroup00/LogVol02
  3. /etc/fstab 文件中添加以下条目:

    /dev/VolGroup00/LogVol02 swap swap defaults 0 0
  4. 重新生成挂载单元以便您的系统注册新配置:

    # systemctl daemon-reload
  5. 在逻辑卷中激活 swap:

    # swapon -v /dev/VolGroup00/LogVol02
  6. 要测试是否成功创建并激活了 swap 逻辑卷,请检查活跃 swap 空间:

    $ cat /proc/swaps
    $ free -h

11.3.3. 创建交换文件

这个步骤描述了如何创建交换文件。

先决条件

  • 有足够的磁盘空间。

流程

  1. 以 MB 为单位确定新交换文件的大小,再乘以 1024 来确定块数量。例如: 64MB swap 文件的块大小为 65536。
  2. 创建一个空文件:

    # dd if=/dev/zero of=/swapfile bs=1024 count=65536

    使用与所需块大小相等的值替换 count

  3. 使用以下命令设定 swap 文件:

    # mkswap /swapfile
  4. 更改交换文件的安全性,使其不完全可读。

    # chmod 0600 /swapfile
  5. 要在引导时启用交换文件,以 root 用户身份编辑 /etc/fstab 使其包含以下条目:

    /swapfile swap swap defaults 0 0

    下次系统引导时,它会激活新的 swap 文件。

  6. 重新生成挂载单元以便您的系统注册新的 /etc/fstab 配置:

    # systemctl daemon-reload
  7. 立即激活 swap 文件:

    # swapon /swapfile
  8. 要测试新 swap 文件是否已成功创建并激活,请检查活跃 swap 空间:

    $ cat /proc/swaps
    $ free -h

11.4. 删除 swap 空间

这部分论述了如何在安装后减少 swap 空间。例如:您将系统中的 RAM 大小从 1GB 降到 512MB,但仍分配了 2GB swap 空间。可能最好将交换空间大小减少到 1 GB,因为较大的 2 GB 可能会浪费磁盘空间。

根据您需要的内容,您可以选择以下三个选项之一:减少现有 LVM2 逻辑卷上的交换空间、删除用于交换的整个 LVM2 逻辑卷,或删除交换文件。

11.4.1. 在 LVM2 逻辑卷中减少 swap

这个步骤描述了如何在 LVM2 逻辑卷中减少交换。假设 /dev/VolGroup00/LogVol01 是您要缩小的卷。

流程

  1. 为关联的逻辑卷禁用交换:

    # swapoff -v /dev/VolGroup00/LogVol01
  2. 将 LVM2 逻辑卷减少 512 MB:

    # lvreduce /dev/VolGroup00/LogVol01 -L -512M
  3. 格式化新 swap 空间:

    # mkswap /dev/VolGroup00/LogVol01
  4. 在逻辑卷中激活 swap:

    # swapon -v /dev/VolGroup00/LogVol01
  5. 要测试是否成功缩小 swap 逻辑卷,请检查活跃 swap 空间:

    $ cat /proc/swaps
    $ free -h

11.4.2. 为 swap 删除 LVM2 逻辑卷

这个步骤描述了如何为 swap 删除 LVM2 逻辑卷。假设 /dev/VolGroup00/LogVol02 是您要删除的交换卷。

流程

  1. 为关联的逻辑卷禁用交换:

    # swapoff -v /dev/VolGroup00/LogVol02
  2. 删除 LVM2 逻辑卷:

    # lvremove /dev/VolGroup00/LogVol02
  3. /etc/fstab 文件中删除以下关联的条目:

    /dev/VolGroup00/LogVol02 swap swap defaults 0 0
  4. 重新生成挂载单元以便您的系统注册新配置:

    # systemctl daemon-reload
  5. 要测试是否成功删除了逻辑卷,请检查活跃 swap 空间:

    $ cat /proc/swaps
    $ free -h

11.4.3. 删除交换文件

这个步骤描述了如何删除交换文件。

流程

  1. 在 shell 提示下,执行以下命令禁用交换文件(其中 /swapfile 是交换文件):

    # swapoff -v /swapfile
  2. 相应地从 /etc/fstab 文件中删除其条目。
  3. 重新生成挂载单元以便您的系统注册新配置:

    # systemctl daemon-reload
  4. 删除实际文件:

    # rm /swapfile

第 12 章 使用快照管理系统升级

作为系统管理员,您可以使用 Boom 引导管理器、Leapp 实用程序和 OS 现代化框架对 Red Hat Enterprise Linux 系统执行回滚的升级。

这个用户故事中提到的程序有以下限制:

  • 它不适用于您的系统树中的多个文件系统,例如:一个独立的 /var 或者 /usr 分区。
  • 它不适用于 RHUI 系统。考虑创建虚拟机的快照,而不是使用 Boom 工具。
  • 目前,此用户案例仅涵盖具有传统 BIOS 和 Intel 架构的现场系统。您只能在使用 BIOS 进行引导的 Red Hat Enterprise Linux 7 系统中使用它。

12.1. Boom 过程概述

使用 Boom,您可以创建引导条目,然后可从 GRUB 2 引导装载程序菜单中选择这些条目。通过创建引导条目,现在简化了回滚功能升级的准备过程。

以下是不同的引导条目,它们是升级和回滚过程的一部分:

Upgrade boot entry
引导 Leapp 升级环境。使用 leapp 实用程序创建和管理这个引导条目。这个引导条目会在 leapp 升级过程中自动删除。
Red Hat Enterprise Linux 8 boot entry
引导升级的系统环境。使用 leapp 实用程序在成功升级后创建此引导条目。
Snapshot boot entry
引导原始系统的快照,并可用于在升级尝试成功或失败后检查和测试以前的系统状态。在升级系统前,使用 boom 命令创建此引导条目。
Rollback boot entry
引导原始系统环境,并将任何升级回滚到以前的系统状态。在启动升级过程的回滚时,使用 boom 命令创建此引导条目。

可使用以下流程进行可回滚的升级,而无需编辑任何配置文件:

  1. 创建 root 文件系统的快照或副本。
  2. 使用 boom 命令为当前(旧的)环境创建引导条目。
  3. 升级 Red Hat Enterprise Linux 系统。
  4. 重启系统,然后选择要使用的版本。

根据更新过程的结果,应当在流程结束时清理 Red Hat Enterprise Linux 8、快照和回滚条目:

  • 如果要保留更新的 Red Hat Enterprise Linux 8 系统,使用 boom 命令删除创建的快照和回滚条目,并使用 lvremove 命令删除快照逻辑卷。更多信息请参阅 第 12.4 节 “删除快照”
  • 如果要回滚到原始系统状态,合并快照和回滚引导条目,并在系统重启后删除未使用的快照和回滚引导条目。更多信息请参阅 第 12.5 节 “创建回滚引导条目”

其它资源

  • boom man page。

12.2. 使用 Boom 升级到另一个版本

除了 Boom 外,升级过程中还会使用以下 Red Hat Enterprise Linux 组件:

  • 逻辑卷管理器(LVM)
  • GRUB 2 引导装载程序
  • Leapp 升级工具

这个步骤描述了如何使用 boom 命令从 Red Hat Enterprise Linux 7 升级到 Red Hat Enterprise Linux 8。

先决条件

  • 安装 boom 软件包:

    # yum install lvm2-python-boom

    确保 lvm2-python-boom 软件包的版本至少为 boom-0.9 (最好为 boom-1.2)。

    注意

    如果要在 Red Hat Enterprise Linux 8 中安装 boom 软件包,请执行以下命令:

    # yum install boom-boot
  • 快照必须有足够的空间。使用以下命令在卷组和逻辑卷中查找可用空间:

    # vgs
    VG  #PV  #LV  #SN  Attr  VSize    VFree
    rhel 4 2 0 wz--n- 103.89g 29.99g
    
    # lvs
    LV     VG    Attr     LSize  Pool Origin Data% Meta% Move Log Cpy%Sync Convert
    root rhel -wi-ao--- 68.88g
    swap rhel -wi-ao--- 5.98g

    在这里,rhel 是系统的卷组,rootswap 是系统逻辑卷。

  • 查找所有挂载的逻辑卷:

    # mount | grep rhel
    
    /dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
    注意

    如果存在多个条目,且附加条目的挂载点包括 '/usr' 或 '/var',则无法遵循以上步骤而不执行超出这个用户权限的附加步骤。

  • 已安装 Leapp 软件包并启用软件程序库。如需更多信息,请参阅为升级准备 RHEL 7 系统部分,以下载升级所需的软件包。

流程

  1. 创建您的 root 逻辑卷快照:

    • 如果您的 root 文件系统使用精简置备,请创建一个精简快照:

      在创建精简快照时,请不要定义快照大小。从精简池中分配快照。

      # lvcreate -s rhel/root -n root_snapshot_before_changes

      在这里:

      • -s 用于创建快照
      • rhel/root 是在逻辑卷中复制的文件系统
      • -n root_snapshot_before_changes 是快照的名称
    • 如果您的 root 文件系统使用密集置备,请创建一个厚快照:

      在创建粘性快照时,定义可在升级过程中保存所有更改的快照大小。

      # lvcreate -s  rhel/root -n root_snapshot_before_changes -L 25g

      在这里:

      • -s 用于创建快照
      • rhel/root 正在复制的文件系统
      • -n root_snapshot_before_changes 是快照的名称
      • -L 25g 是快照大小。这个快照必须可以保存升级过程中的所有更改

        重要

        创建快照后,不会包含任何附加系统更改。

  2. 创建配置集:

    # boom profile create --from-host --uname-pattern el7
    注意

    如果要在 Red Hat Enterprise Linux 8 中创建 boom 配置集,使用 el8 作为 uname-pattern。

  3. 使用原始引导镜像的备份副本创建原始系统的快照引导条目:

    1. 对于 boom-1.2 或更高版本:

      # boom create --backup --title "Root LV snapshot before changes" --rootlv rhel/root_snapshot_before_changes

      在这里:

      • --title 更改之前 root LV 快照是引导条目的名称,在系统启动期间显示在列表中
      • --rootlv 是与新引导条目对应的 root 逻辑卷
    2. 对于 boom-1.1 或更早的版本:

      # cp /boot/vmlinuz-$(uname r) /boot/vmlinuz$(uname -r).bak
      
      # cp /boot/initramfs-$(uname r).img /boot/initramfs$(uname -r).img.bak
      
      # boom create -title "Root LV snapshot before changes" --rootlv rhel/root_snapshot_before_changes --linux /boot/vmlinuz$(uname r).bak --initrd /boot/initramfs$(uname -r).img.bak

      如果您首次执行 boom create 命令,则会显示以下消息:

      WARNING - Boom configuration not found in grub.cfg
      
      WARNING - Run 'grub2-mkconfig > /boot/grub2/grub.cfg' to enable

      在 GRUB 2 中启用 Boom:

      # grub2-mkconfig > /boot/grub2/grub.cfg
  4. 使用 Leapp 实用程序升级到 Red Hat Enterprise Linux 8:

    # leapp preupgrade

    如果 leapp preupgrade 命令报告有任何阻塞,则检查和地址。

  5. 解决预升级报告中指定的块后,使用 --reboot 选项重新运行 upgrade 命令:

    # leapp upgrade --reboot

    这个命令会重启到 leapp 工具创建的升级引导条目,并开始执行到 Red Hat Enterprise Linux 8 的原位升级。reboot 参数会在升级过程后启动自动系统重启。

    在重启过程中,GRUB 2 屏幕会显示:

    GRUB2 显示
    注意

    如果您在 Red Hat Enterprise Linux 8 系统中,GRUB2 引导屏幕中的 Snapshots 子菜单不可用。

验证步骤

  • 选择 RHEL Upgrade Initramfs 条目并按 ENTER。继续升级并安装新的 Red Hat Enterprise Linux 8 RPM 软件包。升级完成后,系统会自动重启,GRUB 2 屏幕会显示升级的和旧版本的可用系统。升级的系统版本是默认选择。

    在新版本和旧版本间切换

    另外,存在更改引导条目前创建的 Root LV 快照,它会在升级前即时访问系统状态。

12.3. 在新的和旧的 Red Hat Enterprise Linux 版本间切换

Boom 引导管理器减少了与升级系统相关的风险,并帮助减少硬件停机时间。例如:您可以将 Red Hat Enterprise Linux 7 系统升级到 Red Hat Enterprise Linux 8,同时保留原始 Red Hat Enterprise Linux 7 环境。通过在环境间进行切换,您可以:

  • 以并排方式快速比较这两个环境,并以最少的开销在两者之间切换。
  • 恢复旧的文件系统的内容。
  • 在升级的主机正在运行时继续访问旧的系统。
  • 随时停止并恢复更新过程,即使更新本身正在运行。

这个步骤描述了如何在升级完成后在新的和旧的 Red Hat Enterprise Linux 版本间切换。

先决条件

流程

  1. 重启系统:

    # reboot
  2. 从 GRUB 2 引导装载程序屏幕选择所需引导条目。

    在新版本和旧版本间切换

验证步骤

  • 验证所选引导卷是否已显示:

    # cat /proc/cmdline
    
    root=/dev/rhel/root_snapshot_before_changes ro rd.lvm.lv=rhel/root_snapshot_before_changes rd.lvm.lv=vg_root/swap rhgb quiet

其它资源

  • boom man page。

12.4. 删除快照

快照引导条目引导原始系统的快照,并可用于在升级尝试成功或失败后检查并测试以前的系统状态。这个步骤描述了删除快照的步骤。

先决条件

流程

  1. 从 GRUB 2 条目引导 Red Hat Enterprise Linux 8。以下输出确认选择了新的快照:

    # boom list
    BootID  Version                    Name                            RootDevice
    6d2ec72 3.10.0-957.21.3.el7.x86_64 Red Hat Enterprise Linux Server /dev/rhel/root_snapshot_before_changes
  2. 使用 BootID 值删除快照条目:

    # boom delete --boot-id 6d2ec72

    这会从 GRUB 2 菜单中删除该条目。

  3. 删除 LV 快照:

    # lvremove rhel/root_snapshot_before_changes
    Do you really want to remove active logical volume rhel/root_snapshot_before_changes? [y/n]: y
          Logical volume "root_snapshot_before_changes" successfully removed

    其它资源

    • boom man page。

12.5. 创建回滚引导条目

回滚引导条目引导原始系统环境,并将任何升级回滚到以前的系统状态。检查后将升级的和回滚引导条目恢复到原始环境,现在可以通过快照引导条目获得。

可以从升级的系统或快照环境中准备回滚引导条目。

先决条件

流程

  1. 合并快照:

    # lvconvert --merge rhel/root_snapshot_before_changes
  2. 为合并的快照创建一个回滚引导条目:

    1. 对于 boom-1.2 或更高版本:

      boom create --backup --title "RHEL Rollback" --rootlv rhel/root
    2. 对于 boom-1.1 或更早的版本:

      boom create --title "RHEL Rollback" --rootlv rhel/root --linux /boot/vmlinuz$(uname r).bak --initrd /boot/initramfs$(uname -r).img.bak
  3. 可选:引导回滚环境并恢复系统状态:

    # reboot

    系统重启后,使用箭头键选择RHEL Rollback 引导条目,然后按 Enter 键引导此条目

    激活 root 逻辑卷后,系统会自动启动快照合并操作。

    注意

    启动合并操作后,快照卷将不再可用。在成功引导 RHEL Rollback 引导条目后, 修改引导条目前 Root LV 快照 无法正常工作,因为它现在已合并到原始逻辑卷中。合并快照逻辑卷,销毁快照并恢复原始卷之前的状态。

  4. 可选:完成合并操作后,删除未使用的条目并恢复原始引导条目:

    1. /boot 文件系统中删除未使用的 Red Hat Enterprise Linux 8 引导条目并刷新 Grub2 配置:

      # rm -f /boot/el8
      # grub2-mkconfig -o /boot/grub2/grub.cfg
    2. 恢复原始 Red Hat Enterprise Linux 7 引导条目:

      # new-kernel-pkg --update $(uname -r)
  5. 成功回滚到系统后,删除 boom 引导条目:

    # boom list
    # boom delete boot-id

其它资源

  • boom man page。

第 13 章 NVMe over fabric 设备概述

Non-volatile Memory Express(NVMe)是一个接口,它允许主机软件实用程序与固态驱动器通信。

使用以下类型的光纤传输通过光纤设备配置 NVMe:

NVMe over Remote Direct Memory Access(NVMe/RDMA)
有关如何配置 NVMe/RDMA 的详情请参考 第 13.1 节 “使用 RDMA 的 NVMe over fabrics”
NVMe over Fibre Channel(FC-NVMe)
有关如何配置 FC-NVMe 的详情请参考 第 13.2 节 “使用 FC 的光纤的 NVMe over fabrics”

使用光纤通道(FC)和远程直接内存访问(RDMA)时,固态驱动器不必是您的系统的本地驱动器;可以通过 FC 或 RDMA 控制器远程配置。

13.1. 使用 RDMA 的 NVMe over fabrics

在 NVMe over RDMA(NVMe/RDMA)设置中,您要配置 NVMe 目标和 NVMe 启动器。

作为系统管理员,在以下部分中完成任务以部署 NVMe/RDMA 设置:

13.1.1. 使用 configfs 设置 NVMe/RDMA 目标

使用 configfs 配置 NVMe/RDMA 目标。

先决条件

  • 确定您有一个要分配给 nvmet 子系统的块设备。

流程

  1. 创建 nvmet-rdma 子系统:

    # modprobe nvmet-rdma
    
    # mkdir /sys/kernel/config/nvmet/subsystems/testnqn
    
    # cd /sys/kernel/config/nvmet/subsystems/testnqn

    使用子系统名称替换 testnqn

  2. 允许任何主机连接到这个目标:

    # echo 1 > attr_allow_any_host
  3. 配置命名空间:

    # mkdir namespaces/10
    
    # cd namespaces/10

    使用命名空间号替换 10

  4. 设置到 NVMe 设备的路径:

    #echo -n /dev/nvme0n1 > device_path
  5. 启用命名空间:

    # echo 1 > enable
  6. 创建带有 NVMe 端口的目录:

    # mkdir /sys/kernel/config/nvmet/ports/1
    
    # cd /sys/kernel/config/nvmet/ports/1
  7. 显示 mlx5_ib0 的 IP 地址:

    # ip addr show mlx5_ib0
    
    8: mlx5_ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 4092 qdisc mq state UP group default qlen 256
        link/infiniband 00:00:06:2f:fe:80:00:00:00:00:00:00:e4:1d:2d:03:00:e7:0f:f6 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
        inet 172.31.0.202/24 brd 172.31.0.255 scope global noprefixroute mlx5_ib0
           valid_lft forever preferred_lft forever
        inet6 fe80::e61d:2d03:e7:ff6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
  8. 为目标设置传输地址:

    # echo -n 172.31.0.202 > addr_traddr
  9. 将 RDMA 设置为传输类型:

    # echo rdma > addr_trtype
    
    # echo 4420 > addr_trsvcid
  10. 为端口设置地址系列:

    # echo ipv4 > addr_adrfam
  11. 创建软链接:

    # ln -s /sys/kernel/config/nvmet/subsystems/testnqn   /sys/kernel/config/nvmet/ports/1/subsystems/testnqn

验证步骤

  • 验证 NVMe 目标是否在侦听给定端口并准备好进行连接请求:

    # dmesg | grep "enabling port"
    [ 1091.413648] nvmet_rdma: enabling port 1 (172.31.0.202:4420)

其它资源

  • nvme man page。

13.1.2. 使用 nvmetcli 设置 NVMe/RDMA 目标

使用 nvmetcli 工具编辑、查看和启动 NVMe 目标。nvmetcli 工具提供命令行和交互式 shell 选项。使用这个流程通过 nvmetcli 配置 NVMe/RDMA 目标。

先决条件

  • 确定您有一个要分配给 nvmet 子系统的块设备。
  • 以 root 用户身份执行以下 nvmetcli 操作。

流程

  1. 安装 nvmetcli 软件包:

    # yum install nvmetcli
  2. 下载 rdma.json 文件:

    # wget http://git.infradead.org/users/hch/nvmetcli.git/blob_plain/0a6b088db2dc2e5de11e6f23f1e890e4b54fee64:/rdma.json
  3. 编辑 rdma.json 文件,将 traddr 值更改为 172.31.0.202
  4. 通过载入 NVMe 目标配置文件来设置目标:

    # nvmetcli restore rdma.json
注意

如果没有指定 NVMe 目标配置文件名称,nvmetcli 将使用 /etc/nvmet/config.json 文件。

验证步骤

  • 验证 NVMe 目标是否在侦听给定端口并准备好进行连接请求:

    #dmesg | tail -1
    [ 4797.132647] nvmet_rdma: enabling port 2 (172.31.0.202:4420)
  • (可选)清除当前 NVMe 目标:

    # nvmetcli clear

其它资源

  • nvmetcli man page。
  • nvme man page。

13.1.3. 配置 NVMe/RDMA 客户端

使用 NVMe 管理命令行界面(nvme-cli)工具配置 NVMe/RDMA 客户端。

流程

  1. 安装 nvme-cli 工具:

    # yum install nvme-cli
  2. 如果没有加载,载入 nvme-rdma 模块:

    # modprobe nvme-rdma
  3. 在 NVMe 目标中找到可用子系统:

    # nvme discover -t rdma -a 172.31.0.202 -s 4420
    
    Discovery Log Number of Records 1, Generation counter 2
    =====Discovery Log Entry 0======
    trtype:  rdma
    adrfam:  ipv4
    subtype: nvme subsystem
    treq:    not specified, sq flow control disable supported
    portid:  1
    trsvcid: 4420
    subnqn:  testnqn
    traddr:  172.31.0.202
    rdma_prtype: not specified
    rdma_qptype: connected
    rdma_cms:    rdma-cm
    rdma_pkey: 0x0000
  4. 连接到发现的子系统:

    # nvme connect -t rdma -n testnqn -a 172.31.0.202 -s 4420
    
    # lsblk
    NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda                            8:0    0 465.8G  0 disk
    ├─sda1                         8:1    0     1G  0 part /boot
    └─sda2                         8:2    0 464.8G  0 part
      ├─rhel_rdma--virt--03-root 253:0    0    50G  0 lvm  /
      ├─rhel_rdma--virt--03-swap 253:1    0     4G  0 lvm  [SWAP]
      └─rhel_rdma--virt--03-home 253:2    0 410.8G  0 lvm  /home
    nvme0n1
    
    # cat /sys/class/nvme/nvme0/transport
    rdma

    使用 NVMe 子系统名称替换 testnqn

    172.31.0.202 替换为目标 IP 地址。

    使用端口号替换 4420

验证步骤

  • 列出当前连接的 NVMe 设备:

    # nvme list
  • (可选)与目标断开:

    # nvme disconnect -n testnqn
    NQN:testnqn disconnected 1 controller(s)
    
    # lsblk
    NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda                            8:0    0 465.8G  0 disk
    ├─sda1                         8:1    0     1G  0 part /boot
    └─sda2                         8:2    0 464.8G  0 part
      ├─rhel_rdma--virt--03-root 253:0    0    50G  0 lvm  /
      ├─rhel_rdma--virt--03-swap 253:1    0     4G  0 lvm  [SWAP]
      └─rhel_rdma--virt--03-home 253:2    0 410.8G  0 lvm  /home

其它资源

13.1.4. 后续步骤

13.2. 使用 FC 的光纤的 NVMe over fabrics

当与特定 Broadcom Emulex 和 Marvell Qlogic Fibre Channel 适配器一起使用时,在 initiator 模式中完全支持 NVMe over光纤通道(FC-NVMe)传输。作为系统管理员,在以下部分中完成任务以部署 FC-NVMe 设置:

13.2.1. 为广播适配器配置 NVMe initiator

使用 NVMe 管理命令行界面(nvme-cli)工具为 Broadcom 适配器客户端配置 NVMe initiator。

流程

  1. 安装 nvme-cli 工具:

    # yum install nvme-cli

    这会在 /etc/nvme/ 目录中创建 hostnqn 文件。hostnqn 文件标识 NVMe 主机。

    生成一个新的 hostnqn

    # nvme gen-hostnqn
  2. 查找本地和远程端口的 WWN 和 WWPN 标识符,并使用输出查找子系统 NQN:

    # cat /sys/class/scsi_host/host*/nvme_info
    
    NVME Initiator Enabled
    XRI Dist lpfc0 Total 6144 IO 5894 ELS 250
    NVME LPORT lpfc0 WWPN x10000090fae0b5f5 WWNN x20000090fae0b5f5 DID x010f00 ONLINE
    NVME RPORT       WWPN x204700a098cbcac6 WWNN x204600a098cbcac6 DID x01050e TARGET DISCSRVC ONLINE
    
    NVME Statistics
    LS: Xmt 000000000e Cmpl 000000000e Abort 00000000
    LS XMIT: Err 00000000  CMPL: xb 00000000 Err 00000000
    Total FCP Cmpl 00000000000008ea Issue 00000000000008ec OutIO 0000000000000002
        abort 00000000 noxri 00000000 nondlp 00000000 qdepth 00000000 wqerr 00000000 err 00000000
    FCP CMPL: xb 00000000 Err 00000000
    # nvme discover --transport fc \
                    --traddr nn-0x204600a098cbcac6:pn-0x204700a098cbcac6 \
                    --host-traddr nn-0x20000090fae0b5f5:pn-0x10000090fae0b5f5
    
    Discovery Log Number of Records 2, Generation counter 49530
    =====Discovery Log Entry 0======
    trtype:  fc
    adrfam:  fibre-channel
    subtype: nvme subsystem
    treq:    not specified
    portid:  0
    trsvcid: none
    subnqn:  nqn.1992-08.com.netapp:sn.e18bfca87d5e11e98c0800a098cbcac6:subsystem.st14_nvme_ss_1_1
    traddr:  nn-0x204600a098cbcac6:pn-0x204700a098cbcac6

    使用 traddr 替换nn-0x204600a098cbcac6:pn-0x204700a098cbcac6

    使用 host-traddr 替换nn-0x20000090fae0b5f5:pn-0x10000090fae0b5f5

  3. 使用 nvme-cli 连接到 NVMe 目标:

    # nvme connect --transport fc \
                   --traddr nn-0x204600a098cbcac6:pn-0x204700a098cbcac6 \
                   --host-traddr nn-0x20000090fae0b5f5:pn-0x10000090fae0b5f5 \
                   -n nqn.1992-08.com.netapp:sn.e18bfca87d5e11e98c0800a098cbcac6:subsystem.st14_nvme_ss_1_1

    使用 traddr 替换nn-0x204600a098cbcac6:pn-0x204700a098cbcac6

    使用 host-traddr 替换nn-0x20000090fae0b5f5:pn-0x10000090fae0b5f5

    使用 subnqn 替换 nqn.1992-08.com.netapp:sn.e18bfca87d5e11e98c0800a098cbcac6:subsystem.st14_nvme_ss_1_1

验证步骤

  • 列出当前连接的 NVMe 设备:

    # nvme list
    Node             SN                   Model                                    Namespace Usage                      Format           FW Rev
    ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
    /dev/nvme0n1     80BgLFM7xMJbAAAAAAAC NetApp ONTAP Controller                  1         107.37  GB / 107.37  GB      4 KiB +  0 B   FFFFFFFF
    # lsblk |grep nvme
    nvme0n1                     259:0    0   100G  0 disk

其它资源

13.2.2. 为 QLogic 适配器配置 NVMe initiator

使用 NVMe 管理命令行界面(nvme-cli)工具为 Qlogic 适配器客户端配置 NVMe initiator。

流程

  1. 安装 nvme-cli 工具:

    # yum install nvme-cli

    这会在 /etc/nvme/ 目录中创建 hostnqn 文件。hostnqn 文件标识 NVMe 主机。

    生成一个新的 hostnqn

    # nvme gen-hostnqn
  2. 重新载入 qla2xxx 模块:

    # rmmod qla2xxx
    # modprobe qla2xxx
  3. 查找本地和远程端口的 WWN 和 WWPN 标识符:

    # dmesg |grep traddr
    
    [    6.139862] qla2xxx [0000:04:00.0]-ffff:0: register_localport: host-traddr=nn-0x20000024ff19bb62:pn-0x21000024ff19bb62 on portID:10700
    [    6.241762] qla2xxx [0000:04:00.0]-2102:0: qla_nvme_register_remote: traddr=nn-0x203b00a098cbcac6:pn-0x203d00a098cbcac6 PortID:01050d

    使用这些 host-traddrtraddr 值,找到子系统 NQN:

    # nvme discover --transport fc \
                    --traddr nn-0x203b00a098cbcac6:pn-0x203d00a098cbcac6 \
                    --host-traddr nn-0x20000024ff19bb62:pn-0x21000024ff19bb62
    
    Discovery Log Number of Records 2, Generation counter 49530
    =====Discovery Log Entry 0======
    trtype:  fc
    adrfam:  fibre-channel
    subtype: nvme subsystem
    treq:    not specified
    portid:  0
    trsvcid: none
    subnqn:  nqn.1992-08.com.netapp:sn.c9ecc9187b1111e98c0800a098cbcac6:subsystem.vs_nvme_multipath_1_subsystem_468
    traddr:  nn-0x203b00a098cbcac6:pn-0x203d00a098cbcac6

    nn-0x203b00a098cbcac6:pn-0x203d00a098cbcac6 替换为 traddr

    host-traddr 替换 nn-0x20000024ff19bb62:pn-0x21000024ff19bb62

  4. 使用 nvme-cli 工具连接到 NVMe 目标:

    # nvme connect  --transport fc \
                    --traddr nn-0x203b00a098cbcac6:pn-0x203d00a098cbcac6 \
                    --host-traddr nn-0x20000024ff19bb62:pn-0x21000024ff19bb62 \
                    -n nqn.1992-08.com.netapp:sn.c9ecc9187b1111e98c0800a098cbcac6:subsystem.vs_nvme_multipath_1_subsystem_468

    nn-0x203b00a098cbcac6:pn-0x203d00a098cbcac6 替换为 traddr

    host-traddr 替换 nn-0x20000024ff19bb62:pn-0x21000024ff19bb62

    subnqn 替换为 nqn.1992-08.com.netapp:sn.c9ecc9187b1111e98c0800a098cbcac6:subsystem.vs_nvme_multipath_1_subsystem_468

验证步骤

  • 列出当前连接的 NVMe 设备:

    # nvme list
    Node             SN                   Model                                    Namespace Usage                      Format           FW Rev
    ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
    /dev/nvme0n1     80BgLFM7xMJbAAAAAAAC NetApp ONTAP Controller                  1         107.37  GB / 107.37  GB      4 KiB +  0 B   FFFFFFFF
    
    # lsblk |grep nvme
    nvme0n1                     259:0    0   100G  0 disk

其它资源

13.2.3. 后续步骤

第 14 章 在 NVMe 设备中启用多路径

您可以多路径通过光纤传输连接到系统的 NVMe 设备,如光纤通道(FC)。您可以在多个多路径解决方案之间进行选择。

14.1. 原生 NVMe 多路径和 DM 多路径

NVMe 设备支持原生多路径功能。在 NVMe 中配置多路径时,您可以在标准 DM 多路径框架和原生 NVMe 多路径间进行选择。

DM 多路径和原生 NVMe 多路径支持 NVMe 设备的对称命名空间访问(ANA)多路径方案。ANA 识别目标和启动器之间的优化路径,并提高性能。

当启用原生 NVMe 多路径时,它适用于所有 NVMe 设备。它可以提供更高的性能,但不包含 DM 多路径提供的所有功能。例如:原生 NVMe 多路径只支持 failoverround-robin 路径选择方法。

红帽建议您在 RHEL 8 中使用 DM 多路径作为默认多路径解决方案。

14.2. 启用原生 NVMe 多路径

这个过程使用原生 NVMe 多路径解决方案在连接的 NVMe 设备中启用多路径。

先决条件

流程

  1. 检查内核中是否启用了原生 NVMe 多路径:

    # cat /sys/module/nvme_core/parameters/multipath

    命令显示以下内容之一:

    N
    禁用原生 NVMe 多路径。
    Y
    启用了原生 NVMe 多路径。
  2. 如果禁用了原生 NVMe 多路径,请使用以下方法之一启用它:

    • 使用内核选项:

      1. 在内核命令行中添加 nvme_core.multipath=Y 选项:

        # grubby --update-kernel=ALL --args="nvme_core.multipath=Y"
      2. 在 64 位 IBM Z 构架中,更新引导菜单:

        # zipl
      3. 重启系统。
    • 使用内核模块配置文件:

      1. 使用以下内容创建 /etc/modprobe.d/nvme_core.conf 配置文件:

        options nvme_core multipath=Y
      2. 备份 initramfs 文件系统:

        # cp /boot/initramfs-$(uname -r).img \
             /boot/initramfs-$(uname -r).bak.$(date +%m-%d-%H%M%S).img
      3. 重建 initramfs 文件系统:

        # dracut --force --verbose
      4. 重启系统。
  3. 可选:在运行的系统中,更改 NVMe 设备的 I/O 策略,以便在所有可用路径中分发 I/O:

    # echo "round-robin" > /sys/class/nvme-subsystem/nvme-subsys0/iopolicy
  4. 可选:使用 udev 规则永久设置 I/O 策略。使用以下内容创建 /etc/udev/rules.d/71-nvme-io-policy.rules 文件:

    ACTION=="add|change", SUBSYSTEM=="nvme-subsystem", ATTR{iopolicy}="round-robin"

验证

  1. 检查您的系统是否识别 NVMe 设备:

    # nvme list
    
    Node             SN                   Model                                    Namespace Usage                      Format           FW Rev
    ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
    /dev/nvme0n1     a34c4f3a0d6f5cec     Linux                                    1         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme0n2     a34c4f3a0d6f5cec     Linux                                    2         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
  2. 列出所有连接的 NVMe 子系统:

    # nvme list-subsys
    
    nvme-subsys0 - NQN=testnqn
    \
     +- nvme0 fc traddr=nn-0x20000090fadd597a:pn-0x10000090fadd597a host_traddr=nn-0x20000090fac7e1dd:pn-0x10000090fac7e1dd live
     +- nvme1 fc traddr=nn-0x20000090fadd5979:pn-0x10000090fadd5979 host_traddr=nn-0x20000090fac7e1dd:pn-0x10000090fac7e1dd live
     +- nvme2 fc traddr=nn-0x20000090fadd5979:pn-0x10000090fadd5979 host_traddr=nn-0x20000090fac7e1de:pn-0x10000090fac7e1de live
     +- nvme3 fc traddr=nn-0x20000090fadd597a:pn-0x10000090fadd597a host_traddr=nn-0x20000090fac7e1de:pn-0x10000090fac7e1de live

    检查活动的传输类型。例如: nvme0 fc 表示该设备通过光纤通道传输连接,nvme tcp 表示该设备通过 TCP 连接。

  3. 如果您编辑了内核选项,请检查内核命令行中是否启用了原生 NVMe 多路径:

    # cat /proc/cmdline
    
    BOOT_IMAGE=[...] nvme_core.multipath=Y
  4. 检查 DM 多路径报告 NVMe 命名空间,例如 nvme0c0n1 nvme0c3n1,而不是作为 nvme0n1nvme3n1:

    # multipath -ll | grep -i nvme
    
    uuid.8ef20f70-f7d3-4f67-8d84-1bb16b2bfe03 [nvme]:nvme0n1 NVMe,Linux,4.18.0-2
    | `- 0:0:1    nvme0c0n1 0:0     n/a   optimized live
    | `- 0:1:1    nvme0c1n1 0:0     n/a   optimized live
    | `- 0:2:1    nvme0c2n1 0:0     n/a   optimized live
      `- 0:3:1    nvme0c3n1 0:0     n/a   optimized live
    
    uuid.44c782b4-4e72-4d9e-bc39-c7be0a409f22 [nvme]:nvme0n2 NVMe,Linux,4.18.0-2
    | `- 0:0:1    nvme0c0n1 0:0     n/a   optimized live
    | `- 0:1:1    nvme0c1n1 0:0     n/a   optimized live
    | `- 0:2:1    nvme0c2n1 0:0     n/a   optimized live
      `- 0:3:1    nvme0c3n1 0:0     n/a   optimized live
  5. 如果您更改了 I/O 策略,请检查 round-robin 是否在 NVMe 设备中是活跃的 I/O 策略:

    # cat /sys/class/nvme-subsystem/nvme-subsys0/iopolicy
    
    round-robin

14.3. 在 NVMe 设备中启用 DM 多路径

这个过程使用 DM 多路径解决方案在连接的 NVMe 设备中启用多路径。

先决条件

流程

  1. 检查原生 NVMe 多路径是否已禁用:

    # cat /sys/module/nvme_core/parameters/multipath

    命令显示以下内容之一:

    N
    禁用原生 NVMe 多路径。
    Y
    启用了原生 NVMe 多路径。
  2. 如果启用了原生 NVMe 多路径,请禁用它:

    1. 从内核命令行中删除 nvme_core.multipath=Y 选项:

      # grubby --update-kernel=ALL --remove-args="nvme_core.multipath=Y"
    2. 在 64 位 IBM Z 构架中,更新引导菜单:

      # zipl
    3. 如果存在 options nvme_core multipath=Y 文件,请从 /etc/modprobe.d/nvme_core.conf 文件中删除它。
    4. 重启系统。
  3. 确保启用了 DM 多路径:

    # systemctl enable --now multipathd.service
  4. 在所有可用路径上分发 I/O。在 /etc/multipath.conf 文件中添加以下内容:

    device {
      vendor "NVME"
      product ".*"
      path_grouping_policy    group_by_prio
    }
    注意

    当 DM 多路径管理 NVMe 设备时,/sys/class/nvme-subsystem/nvme-subsys0/iopolicy 配置文件对 I/O 分发没有影响。

  5. 重新载入 multipathd 服务以应用配置更改:

    # multipath -r
  6. 备份 initramfs 文件系统:

    # cp /boot/initramfs-$(uname -r).img \
         /boot/initramfs-$(uname -r).bak.$(date +%m-%d-%H%M%S).img
  7. 重建 initramfs 文件系统:

    # dracut --force --verbose

验证

  1. 检查您的系统是否识别 NVMe 设备:

    # nvme list
    
    Node             SN                   Model                                    Namespace Usage                      Format           FW Rev
    ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
    /dev/nvme0n1     a34c4f3a0d6f5cec     Linux                                    1         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme0n2     a34c4f3a0d6f5cec     Linux                                    2         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme1n1     a34c4f3a0d6f5cec     Linux                                    1         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme1n2     a34c4f3a0d6f5cec     Linux                                    2         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme2n1     a34c4f3a0d6f5cec     Linux                                    1         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme2n2     a34c4f3a0d6f5cec     Linux                                    2         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme3n1     a34c4f3a0d6f5cec     Linux                                    1         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
    /dev/nvme3n2     a34c4f3a0d6f5cec     Linux                                    2         250.06  GB / 250.06  GB    512   B +  0 B   4.18.0-2
  2. 列出所有连接的 NVMe 子系统。检查该命令是否将其报告为 nvme0n1 nvme3n2,例如 nvme0c0n1nvme0c3n1

    # nvme list-subsys
    
    nvme-subsys0 - NQN=testnqn
    \
     +- nvme0 fc traddr=nn-0x20000090fadd5979:pn-0x10000090fadd5979 host_traddr=nn-0x20000090fac7e1dd:pn-0x10000090fac7e1dd live
     +- nvme1 fc traddr=nn-0x20000090fadd597a:pn-0x10000090fadd597a host_traddr=nn-0x20000090fac7e1dd:pn-0x10000090fac7e1dd live
     +- nvme2 fc traddr=nn-0x20000090fadd5979:pn-0x10000090fadd5979 host_traddr=nn-0x20000090fac7e1de:pn-0x10000090fac7e1de live
     +- nvme3 fc traddr=nn-0x20000090fadd597a:pn-0x10000090fadd597a host_traddr=nn-0x20000090fac7e1de:pn-0x10000090fac7e1de live
    # multipath -ll
    
    mpathae (uuid.8ef20f70-f7d3-4f67-8d84-1bb16b2bfe03) dm-36 NVME,Linux
    size=233G features='1 queue_if_no_path' hwhandler='0' wp=rw
    `-+- policy='service-time 0' prio=50 status=active
      |- 0:1:1:1  nvme0n1 259:0   active ready running
      |- 1:2:1:1  nvme1n1 259:2   active ready running
      |- 2:3:1:1  nvme2n1 259:4   active ready running
      `- 3:4:1:1  nvme3n1 259:6   active ready running
    
    mpathaf (uuid.44c782b4-4e72-4d9e-bc39-c7be0a409f22) dm-39 NVME,Linux
    size=233G features='1 queue_if_no_path' hwhandler='0' wp=rw
    `-+- policy='service-time 0' prio=50 status=active
      |- 0:1:2:2  nvme0n2 259:1   active ready running
      |- 1:2:2:2  nvme1n2 259:3   active ready running
      |- 2:3:2:2  nvme2n2 259:5   active ready running
      `- 3:4:2:2  nvme3n2 259:7   active ready running

第 15 章 设置磁盘调度程序

磁盘调度程序负责订购提交至存储设备的 I/O 请求。

您可以通过几种不同方式配置调度程序:

注意

在 Red Hat Enterprise Linux 8 中,块设备只支持多队列调度。这可让块层性能针对使用快速固态驱动器(SSD)和多核系统进行正常扩展。

Red Hat Enterprise Linux 7 及更早版本中提供的传统的单队列调度程序已被删除。

15.1. 可用磁盘调度程序

Red Hat Enterprise Linux 8 支持以下多队列磁盘调度程序:

none
实施一向先出(FIFO)调度算法。它通过简单的最后一个缓存合并通用块层的请求。
mq-deadline

尝试从请求到达调度程序时起为请求提供保证的延迟。

mq-deadline 调度程序将排队的 I/O 请求排序为读或写批处理,然后调度它们以增加逻辑块寻址(LBA)顺序来执行。默认情况下,读取批处理优先于写入批处理,因为应用更有可能阻止读取 I/O 操作。mq-deadline 处理批处理后,它会检查处理器时间不足的时间,并根据情况调度下一个读取或写入批处理。

此调度程序适用于大多数用例,特别是写操作大部分异步的情况。

bfq

以桌面系统和互动任务为目标。

bfq 调度程序确保单个应用程序永远不会使用所有带宽。实际上,存储设备总是像它们处于闲置时一样进行响应。在默认配置中,bfq 着重提供最低延迟,而不是实现最大吞吐量。

bfq 基于 cfq 代码。它不会为每个进程分配一个固定时间片段的磁盘,而是以扇区数为进程分配一个预算

此调度程序适合用于复制大型文件,在这种情况下,系统也不会变得无响应。

kyber

调度程序通过计算提交至块 I/O 层的每个 I/O 请求的延迟来调整自身以达到延迟目标。如果出现缓存缺少和同步写入请求,您可以为读取配置目标延迟。

这个调度程序适合快速设备,如 NVMe、SSD 或其他低延迟设备。

15.2. 不同用例的不同磁盘调度程序

根据您的系统执行的任务,在分析和调整任务之前,建议使用以下磁盘调度程序作为基准:

表 15.1. 适用于不同用例的磁盘调度程序

使用案例磁盘调度程序

传统的使用 SCSI 接口的 HDD

使用 mq-deadlinebfq

高性能 SSD 或具有快速存储的 CPU 绑定系统

使用 none,特别是在运行企业级应用程序时。另外,还可使用 kyber

桌面或互动任务

使用 bfq

虚拟客户端

使用 mq-deadline。对于支持多队列的主机总线适配器(HBA)驱动程序,请使用 none

15.3. 默认磁盘调度程序

块设备使用默认磁盘调度程序,除非您指定了另一个调度程序。

注意

对于 non-volatile Memory Express (NVMe) 块设备,默认调度程序是 none,红帽建议不要更改它。

内核根据设备类型选择默认磁盘调度程序。自动选择的调度程序通常是最佳设置。如果您需要不同的调度程序,红帽建议使用 udev 规则或 Tuned 应用程序进行配置。匹配所选设备并只为那些设备切换调度程序。

15.4. 确定活跃磁盘调度程序

此流程决定了哪个磁盘调度程序目前在给定块设备中活跃。

流程

  • 阅读 /sys/block/device/queue/scheduler 文件的内容:

    # cat /sys/block/device/queue/scheduler
    
    [mq-deadline] kyber bfq none

    在文件名中,使用块设备名称替换 device,例如 sdc

    活跃调度程序列在方括号([ ])中。

15.5. 使用 Tuned 设置磁盘调度程序

此流程创建并启用 Tuned 配置集,该配置集为所选块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。

在以下命令和配置中替换:

  • 带有块设备名称的设备,例如: sdf
  • 带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如 bfq

先决条件

流程

  1. 可选:选择一个您配置集将要基于的现有 Tuned 配置集。有关可用配置集列表,请参阅 RHEL 提供的 Tuned 配置集

    要查看哪个配置集当前处于活跃状态,请使用:

    $ tuned-adm active
  2. 创建一个新目录来保存您的 Tuned 配置集:

    # mkdir /etc/tuned/my-profile
  3. 查找所选块设备系统唯一标识符:

    $ udevadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'
    
    ID_WWN=0x5002538d00000000_
    ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    ID_SERIAL_SHORT=20120501030900000
    注意

    本例中的 命令将返回标识为全局名称(WWN)或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但 WWN 并不总是可用于给定设备,示例命令返回的任何值都可用作设备系统唯一 ID

  4. 创建 /etc/tuned/my-profile/tuned.conf 配置文件。在该文件中设置以下选项:

    1. 可选:包含现有配置集:

      [main]
      include=existing-profile
    2. 为与 WWN 标识符匹配的设备设置所选磁盘调度程序:

      [disk]
      devices_udev_regex=IDNAME=device system unique id
      elevator=selected-scheduler

      在这里:

      • 使用正在使用的标识符的名称替换 IDNAME (例如 ID_WWN)。
      • 将设备系统唯一 id 替换为所选标识符的值(例如 0x5002538d00000000)。

        要匹配 devices_udev_regex 选项中的多个设备,请将标识符括在括号中,并使用竖线分隔它们:

        devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
  5. 启用您的配置集:

    # tuned-adm profile my-profile

验证步骤

  • 验证 Tuned 配置集是否活跃并应用:

    $ tuned-adm active
    
    Current active profile: my-profile
    $ tuned-adm verify
    
    Verification succeeded, current system settings match the preset profile.
    See tuned log file ('/var/log/tuned/tuned.log') for details.

15.6. 使用 udev 规则设置磁盘调度程序

此流程使用 udev 规则为特定块设备设置给定磁盘调度程序。这个设置会在系统重启后保留。

在以下命令和配置中替换:

  • 带有块设备名称的设备,例如: sdf
  • 带有您要为该设备设置的磁盘调度程序的 selected-scheduler,例如 bfq

流程

  1. 查找块设备系统唯一标识符:

    $ udevadm info --name=/dev/device | grep -E '(WWN|SERIAL)'
    E: ID_WWN=0x5002538d00000000
    E: ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    E: ID_SERIAL_SHORT=20120501030900000
    注意

    本例中的 命令将返回标识为全局名称(WWN)或与指定块设备关联的序列号的所有值。虽然最好使用 WWN,但 WWN 并不总是可用于给定设备,示例命令返回的任何值都可用作设备系统唯一 ID

  2. 配置 udev 规则。使用以下内容创建 /etc/udev/rules.d/99-scheduler.rules 文件:

    ACTION=="add|change", SUBSYSTEM=="block", ENV{IDNAME}=="device system unique id", ATTR{queue/scheduler}="selected-scheduler"

    在这里:

    • 使用正在使用的标识符的名称替换 IDNAME (例如 ID_WWN)。
    • 将设备系统唯一 id 替换为所选标识符的值(例如 0x5002538d00000000)。
  3. 重新载入 udev 规则:

    # udevadm control --reload-rules
  4. 应用调度程序配置:

    # udevadm trigger --type=devices --action=change

验证步骤

  • 验证活跃的调度程序:

    # cat /sys/block/device/queue/scheduler

15.7. 为特定磁盘临时设置调度程序

此流程为特定块设备设置给定磁盘调度程序。系统重启后该设置不会保留。

流程

  • 将所选调度程序的名称写入 /sys/block/device/queue/scheduler 文件:

    # echo selected-scheduler > /sys/block/device/queue/scheduler

    在文件名中,使用块设备名称替换 device,例如 sdc

验证步骤

  • 验证调度程序是否在该设备中活跃:

    # cat /sys/block/device/queue/scheduler

第 16 章 设置远程无盘系统

以下小节概述了在网络环境中部署远程无盘系统所需的步骤。当您需要多个具有相同配置的客户端时,实施此解决方案非常有用。此外,这将节省客户端数量的硬盘驱动器成本。假设服务器安装了 Red Hat Enterprise Linux 8 操作系统。

图 16.1. 远程无盘系统设置图

远程无盘系统设置图

请注意,可以在单独的服务器上配置网关。

16.1. 为远程无盘系统准备环境

这个过程描述了为远程无盘系统准备环境。

远程无盘系统引导需要 tftp 服务(由 tftp-server提供)和 DHCP 服务(由 dhcp提供)。tftp 服务用于通过 PXE 加载器通过网络检索内核镜像和 initrd

先决条件

  • 安装以下软件包:

    • tftp-server
    • xinetd
    • dhcp-server
    • syslinux
  • 设置网络连接。

流程

  1. 安装 dracut-network 软件包:

    # yum install dracut-network
  2. 安装 dracut-network 软件包后,在 /etc/dracut.conf 中添加以下行:

    add_dracutmodules+="nfs"
重要

有些 RPM 软件包已经使用文件功能启动(如 setcapgetcap)。但是,NFS 目前不支持它们,因此尝试安装或更新任何使用文件功能的软件包都会失败。

此时,您的服务器已准备好继续远程无盘系统实施。

16.2. 为无盘客户端配置 tftp 服务

这个步骤描述了如何为无盘客户端配置 tftp 服务。

先决条件

配置 tftp

  1. 通过网络启用 PXE 引导:

    # systemctl enable --now tftp
  2. tftp 根目录(chroot)位于 /var/lib/tftpboot 中。将 /usr/share/syslinux/pxelinux.0 复制到 /var/lib/tftpboot/

    # cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
  3. /usr/share/syslinux/ldlinux.c32 复制到 /var/lib/tftpboot/

    # cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/
  4. tftp 根目录中创建 pxelinux.cfg 目录:

    # mkdir -p /var/lib/tftpboot/pxelinux.cfg/
  5. 为无盘客户端配置 tftp 后,请相应地配置 DHCP、NFS 和导出的文件系统。

16.3. 为无盘客户端配置 DHCP 服务器

这个步骤描述了如何为无盘系统配置 DHCP。

先决条件

流程

  1. 通过在 /etc/dhcp/dhcpd.conf 中添加以下配置来设置 DHCP 服务器并启用 PXE 引导:

    allow booting;
    allow bootp;
    subnet 192.168.205.0 netmask 255.255.255.0 {
      pool
      {
        range 192.168.205.10 192.168.205.25;
      }
    
      option subnet-mask 255.255.255.0;
      option routers 192.168.205.1;
    }
    class "pxeclients" {
       match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
       next-server server-ip;
       filename "pxelinux.0";
    }

    这个配置不会通过 UEFI 引导。要为 UEFI 执行安装,请按照本文档中的步骤: 为基于 UEFI 的客户端配置 TFTP 服务器。另外,请注意 /etc/dhcp/dhcpd.conf 是一个示例文件。

    注意

    libvirt 虚拟机用作无盘客户端时,libvirt 提供 DHCP 服务,并且不使用独立 DHCP 服务器。在这种情况下,必须使用 libvirt 网络配置 virsh net-edit 中的 bootp file='filename' 选项启用网络引导。

  2. 输入以下命令启用 dhcpd.service:

    # systemctl enable --now dhcpd.service

16.4. 为无盘客户端配置导出的文件系统

这个步骤描述了如何为无盘客户端配置导出的文件系统。

先决条件

流程

  1. 将 NFS 服务器配置为导出根目录,方法是将其添加到 /etc/exports 中。具体步骤请查看 NFS 服务器配置
  2. 要完全使用无盘客户机,根目录应该包含完整的 Red Hat Enterprise Linux。您可以安装新的基础系统或克隆现有安装:

    • 要将 Red Hat Enterprise Linux 安装到导出位置,请使用带 --installroot 选项的 yum 工具:

      # yum install @Base kernel dracut-network nfs-utils \
            --installroot=exported-root-directory --releasever=/
    • 要与正在运行的系统同步,请使用 rsync 实用程序:

      # rsync -a -e ssh --exclude='/proc/' --exclude='/sys/' \
             example.com:/  exported-root-directory
      • 使用正在运行的系统的主机名替换 example.com,以便通过 rsync 实用程序同步。
      • 使用导出的文件系统的路径替换 exported-root-directory

        请注意,对于此选项,您必须有一个单独的现有运行系统,系统将通过上述命令克隆到服务器。

导出的文件系统仍然需要进一步配置,然后才能被无盘客户端使用。要做到这一点,请执行以下步骤:

配置文件系统

  1. 选择无盘客户端应使用(vmlinuz-kernel-version)的内核,并将其复制到 tftp 引导目录中:

    # cp /exported-root-directory/boot/vmlinuz-kernel-version /var/lib/tftpboot/
  2. 创建带有 NFS 支持的 initrd (即 initramfs-kernel-version.img):

    # dracut --add nfs initramfs-kernel-version.img kernel-version
  3. 使用以下命令将 initrd 的文件权限改为 644:

    # chmod 644 /exported-root-directory/boot/initramfs-<kernel-version>.img
    警告

    如果您不更改 initrd 的文件权限,pxelinux.0 引导装载程序将失败,并显示 "file not found" 错误。

  4. 将生成的 initramfs-kernel-version.img 复制到 tftp 引导目录中:

    # cp /exported-root-directory/boot/initramfs-kernel-version.img /var/lib/tftpboot/
  5. 编辑默认引导配置,使用 /var/lib/tftpboot/ 目录中的 initrd 和内核。此配置应该指示无盘客户端的 root 以读写模式挂载导出的文件系统(/exported-root-directory)。在 /var/lib/tftpboot/pxelinux.cfg/default 文件中添加以下配置:

    default rhel8
    
    label rhel8
      kernel vmlinuz-kernel-version
      append initrd=initramfs-kernel-version.img root=nfs:server-ip:/exported-root-directory rw

    server-ip 替换为主机的 tftp 和 DHCP 服务所在主机的 IP 地址。

  6. 另外,您可以使用 /var/lib/tftpboot/pxelinux.cfg/default 文件中的以下配置以只读格式挂载系统

    default rhel8
    
    label rhel8
      kernel vmlinuz-kernel-version
      append initrd=initramfs-kernel-version.img root=nfs:server-ip:/exported-root-directory ro
  7. 重启 NFS 服务器。

NFS 共享现在可以导出到无盘客户端。这些客户端可通过 PXE 通过网络引导。

16.5. 重新配置远程无盘系统

在某些情况下您需要重新配置该系统。以下步骤演示了如何更改用户的密码、如何在系统中安装软件以及如何将系统分割为只读模式的 /usr 以及处于读写模式的 /var

先决条件

  • no_root_squash 选项在导出的文件系统中启用。

流程

  1. 要更改用户密码,请按照以下步骤执行:

    • 将命令行改为 /exported/root/directory:

      # chroot /exported/root/directory /bin/bash
    • 更改您想要的用户的密码:

      # passwd <username>

      使用您要更改密码的实际用户替换 <username>

    • 退出命令行:

      # exit
  2. 要将软件安装到远程无盘系统中,请使用以下命令:

    # yum install <package> --installroot=/exported/root/directory --releasever=/ --config /etc/dnf/dnf.conf --setopt=reposdir=/etc/yum.repos.d/

    用要安装的实际软件包替换 <package>

  3. 要将远程无盘系统分成 /usr/var,您必须配置两个独立的导出。详情请阅读 NFS 服务器配置 文档。

16.6. 加载远程无盘系统的最常见的问题

下面的部分描述了在无盘客户端中加载远程无盘系统期间的问题,并显示了这些问题可能的解决方案。

16.6.1. 客户端无法获得 IP 地址

要排除这个问题,请执行以下操作:

  1. 检查是否在服务器中启用了 DHCP 服务。

    • 检查 dhcp.service 是否在运行:

      # systemctl status dhcpd.service
    • 如果 dhcp.service 不活跃,您必须启用并启动它:

      # systemctl enable dhcpd.service
      # systemctl start dhcpd.service

      重启无磁盘客户端。

  2. 如果问题仍然存在,请检查服务器上的 DHCP 配置文件 /etc/dhcp/dhcpd.conf。更多信息请参阅 第 16.3 节 “为无盘客户端配置 DHCP 服务器”
  3. 检查防火墙端口是否已打开。

    • 检查 tftp.service 是否在活跃服务中列出:

      # firewall-cmd --get-active-zones
      # firewall-cmd --info-zone=public
    • 如果 tftp.service 没有在活跃的服务中列出,将其添加到列表中:

      # firewall-cmd --add-service=tftp
    • 检查 nfs.service 是否在活跃服务中列出:

      # firewall-cmd --get-active-zones
      # firewall-cmd --info-zone=public
    • 如果 nfs.service 没有在活跃的服务中列出,将其添加到列表中:

      # firewall-cmd --add-service=nfs

16.6.2. 在引导远程无盘系统的过程中这些文件不可用

要排除这个问题,请执行以下操作:

  1. 检查这个文件是否就位。服务器 /var/lib/tftpboot/ 中的位置。
  2. 如果这个文件存在,请检查它的权限:

    # chmod 644 pxelinux.0
  3. 检查防火墙端口是否已打开。

16.6.3. 在载入 kernel/initrd 后系统引导失败

要排除这个问题,请执行以下操作:

  1. 检查是否在服务器中启用了 NFS 服务。

    • 检查 nfs.service 是否在运行:

      # systemctl status nfs.service
    • 如果 nfs.service 不活跃,您必须启用并启动它:

      # systemctl enable nfs.service
      # systemctl start nfs.service
  2. 检查 pxelinux.cfg 中的参数是否正确。如需了解更多详细信息,请参阅 第 16.4 节 “为无盘客户端配置导出的文件系统”
  3. 检查防火墙端口是否已打开。

第 17 章 管理 RAID

本章论述了独立磁盘冗余阵列(RAID)。用户可以使用 RAID 在多个驱动器间存储数据。它还有助于避免驱动器失败时数据丢失。

17.1. 独立磁盘冗余阵列(RAID)

RAID 的基本概念是将多个设备(如 HDDSSDNVMe )组合成一个阵列来完成性能或冗余目标,而不是在一个大而昂贵的驱动器中。这组设备以单一逻辑存储单元或驱动器在计算机中出现。

RAID 允许在多个设备间分布信息。RAID 使用磁盘分条(RAID 级别 0)、磁盘镜像(RAID 级别 1)和带有奇偶校验(RAID 级别 4、5 和 6)的磁盘条带来实现冗余 、更低延迟、增大带宽并最大化从硬盘崩溃中恢复的功能

RAID 通过将数据拆分为统一大小的区块(通常为 256K 或 512k,但接受其他值),从而跨阵列中的每个设备分布数据。然后,每个块根据所使用的 RAID 级别写入 RAID 阵列中的硬盘驱动器。当读取数据时,进程会被撤销,从而假象阵列中的多个设备实际上是一个大驱动器。

系统管理员以及管理大量数据的其他人将受益于使用 RAID 技术。部署 RAID 的主要原因包括:

  • 加强速度
  • 使用单一虚拟磁盘增加存储容量
  • 尽可能减少磁盘失败的数据丢失
  • RAID 布局和级别在线转换

17.2. RAID 类型

RAID 方法有三种:固件 RAID、硬件 RAID 和软件 RAID。

固件 RAID

固件 RAID (也称为 ATARAID)是一种软件 RAID,可在其中使用基于固件的菜单配置 RAID 集。此 RAID 使用的固件也会钩在 BIOS 中,允许您从 RAID 集启动。不同的供应商使用不同的磁盘元数据格式来标记 RAID 设置成员。Intel Matrix RAID 是固件 RAID 系统的一个很好的例子。

硬件 RAID

基于硬件的阵列独立于主机管理 RAID 子系统。它可能会在每个 RAID 阵列中存在多个设备。

硬件 RAID 设备可能是系统内部或者外部的。内部设备通常由在操作系统中透明地处理 RAID 任务的特殊控制器卡组成。外部设备通常通过 SCSI、光纤、iSCSI、InfiniBand 或者其它高速网络互联连接的系统,并显示卷如逻辑单元到系统。

RAID 控制器卡的功能与操作系统的 SCSI 控制器相同,用于处理所有实际驱动器间的通信。用户将驱动器插入 RAID 控制器(就像普通 SCSI 控制器),然后将它们添加到 RAID 控制器的配置中。操作系统将无法辨别它们的不同。

软件 RAID

软件 RAID 在内核块设备代码中实现各种 RAID 级别。它提供最便宜的解决方案,如昂贵的磁盘控制器卡或热交换机箱 [1] 不需要。软件 RAID 还可用于 Linux 内核支持的任何块存储,如 SATA、SCSINVMe。由于 CPU 速度更快,软件 RAID 通常会优于硬件 RAID,除非您使用高端存储设备。

Linux 内核包含一个多个设备 (MD)驱动程序,允许 RAID 解决方案完全独立于硬件。基于软件的阵列的性能取决于服务器 CPU 性能和负载。

Linux 软件 RAID 堆栈的主要特性:

  • 多线程设计
  • 在不同的 Linux 机器间移动磁盘阵列不需要重新构建数据
  • 使用空闲系统资源构建后台阵列
  • 对热插拔驱动器的支持
  • 自动 CPU 检测,以利用某些 CPU 功能,如流传输单指令多数据(SIMD)支持
  • 自动更正阵列磁盘上坏扇区
  • 定期检查 RAID 数据,以确保阵列健康
  • 使用发送至重要事件上的指定电子邮件地址的电子邮件警报主动监控阵列
  • write-intent 位映射可让内核准确知道需要重新同步磁盘的部分,而不是在系统崩溃后重新同步整个阵列,从而显著提高重新同步事件的速度

    请注意: resync 是一个通过现有 RAID 设备同步数据以达到冗余的过程

  • 重新同步检查点以便如果您在重新同步期间重新引导计算机,则在启动时重新同步会选择它离开的位置,而不是全部重新启动
  • 能够在安装后更改阵列的参数,这称为 reshaping。例如,当有要添加新设备时,您可以将 4 磁盘 RAID5 阵列增加到 5 磁盘 RAID5 阵列。这个增长的操作是实时的,不需要您在新阵列中重新安装
  • 重新定义支持更改设备数量、RAID 算法或 RAID 阵列类型的大小,如 RAID4、RAID5、RAID6 或 RAID10
  • 接管支持 RAID 级别转换,如 RAID0 到 RAID6


[1] 热交换机箱允许您删除硬盘驱动器,而无需关闭系统。

17.3. RAID 级别和线性支持

RAID 支持各种配置,包括 0、1、4、5、6、10 和 linear。这些 RAID 类型定义如下:

0 级

RAID 级别 0,通常被称为条带化数据映射技术。这意味着,要写入阵列的数据被分成条块,并在阵列的成员磁盘中写入,这样可以在成本低的情况下提供高的 I/O 性能,但不提供冗余。

许多 RAID 级别 0 的实现只在成员设备间条状分布到阵列中最小设备的大小。就是说,如果您有多个设备,它们的大小稍有不同,那么每个设备的大小都被视为与最小设备的大小相同。因此,级别 0 阵列的一般存储容量等于,硬件 RAID 中容量最小的成员磁盘的容量,或软件 RAID 中的最小成员分区的容量,在乘以阵列中的磁盘或分区的数量。

1 级

RAID 级别 1 或称为镜像,通过将相同数据写入阵列的每个磁盘来提供冗余,在每个磁盘上保留"镜像"副本。因为其简单且数据高度可用,RAID 1 仍然被广泛使用。级别 1 需要两个或者多个磁盘,它提供了很好的数据可靠性,提高了需要读取的应用程序的性能,但是成本相对高。

为了实现数据可靠性,需要向阵列中的所有磁盘写入相同的信息,所以 RAID 1 的成本会很高。与基于奇偶校验的其他级别(如级别 5)相比,空间的利用效率较低。然而,对空间利用率的牺牲提供了高性能:基于奇偶校验的 RAID 级别会消耗大量 CPU 资源以便获得奇偶校验,而 RAID 级别 1 只是一次向多个 RAID 成员中写入同样数据,其对 CPU 的消耗较小。因此,在使用软件 RAID 的系统中,或系统中有其他操作需要大量使用 CPU 资源时,RAID 1 可能会比使用基于奇偶校验的 RAID 级别的性能更好。

级别 1 阵列的存储容量等于硬件 RAID 中最小镜像硬盘或者软件 RAID 中最小镜像分区的容量相同。级别 1 所提供的冗余性是所有 RAID 级别中最高的,因为阵列只需要在有一个成员可以正常工作的情况下就可以提供数据。

级别 4

级别 4 使用单一磁盘驱动器中的奇偶校验来保护数据。奇偶校验信息根据阵列中其余成员磁盘的内容计算。然后当阵列中的一个磁盘失败时,这个信息就可以被用来重建数据。然后,在出现问题的磁盘被替换前,使用被重建的数据就可以满足 I/O 的请求。在磁盘被替换后,可以在上面重新生成数据。

因为 RAID 4 使用一个专门的偶校验磁盘,因此这个磁盘就会成为对 RAID 阵列的写入操作的一个固有的瓶颈。所以, RAID 4 较少被使用。因此,Anaconda 中并没有提供 RAID 4 这个选项。但是,如果真正需要,用户可以手动创建它。

硬件 RAID 4 的存储容量等于分区数量减一乘以最小成员分区的容量。RAID 4 阵列的性能是非对称的,即读的性能会好于写的性能。这是因为,写入会在生成奇偶校验时消耗额外的 CPU 和主内存带宽,然后在将实际数据写入磁盘时也消耗额外的总线带宽,因为您不仅是写入数据,而且是奇偶校验。读取只需要读取数据而不是奇偶校验,除非该阵列处于降级状态。因此,在正常操作条件下,读取会在计算机的驱动器和总线间产生较少的流量,以实现相同数量的数据传输。

5 级

这是最常见的 RAID 类型。通过在一个阵列的所有成员磁盘中分布奇偶校验,RAID 5 解除了级别 4 中原有的写入瓶颈。唯一性能瓶颈是奇偶校验计算过程本身。在使用现代 CPU 和软件 RAID 时,这通常不会成为瓶颈,因为现代 CPU 可能会非常快速地生成奇偶校验。然而,如果您的软件 RAID5 阵列中有大量成员设备,且在所有设备间有大量的数据进行传输时,就可能出现瓶颈。

和级别 4 一样,级别 5 的性能也是非对称的,读性能会高于写的性能。RAID 5 的存储容量的计算方法与级别 4 的计算方法是一样的。

级别 6

如果数据的冗余性和保护性比性能更重要,且无法接受 RAID 1 的空间利用率低的问题,则通常会选择使用级别 6。级别 6 使用一个复杂的奇偶校验方式,可以在阵列中出现任意两个磁盘失败的情况下进行恢复。因为使用的奇偶校验方式比较复杂,软件 RAID 设备会对 CPU 造成较大负担,同时对写操作造成更大的负担。因此,与级别 4 和 5 相比,级别 6 的性能不对称性更严重。

RAID 6 阵列的总容量与 RAID 5 和 4 类似,但您必须从设备数量中减小两个(而不是 1 个)额外奇偶校验存储空间的设备数。

级别 10

这个 RAID 级别将级别 0 的性能优势与级别 1 的冗余合并。它还有助于减少在有多于 2 个设备时,级别 1 阵列中的利用率低的问题。在级别 10 中,可以创建一个 3 个驱动器阵列来只存储每个数据的 2 个副本,然后允许整个阵列的大小达到最小设备的 1.5 倍,而不是只等于最小设备(与有 3 个设备的级别 1 阵列相同)。与 RAID 级别 6 相比,计算奇偶校验对 CPU 的消耗较少,但空间效率较低。

在安装过程中,不支持创建 RAID 10。您可在安装后手动创建。

线性 RAID

线性 RAID 是创建更大的虚拟驱动器的一组驱动器。

在线性 RAID 中,块会被从一个成员驱动器中按顺序分配,只有在第一个完全填充时才会进入下一个驱动器。这个分组方法不会提供性能优势,因为 I/O 操作不太可能在不同成员间同时进行。线性 RAID 也不提供冗余性,并会降低可靠性。如果有任何一个成员驱动器失败,则无法使用整个阵列。该容量是所有成员磁盘的总量。

17.4. Linux RAID 子系统

以下子系统组成了 Linux 中的 RAID 系统:

17.4.1. Linux 硬件 RAID 控制器驱动程序

硬件 RAID 控制器在 Linux 中没有特定的 RAID 子系统。由于它们使用特殊的 RAID 芯片组,硬件 RAID 控制器随自己的驱动程序一起提供;这些驱动程序允许系统将 RAID 集作为常规磁盘检测。

17.4.2. mdraid

mdraid 子系统被设计为 Linux 的软件 RAID 解决方案,也是 Linux 下软件 RAID 的首选解决方案。此子系统使用自己的元数据格式,通常称为原生 MD 元数据。

mdraid 也支持其他元数据格式,称为外部元数据。Red Hat Enterprise Linux 8 使用 mdraid 和外部元数据来访问 ISW/ IMSM(Intel 固件 RAID)集和 SNIA DDF。mdraid 集合通过 mdadm 工具配置和控制。

17.5. 创建软件 RAID

按照以下步骤创建独立磁盘冗余阵列(RAID)设备。RAID 设备由多个存储设备组成的,它可以提高性能,并可以配置为增加容错功能。

创建 RAID 设备只需要一步,并可根据需要添加或者删除磁盘。您可以为系统中的每个物理磁盘配置一个 RAID 分区,因此安装程序可使用的磁盘数决定可用 RAID 设备的级别。例如: 如果系统只有两个硬盘,就无法创建 RAID 10 设备,因为它至少需要 3 个独立的磁盘。

注意

在 IBM Z 中,存储子系统会透明地使用 RAID。您不必手动配置软件 RAID。

先决条件

  • 您已经选择了两个或者多个磁盘,然后才能看到 RAID 配置选项。创建 RAID 设备至少需要两个磁盘。
  • 您创建了挂载点。通过配置挂载点,就可以配置 RAID 设备。
  • 您已在 Installation Destination 窗口中选择了 Custom 单选按钮。

流程

  1. Manual Partitioning 窗口左面地框中,选所需的分区。
  2. Device(s) 部分点 修改。此时会打开 Configure Mount Point 对话框。
  3. 选择您要包含在 RAID 设备中的磁盘并点击 选择
  4. 点击设备类型下拉菜单并选择 RAID
  5. 点击文件系统下拉菜单并选择您首选的文件系统类型。
  6. 点击RAID 级别下拉菜单并选择您需要的 RAID 级别。
  7. 点击 更新设置 保存您的更改。
  8. 点击 完成 按钮应用该设置并返回 安装概述 窗口。

如果指定的 RAID 级别需要更多磁盘,则会在窗口底部显示一 条信息。

要使用存储系统角色创建并配置 RAID 卷,请参阅 第 2.12 节 “使用存储系统角色配置 RAID 卷”

要了解更多有关软崩溃以及在配置 RAID LV 时如何保护数据的信息,请参阅使用带有 RAID LV 的 DM 完整性

17.6. 安装后创建软件 RAID

这个步骤描述了如何使用 mdadm 实用程序在现有系统中创建软件冗余磁盘阵列(RAID)。

先决条件

流程

  1. 要创建两个块设备的 RAID,如 /dev/sda1/dev/sdc1,请使用以下命令:

    # mdadm --create /dev/md0 --level=<level_value> --raid-devices=2 /dev/sda1 /dev/sdc1

    <level_value> 替换为 RAID 级别。详情请查看 mdadm(8) man page。

  2. 另外,要检查 RAID 的状态,使用以下命令:

    # mdadm --detail /dev/md0
  3. 另外,要查看每个 RAID 设备的详细信息,请使用以下命令:

    # mdadm --examine /dev/sda1 /dev/sdc1
  4. 要在 RAID 驱动器中创建文件系统,请使用以下命令:

    # mkfs -t <file-system-name> /dev/md0

    其中 <file-system-name> 是一个您选择格式化驱动器的具体文件系统。详情请查看 mkfs man page。

  5. 要为 RAID 驱动器生成挂载点并挂载它,请使用以下命令:

    # mkdir /mnt/raid1
    # mount /dev/md0 /mnt/raid1

完成上述步骤后,RAID 就可以使用。

17.7. 使用存储系统角色配置 RAID 卷

使用 storage 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 上配置 RAID 卷。在本小节中,您将了解如何使用可用参数设置 Ansible playbook,以配置 RAID 卷以满足您的要求。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要部署 storage 解决方案的系统中安装 Red Hat Ansible Automation Platform。

  • 已安装该系统中要运行 playbook 的 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用 storage 系统角色部署 RAID 卷的系统。

流程

  1. 使用以下内容 playbook.yml 创建新文件:

    - hosts: all
      vars:
        storage_safe_mode: false
        storage_volumes:
          - name: data
            type: raid
            disks: [sdd, sde, sdf, sdg]
            raid_level: raid0
            raid_chunk_size: 32 KiB
            mount_point: /mnt/data
            state: present
      roles:
        - name: rhel-system-roles.storage
    警告

    设备名称在某些情况下可能会改变,例如:当您在系统中添加新磁盘时。因此,为了避免数据丢失,我们不建议在 playbook 中使用特定的磁盘名称。

  2. 可选。验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • 有关存储系统角色中使用的参数的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

17.8. 配置 RAID

下面的部分论述了如何修改现有 RAID。要做到这一点,请选择以下方法之一:

  • 更改 RAID 属性(也称为 RAID reshape)。
  • 转换 RAID 级别(也称为 RAID 接管)。

17.8.1. 重新设定 RAID

本章论述了如何重新定义 RAID。您可以选择调整 RAID 大小的方法之一:

  • 放大(扩展)RAID。
  • 缩小 RAID。

17.8.1.1. 重新定义 RAID 大小(扩展)

这个步骤描述了如何增大 RAID。假设 /dev/md0 是您要增大的 RAID。

先决条件

  • 有足够的磁盘空间。
  • 已安装软件包 parted

流程

  1. 扩展 RAID 分区。要做到这一点,请按照重新定义分区文档大小的说明进行操作。
  2. 要将 RAID 扩展到最大分区容量,使用以下命令:

    # mdadm --grow --size=max /dev/md0

    请注意,要确定具体大小,您必须使用 kB 编写 --size 参数(例如 --size=524228)。

  3. 增加文件系统的大小。如需更多信息,请查看 管理文件系统文档

17.8.1.2. 重新定义 RAID 大小(缩小)

这个步骤描述了如何缩小 RAID。假设 /dev/md0 是您要缩小到 512MB 的 RAID。

先决条件

  • 已安装软件包 parted

流程

  1. 缩小文件系统。为此,请查看管理文件系统文档

    重要

    XFS 文件系统不支持缩小。

  2. 要将 RAID 减小到 512 MB,使用以下命令:

    # mdadm --grow --size=524228 /dev/md0

    请注意,您必须以 kB 为单位写入 --size 参数。

  3. 将分区缩小到您需要的大小。为此,请按照重新定义分区文档大小的说明进行操作

17.8.2. RAID 接管

本章论述了 RAID 中支持的转换,并包含完成这些转换的步骤。

17.8.2.1. 支持的 RAID 转换

可以从一个 RAID 级别转换到另一个 RAID 级别。这部分提供了列出支持的 RAID 转换列表。

 RAID0RAID1RAID4RAID5RAID6RAID10

RAID0

RAID1

RAID4

RAID5

RAID6

RAID10

例如:您可以将 RAID 0 转换为 RAID 4、RAID 级别 5 和 RAID 10

其它资源

  • 有关 RAID 级别转换的详情请参考 mdadm man page。

17.8.2.2. 转换 RAID 级别

这个步骤描述了如何将 RAID 转换为不同的 RAID 级别。假设您要将 RAID /dev/md0 级别 0 转换为 RAID 5,并在阵列中添加一个新的磁盘 /dev/sdd

先决条件

流程

  1. 要将 RAID /dev/md0 转换为 RAID 级别 5,请使用以下命令:

    # mdadm --grow --level=5 -n 3 /dev/md0 --force
  2. 要给阵列添加新磁盘,请使用以下命令:

    # mdadm --manage /dev/md0 --add /dev/sdd
  3. 要查看转换阵列的新详情,请使用以下命令:

    # mdadm --detail /dev/md0

其它资源

  • 有关 RAID 级别转换的详情请参考 mdadm man page。

17.9. 安装后将根磁盘转换为 RAID1

这部分论述了如何在安装 Red Hat Enterprise Linux 8 后将非 RAID root 磁盘转换为 RAID1 镜像。

在 PowerPC(PPC)构架中,执行以下步骤:

流程

  1. 将 PowerPC Reference Platform(PReP)引导分区的内容从 /dev/sda1 复制到 /dev/sdb1:

    # dd if=/dev/sda1 of=/dev/sdb1
  2. 更新两个磁盘上的第一个分区中的 Prep 和 boot 标记:

    $ parted /dev/sda set 1 prep on
    $ parted /dev/sda set 1 boot on
    
    $ parted /dev/sdb set 1 prep on
    $ parted /dev/sdb set 1 boot on
注意

运行 grub2-install /dev/sda 命令无法在 PowerPC 机器上工作,并返回错误,但系统会按预期引导。

17.10. 创建高级 RAID 设备

在某些情况下,您可能想要在安装完成后无法创建的阵列上安装操作系统。通常,这意味着在复杂的 RAID 设备中设置 /boot 或者 root 文件系统阵列。在这种情况下,您可能需要使用Anaconda 安装程序不支持的阵列选项。要临时解决这个问题,请执行以下步骤:

流程

  1. 插入安装磁盘。
  2. 在初始引导过程中,选择 Rescue Mode 而不是 InstallUpgrade当系统完全引导进入救援模式时,用户会看到一个命令行终端。
  3. 在这个终端中,使用 parted 在目标硬盘中创建 RAID 分区。然后,使用 mdadm 使用任何和所有可用的设置和选项从这些分区中手动创建 raid 阵列。有关如何进行这些操作的更多信息,请参阅 man partedman mdadm
  4. 创建阵列后,您可以选择在阵列中创建文件系统。
  5. 重启计算机并选择 InstallUpgrade 进行正常安装。Anaconda 安装程序搜索系统中的磁盘时,它将找到预先存在的 RAID 设备。
  6. 当系统询问如何使用磁盘时,请选择 Custom Layout 并点 Next。在设备列表中,会列出预先存在的 MD RAID 设备。
  7. 选择 RAID 设备,点 Edit 并配置其挂载点和(可选)应使用的文件系统类型(如果您之前未创建),然后单击 DoneAnaconda 将在这个预先存在的 RAID 设备中执行安装,在在 Rescue Mode 中创建自定义选项时保留您选择的自定义选项。
注意

安装程序的有限 Rescue 模式不包括 man 页面。man mdadmman md 都包含用于创建自定义 RAID 阵列的有用信息,在整个临时解决方案中可能会需要它。因此,您可以需要可以访问有这些 man 页面的机器,或者在引导到救援模式 并创建自定义阵列前打印这些信息。

17.11. 监控 RAID

这个模块描述了如何使用 mdadm 工具设置 RAID 监控选项。

先决条件

  • 已安装软件包 mdadm
  • 设定邮件服务。

流程

  1. 要为监控阵列创建配置文件,您必须扫描详情并将结果转发到 /etc/mdadm.conf 文件。要做到这一点,请使用以下命令:

    # mdadm --detail --scan >> /etc/mdadm.conf

    请注意,ARRAYMAILADDR 是必需的变量。

  2. 使用您选择的文本编辑器打开配置文件 /etc/mdadm.conf
  3. 使用通知的电子邮件地址添加 MAILADDR 变量。例如,添加新行:

    MAILADDR <example@example.com>

    其中 是您要从阵列监控接收警报的电子邮件地址。

  4. /etc/mdadm.conf 文件中保存更改并关闭它。

完成上述步骤后,监控系统会将警报发送到电子邮件地址。

其它资源

  • 有关详情请参考 mdadm.conf 5 man page。

17.12. 维护 RAID

这部分提供各种 RAID 维护过程。

17.12.1. 替换 RAID 中出现故障的磁盘

这个步骤描述了如何替换独立磁盘冗余阵列(RAID)中的故障磁盘。假设您拥有 /dev/md0 RAID 10。在这种情况下,/dev/sdg 磁盘有故障,您需要将其替换为新磁盘 /dev/sdh

先决条件

  • 额外的备用磁盘。
  • 已安装 mdadm 软件包。
  • 有关阵列中出现故障磁盘的通知。要设置数组监控,请参阅 第 17.11 节 “监控 RAID”

流程

  1. 确定哪个磁盘失败。要做到这一点,请输入以下命令:

    # journalctl -k -f

    您会看到一条信息,显示哪个磁盘失败:

    md/raid:md0: Disk failure on sdg, disabling device.
    md/raid:md0: Operation continuing on 5 devices.
  2. Ctrl+C 键退出 journalctl 程序。
  3. 为阵列添加新磁盘。要做到这一点,请输入以下命令:

    # mdadm --manage /dev/md0 --add /dev/sdh
  4. 将失败的磁盘标记为故障。要做到这一点,请输入以下命令:

    # mdadm --manage /dev/md0 --fail /dev/sdg
  5. 使用以下命令检查有问题的磁盘是否已被正确屏蔽:

    # mdadm --detail /dev/md0

    在最后一个命令输出的末尾,您会看到类似此示例的 RAID 磁盘信息,其中磁盘 /dev/sdgfaulty 状态:

        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           1       8       32        1      active sync   /dev/sdc
           2       8       48        2      active sync   /dev/sdd
           3       8       64        3      active sync   /dev/sde
           4       8       80        4      active sync   /dev/sdf
           6       8      112        5      active sync   /dev/sdh
    
           5       8       96        -      faulty   /dev/sdg
  6. 最后,从阵列中删除有问题的磁盘。要做到这一点,请输入以下命令:

    # mdadm --manage /dev/md0 --remove /dev/sdg
  7. 使用以下命令检查 RAID 详情:

    # mdadm --detail /dev/md0

    在最后一个命令输出的末尾,您将看到类似如下的 RAID 磁盘信息:

        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           1       8       32        1      active sync   /dev/sdc
           2       8       48        2      active sync   /dev/sdd
           3       8       64        3      active sync   /dev/sde
           4       8       80        4      active sync   /dev/sdf
           6       8      112        5      active sync   /dev/sdh

完成了以上步骤后,您将获得一个 RAID /dev/md0,它带有一个新磁盘 /dev/sdh

17.12.2. 替换阵列中有问题的磁盘

这个步骤描述了如何替换独立磁盘冗余阵列(RAID)中的损坏磁盘。假设您有 /dev/md0 RAID 6。在这种情况下,/dev/sdb 磁盘具有硬件问题,且无法再使用。您需要将其替换为新磁盘 /dev/sdi

先决条件

  • 需要被替换的新磁盘。
  • 已安装 mdadm 软件包。

流程

  1. 使用以下命令检查日志消息:

    # journalctl -k -f

    您会看到一条信息,显示哪个磁盘失败:

    md/raid:md0: Disk failure on sdb, disabling device.
    md/raid:md0: Operation continuing on 5 devices.
  2. Ctrl+C 键退出 journalctl 程序。
  3. 将新磁盘作为备用磁盘添加到阵列。要做到这一点,请输入以下命令:

    # mdadm --manage /dev/md0 --add /dev/sdi
  4. 将损坏的磁盘标记为 faulty。要做到这一点,请输入以下命令:

    # mdadm --manage /dev/md0 --fail /dev/sdb
  5. 从阵列中删除失败的磁盘。要做到这一点,请输入以下命令:

    # mdadm --manage /dev/md0 --remove /dev/sdb
  6. 使用以下命令检查阵列的状态:

    # mdadm --detail /dev/md0

    在最后一个命令输出的末尾,您将看到类似如下的 RAID 磁盘信息:

        Number   Major   Minor   RaidDevice State
           7       8      128        0      active sync   /dev/sdi
           1       8       32        1      active sync   /dev/sdc
           2       8       48        2      active sync   /dev/sdd
           3       8       64        3      active sync   /dev/sde
           4       8       80        4      active sync   /dev/sdf
           6       8      112        5      active sync   /dev/sdh

完成了以上步骤后,您将获得一个 RAID /dev/md0,它带有一个新磁盘 /dev/sdi

17.12.3. 重新同步 RAID 磁盘

这个步骤描述了如何重新同步 RAID 阵列中的磁盘。假设您有 /dev/md0 RAID。

先决条件

  • 软件包 mdadm 已安装。

流程

  1. 要检查阵列是否有失败的磁盘行为,请输入以下命令:

    # echo check > /sys/block/md0/md/sync_action

    此操作将检查阵列并将结果写入 /sys/block/md0/md/sync_action 文件中。

  2. 使用您选择的文本编辑器打开文件 /sys/block/md0/md/sync_action,并查看是否有有关磁盘同步失败的消息。
  3. 要重新同步阵列中的磁盘,请输入以下命令:

    # echo repair > /sys/block/md0/md/sync_action

    此操作将重新同步阵列中的磁盘,并将结果写入 /sys/block/md0/md/sync_action 文件中。

  4. 要查看同步进度,请输入以下命令:

    # cat /proc/mdstat

第 18 章 使用 LUKS 加密块设备

磁盘加密通过加密来保护块设备中的数据。要访问设备的解密内容,用户必须提供密语或密钥作为身份验证。这对于移动计算机和可移动介质而言尤为重要:即使它已从系统物理上移除,它也有助于保护设备的内容。LUKS 格式是 RHEL 中块设备加密的默认实现。

18.1. LUKS 磁盘加密

Linux Unified Key Setup-disk-format(LUKS)允许您加密块设备,并提供一组简化加密设备管理的工具。LUKS 允许多个用户密钥解密主密钥,用于批量加密分区。

RHEL 使用 LUKS 执行块设备加密。默认情况下,在安装过程中取消选中加密块设备的选项。如果您选择加密磁盘的选项,则系统会在每次引导计算机时提示您输入密码短语。这个密码短语"解锁"用于解密分区的批量加密密钥。如果您选择修改默认的分区表,可以选择加密哪个分区。这是在分区表设置中设定的。

LUKS 做什么

  • LUKS 对整个块设备进行加密,因此非常适合保护移动设备的内容,如可移动存储介质或笔记本电脑磁盘驱动器。
  • 加密块设备的底层内容是任意的,这有助于加密交换设备。对于将特殊格式化块设备用于数据存储的某些数据库,这也很有用。
  • LUKS 使用现有的设备映射器内核子系统。
  • LUKS 增强了密码短语,防止字典攻击。
  • LUKS 设备包含多个密钥插槽,允许用户添加备份密钥或密码短语。

LUKS 不能做什么

  • LUKS 等磁盘加密解决方案仅在您的系统关闭时保护数据。当系统处于 on 状态并且 LUKS 解密了磁盘后,该磁盘上的文件将可供通常具有访问权限的任何人使用。
  • LUKS 不适用于需要许多用户具有同一设备的不同访问密钥的情况。LUKS1 格式提供八个关键插槽,LUKU2 最多提供 32 个密钥插槽。
  • LUKS 不适用于需要文件级加密的应用程序。

加密系统

LUKS 使用的默认加密系统为 aes-xts-plain64。LUKS 的默认密钥大小为 512 字节。Anaconda (XTS 模式)的 LUKS 的默认密钥大小为 512 位。可用的加密系统包括:

  • AES - 高级加密标准
  • Twofish(128 位块加密)
  • Serpent

18.2. RHEL 8 中的 LUKS 版本

在 RHEL 8 中,LUKS 加密的默认格式是 LUKS2。旧版 LUKS1 格式仍然被完全支持,它以与早期 RHEL 版本兼容的格式提供。

LUKS2 格式旨在启用各种部分的未来更新,而无需修改二进制结构。LUKS2 在内部使用 JSON 文本格式进行元数据,提供元数据冗余,检测元数据损坏,允许从元数据副本进行自动修复。

重要

不要在必须与只支持 LUKS1 的传统系统兼容的系统中使用 LUKS2。请注意,RHEL 7 支持版本 7.6 起的 LUKS2 格式。

警告

LUKS2 和 LUKS1 使用不同的命令加密该磁盘。对 LUKS 版本使用错误的命令可能会导致数据丢失。

LUKS 版本加密命令

LUKS2

cryptsetup reencrypt

LUKS1

cryptsetup-reencrypt

在线重新加密

LUKS2 格式支持在设备正在使用时重新加密加密设备。例如:您不必卸载该设备中的文件系统来执行以下任务:

  • 更改卷密钥
  • 更改加密算法

加密非加密设备时,您仍然必须卸载该文件系统。您可以在简短初始化加密后重新挂载文件系统。

LUKS1 格式不支持在线重新加密。

转换

LUKS2 格式由 LUKS1 实现。在某些情况下,您可以将 LUKS1 转换为 LUKS2。在以下情况下无法进行转换:

  • LUKS1 设备被标记为由基于策略的解密(PBD - Clevis)解决方案使用。当检测到一些 luksmeta 元数据时,cryptsetup 工具会拒绝转换设备。
  • 设备正在活跃。该设备必须处于不活跃状态,才能进行转换。

18.3. LUKS2 重新加密过程中数据保护选项

LUKS2 提供了几个选项,在重新加密过程中优先选择性能或数据保护:

checksum

这是默认的模式。它在数据保护和性能之间取得平衡。

这个模式将单独的扇区校验和保存在重新加密区域,因此恢复过程可以检测哪些 LUKS2 扇区已经重新加密。模式要求块设备扇区写入具有“原子”性。

journal
这是最安全的模式,也是速度最慢的模式。此模式记录二进制区域中的再加密区域,因此 LUKS2 将数据写入两次。
none
此模式优先选择性能,不提供数据保护。它只保护数据,以防止安全进程终止,如 SIGTERM Ctrl+C 的用户。任何意外的系统崩溃或应用程序崩溃都可能会导致数据崩溃。

您可以使用 cryptsetup--resilience 选项来选择模式。

如果 LUKS2 重新加密进程意外终止了强制终止,LUKU2 可使用以下方法之一执行恢复:

  • 自动执行下一个 LUKS2 设备打开操作。此操作由 cryptsetup open 命令触发,或者通过将设备附加到 systemd-cryptsetup 触发。
  • 在 LUKS2 设备中使用 cryptsetup repair 命令手动手动。

18.4. 使用 LUKS2 加密块设备上的现有数据

这个过程使用 LUKS2 格式加密设备中的数据。新的 LUKS 标头保存在设备的标头中。

先决条件

  • 块设备包含一个文件系统。
  • 已备份了数据。

    警告

    在加密过程中可能会丢失您的数据:由于硬件、内核或人为故障。在开始加密数据之前,请确保您有可靠的备份。

流程

  1. 卸载您要加密的设备中的所有文件系统。例如:

    # umount /dev/sdb1
  2. 为存储 LUKS 标头腾出空间。选择适合您的场景的以下选项之一:

    • 如果是加密逻辑卷,您可以扩展逻辑卷而不重新定义文件系统大小。例如:

      # lvextend -L+32M vg00/lv00
    • 使用分区管理工具(如 parted )扩展分区。
    • 缩小该设备的文件系统。您可以将 resize2fs 工具用于 ext2、ext3 或 ext4 文件系统。请注意,您无法缩小 XFS 文件系统。
  3. 初始化加密。例如:

    # cryptsetup reencrypt \ --encrypt \ --init-only \ --reduce-device-size 32M \ /dev/sdb1 sdb1_encrypted

    该命令会要求您输入密码短语并启动加密过程。

  4. 挂载该设备:

    # mount /dev/mapper/sdb1_crypt /mnt/sdb1_encrypted
  5. 启动在线加密:

    # cryptsetup reencrypt --resume-only /dev/sdb1

其它资源

  • cryptsetup(8)lvextend(8)resize2fs(8)parted(8) man page

18.5. 使用带有分离标头的 LUKS2 加密块设备上的现有数据

此流程加密块设备中的现有数据,而不为存储 LUKS 标头创建可用空间。标头存储在分离的位置,它也充当额外的安全层。该流程使用 LUKS2 加密格式。

先决条件

  • 块设备包含一个文件系统。
  • 已备份了数据。

    警告

    在加密过程中可能会丢失您的数据:由于硬件、内核或人为故障。在开始加密数据之前,请确保您有可靠的备份。

流程

  1. 卸载该设备中的所有文件系统。例如:

    # umount /dev/sdb1
  2. 初始化加密:

    # cryptsetup reencrypt \ --encrypt \ --init-only \ --header /path/to/header \ /dev/sdb1 sdb1_encrypted

    /path/to/header 替换为使用分离的 LUKS 标头指向该文件的路径。必须可以访问分离的 LUKS 标头,以便稍后可以解锁加密的设备。

    该命令会要求您输入密码短语并启动加密过程。

  3. 挂载该设备:

    # mount /dev/mapper/sdb1_crypt /mnt/sdb1_encrypted
  4. 启动在线加密:

    # cryptsetup reencrypt --resume-only --header /path/to/header /dev/sdb1

其它资源

  • cryptsetup(8) man page

18.6. 使用 LUKS2 加密空白块设备

此流程提供有关使用 LUKS2 格式加密空白块设备的信息。

先决条件

  • 空白块设备。

流程

  1. 将分区设置为加密的 LUKS 分区:

    # cryptsetup luksFormat /dev/sdb1
  2. 打开加密的 LUKS 分区:

    # cryptsetup open /dev/sdb1 sdb1_encrypted

    这样可解锁分区并使用设备映射器将其映射到新设备中。这个提示提示内核 device 是一个加密设备,应该使用 /dev/mapper/device_mapped_name 通过 LUKS 来解决,而不是覆盖加密的数据。

  3. 要向分区写入加密的数据,必须通过设备映射名称进行访问。为此,您必须创建一个文件系统。例如:

    # mkfs -t ext4 /dev/mapper/sdb1_encrypted
  4. 挂载该设备:

    # mount /dev/mapper/sdb1_encrypted mount-point

其它资源

  • cryptsetup(8) man page

18.7. 使用存储角色创建 LUKS 加密卷

您可以通过运行 Ansible playbook,使用 storage 角色创建并配置使用 LUKS 加密的卷。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要创建卷的系统中安装 Red Hat Ansible Automation Platform。

  • 您已在 Ansible 控制器上安装了 rhel-system-roles 软件包。
  • 您有一个清单文件详细描述了您要使用存储系统角色部署 LUKS 加密卷的系统。

流程

  1. 使用以下内容 playbook.yml 创建新文件:

    - hosts: all
      vars:
        storage_volumes:
          - name: barefs
            type: disk
            disks:
             - sdb
            fs_type: xfs
            fs_label: label-name
            mount_point: /mnt/data
            encryption: true
            encryption_password: your-password
      roles:
       - rhel-system-roles.storage
  2. 可选:验证 playbook 语法:

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

第 19 章 管理磁带设备

磁带设备是保存数据并按顺序访问的磁带。使用磁带驱动器将数据写入此磁带设备。不需要创建文件系统来存储磁带设备中的数据。磁带驱动器可以通过各种接口(如 SCSI、FC、USB、SATA 和其他接口)连接到主机计算机。

以下是不同类型的磁带设备:

  • /dev/st 是一个递归磁带设备。
  • /dev/nst 是一个非缓解的磁带设备。使用非缓解设备进行日常备份。

磁带设备的优点:

  • 性价比高
  • 对数据崩溃具有弹性
  • 数据保留
  • 稳定

19.1. 安装磁带驱动器管理工具

使用 mt 命令返回数据。mt 工具控制磁带驱动器操作,st 工具用于 SCSI 磁带驱动程序。这个步骤描述了如何为磁带驱动器操作安装 mt-st 软件包。

流程

  • 安装 mt-st 软件包:

    # yum install mt-st

其它资源

  • mt man page。
  • st man page。

19.2. 写入磁带设备

这个步骤描述了如何使用 tar 命令备份数据。默认情况下,block size 在磁带设备中是 10KB(bs=10k)。-f device 选项指定磁带设备文件,但如果您使用 export TAPE=/dev/st0 属性设置了 TAPE 环境变量,则不需要这个选项。

先决条件

  1. 已安装 mt-st 软件包。更多信息请参阅 第 19.1 节 “安装磁带驱动器管理工具”
  2. 加载磁带驱动器:

    # mt -f /dev/st0 load

流程

  1. 检查磁带头:

    # mt -f /dev/st0 status
    
    SCSI 2 tape drive:
    File number=-1, block number=-1, partition=0.
    Tape block size 0 bytes. Density code 0x0 (default).
    Soft error count since last status=0
    General status bits on (50000):
     DR_OPEN IM_REP_EN

    在这里:

    • 当前的 file number 是 -1。
    • block number 定义磁头。默认情况下,它被设置为 -1。
    • block size 0 表示磁带设备没有固定的块大小。
    • Soft error count 表示在执行 mt status 命令后遇到的错误数量。
    • General status bits 解释了磁带设备的统计。
    • DR_OPEN 表示公开,磁带设备为空。IM_REP_EN 是即时报告模式。
  2. 如果磁带设备不是空的,指定磁带头:

    # mt -f /dev/st0 rewind
    
    # tar -czf /dev/st0 /etc

    该命令使用 /etc 目录的内容覆盖 tape 设备中的数据

    可选:在 tape 设备中附加数据:

    # mt -f /dev/st0 eod
  3. /etc 目录备份到磁带设备中:

    # tar -czf /dev/st0 /etc
    tar: Removing leading `/' from member names
    /etc/
    /etc/man_db.conf
    /etc/DIR_COLORS
    /etc/rsyslog.conf
    [...]
  4. 查看磁带设备的状态:

    # mt -f /dev/st0  status

验证步骤

  • 查看磁带设备上的所有文件列表:

    # tar -tzf /dev/st0
    /etc/
    /etc/man_db.conf
    /etc/DIR_COLORS
    /etc/rsyslog.conf
    [...]

其它资源

19.3. 在磁带设备中切换磁带头

使用以下步骤切换磁带设备中的磁带头。在将数据附加到磁带设备时,使用 eod 选项切换磁带。

先决条件

  1. 已安装 mt-st 软件包。更多信息请参阅 第 19.1 节 “安装磁带驱动器管理工具”
  2. 数据被写入磁带设备。更多信息请参阅 第 19.2 节 “写入磁带设备”

流程

  • 进入数据的末尾:

    # mt -f /dev/st0 eod
  • 使用之前的记录:

    # mt -f /dev/st0  bsfm 1
  • 转至正向记录:

    # mt -f /dev/st0  fsf 1

其它资源

  • mt man page。

19.4. 从磁带设备中恢复数据

要从磁带设备中恢复数据,使用 tar 命令。

先决条件

  1. 已安装 mt-st 软件包。更多信息请参阅 第 19.1 节 “安装磁带驱动器管理工具”
  2. 数据被写入磁带设备。更多信息请参阅 第 19.2 节 “写入磁带设备”

流程

  1. 重新构建磁带设备:

    # mt -f /dev/st0 rewind
  2. 恢复 /etc 目录:

    # tar -xzf /dev/st0 /etc

其它资源

  • mt man page。
  • tar man page。

19.5. 从磁带设备中删除数据

要从磁带设备中删除数据,使用 erase 选项。

先决条件

  1. 已安装 mt-st 软件包。更多信息请参阅 第 19.1 节 “安装磁带驱动器管理工具”
  2. 数据被写入磁带设备。更多信息请参阅 第 19.2 节 “写入磁带设备”

流程

  1. 从磁带设备中删除数据:

    # mt -f /dev/st0 erase
  2. 卸载磁带设备:

    mt -f /dev/st0 offline

其它资源

  • mt man page。

19.6. 磁带命令

以下是常见的 mt 命令:

表 19.1. mt 命令

命令描述

mt -f /dev/st0 status

显示磁带设备的状态。

mt -f /dev/st0 rewind

插入磁带设备。

mt -f /dev/st0 erase

擦除整个磁带。

mt -f /dev/st0 fsf n

将磁带头切换到转发记录。在这里,n 是一个可选的文件计数。如果指定了文件计数,磁头将跳过 n 条记录。

mt -f /dev/st0 bsfm n

将磁头切换到之前的记录。

mt -f /dev/st0 eod

将磁带头切换到数据的末尾。

第 20 章 删除存储设备

您可以从正在运行的系统中安全地删除存储设备,这有助于防止系统内存过载和数据丢失。

注意

在删除存储设备前,您必须确定您在 I/O 清除过程中因为系统内存负载增加而您有足够的可用内存。使用 vmstat 1 100 命令查看系统当前的内存负载。您还可以使用 free 命令查看系统可用内存。红帽不推荐在以下系统中删除存储设备:

  • 空闲内存低于内存总量的 5%,每 100 个超过 10 个样本。
  • 交换空间是活跃的(vmstat 命令输出中的非零 siso 列)。

20.1. 安全删除存储设备

从正在运行的系统安全地删除存储设备需要采用从顶层开始的顶层方法,通常是应用程序或文件系统,并面向底部(即物理设备)。

您可以通过多种方式使用存储设备,它们可以在物理设备上具有不同的虚拟配置。例如:您可以将虚拟设备配置为多路径设备,使其成为 RAID 的一部分,也可以使其成为 LVM 组的一部分。或者,可以通过文件系统访问设备,也可以直接访问设备(作为"raw"设备)。

从顶层工作,您必须确保您要删除的设备不在使用中,所有待处理设备的 I/O 都会清除,操作系统不会引用存储设备。

20.2. 删除块设备

您可以从正在运行的系统中安全地删除块设备,以帮助防止系统内存过载和数据丢失。

警告

重新扫描 SCSI 总线或执行更改操作系统状态的任何其他操作(不遵循此处记录的流程)可能会导致 I/O 超时、意外删除的设备或数据丢失而延迟。

先决条件

  • 如果您要删除多路径设备,且您无法访问其路径设备,请禁用多路径设备的队列:

    # multipathd disablequeueing map <multipath-device>

    这可让设备的 I/O 失败,允许使用该设备的应用程序关闭。

流程

  1. 确定没有其他应用程序或服务正在使用您要删除的设备。
  2. 备份您要删除的设备中的数据。
  3. 使用 umount 命令卸载在该设备中挂载的任何文件系统。
  4. md RAID 阵列或者它所属的 LVM 卷中删除该设备。例如:如果该设备是 LVM 组的成员,且它是一个多路径设备:

    1. 将数据移动到另一个设备中:

      # pvmove -b /dev/mapper/<from-multipath-device> /dev/mapper/<to-multipath-device>
    2. 从卷组中删除该设备:

      # vgreduce <volume-group> /dev/mapper/<from-multipath-device>
    3. (可选)从物理设备中删除 LVM 元数据:

      # pvremove /dev/mapper/<from-multipath-device>
  5. 如果您要删除多路径设备:

    1. 使用以下命令查看该设备的所有路径:

      # multipath -l

      稍后需要这个命令的输出。

    2. 清除 I/O 并删除多路径设备:

      # multipath -f <multipath-device>
  6. 如果该设备没有配置为多路径设备,或者该设备被配置为多路径设备,且您之前已将 I/O 传递给其单独的路径,则清除所有未完成的 I/O 到所有使用的设备路径:

    # blockdev --flushbufs <device>

    这对于 umountvgreduce 命令没有清除 I/O 时,对设备的直接访问很重要。

  7. 如果您要删除 SCSI 设备,请完成以下步骤:

    1. 删除对设备路径名称的任何引用,例如: /dev/sd/dev/disk/by-path 或者 major:minor 号、系统中的应用程序、脚本或者工具。这样可保证以后添加的不同设备不会为当前的设备错误。
    2. 从 SCSI 子系统中删除该设备的每个路径:

      # echo 1 > /sys/block/<device-name>/device/delete

      其中,<device-name> 是从第 5 步的 multipath -l 命令的输出中获得,如果设备以前作为多路径设备使用。

  8. 删除物理设备形成运行的系统。请注意,当您删除此设备时,I/O 到其它设备不会停止。

其它资源

  • multipathpvmovevgreduce blockdev、和 umount man page。

第 21 章 使用 Stratis 管理分层本地存储

您可以轻松设置和管理由 Stratis 高级系统集成的复杂存储配置。

重要

Stratis 只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议(SLA)支持,且可能无法完成功能。红帽不建议在生产环境中使用它们。这些功能使用户能够早期访问即将推出的产品功能,让客户能够在开发过程中测试并提供反馈。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview

21.1. 设置 Stratis 文件系统

Stratis 作为服务运行,以管理物理存储设备池,通过易于使用简化本地存储管理,同时帮助您设置和管理复杂存储配置。

21.1.1. 什么是 Stratis

Stratis 是 Linux 的本地存储管理解决方案。它着重说明简单性和易用性,并可让您访问高级存储功能。

Stratis 使以下操作更为容易:

  • 存储的初始配置
  • 稍后进行修改
  • 使用高级存储功能

Stratis 是一个支持高级存储功能的混合用户和内核本地存储管理系统。Stratis 的核心概念是一个存储。这个池是从一个或多个本地磁盘或分区创建,卷是从池中创建的。

池启用了许多有用的功能,例如:

  • 文件系统快照
  • 精简置备
  • 等级

其它资源

21.1.2. Stratis 卷的组件

了解组成 Stratis 卷的组件。

另外,Stratis 在命令行界面和 API 中显示以下卷组件:

blockdev
块设备,如磁盘或者磁盘分区。
pool

由一个或多个块设备组成。

池有固定大小,与块设备的大小相等。

该池包含大多数 Stratis 层,如使用 dm-cache 目标的非易失性数据缓存。

Stratis 为每个池创建一个 /dev/stratis/my-pool/ 目录。这个目录包含了到代表池里 Stratis 文件系统的设备的链接。

filesystem

每个池可以包含一个或多个文件系统来存储文件。

文件系统会被精简置备,且没有固定的总大小。文件系统的实际大小随着保存着文件系统中的数据而增长。如果数据的大小接近文件系统的虚拟大小,Sratis 将自动增大精简卷和文件系统。

文件系统使用 XFS 格式化。

重要

Stratis 跟踪关于使用 Stratis 创建的文件系统的信息,但 XFS 不了解,并且使用 XFS 进行的更改不会在 Stratis 中自动创建更新。用户不得重新格式化或重新配置由 Stratis 管理的 XFS 文件系统。

Stratis 在 /dev/stratis/my-pool/my-fs 路径创建到文件系统的链接。

注意

Stratis 使用很多设备映射器设备,可在 dmsetup 列表和 /proc/partitions 文件中显示。同样,lsblk 命令输出反映了 Stratis 的内部工作和层。

21.1.3. 可用于 Stratis 的块设备

可与 Stratis 一起使用的存储设备.

支持的设备

Stratis 池已被测试以可用于这些块设备:

  • LUKS
  • LVM 逻辑卷
  • MD RAID
  • DM Multipath
  • iSCSI
  • HDD 和 SSD
  • NVMe 设备
不支持的设备

因为 Stratis 包含精简置备层,因此红帽不推荐将 Stratis 池放在已经精简置备的块设备中。

21.1.4. 安装 Stratis

安装 Stratis 所需的软件包。

流程

  1. 安装提供 Stratis 服务和命令行工具的软件包:

    # yum install stratisd stratis-cli
  2. 确保启用了 stratisd 服务:

    # systemctl enable --now stratisd

21.1.5. 创建未加密的 Stratis 池

您可以从一个或多个块设备创建未加密的 Stratis 池。

先决条件

  • 已安装 Stratis。如需更多信息,请参阅安装 Stratis
  • stratisd 服务正在运行。
  • 创建 Stratis 池的块设备没有被使用,且没有被挂载。
  • 创建 Stratis 池的每个块设备至少为 1 GB。
  • 在 IBM Z 构架中,/dev/dasd* 块设备必须被分区。使用 Stratis 池中的分区。

有关分区 DASD 设备的详情,请参考在 IBM Z 中配置 Linux 实例

注意

您无法加密未加密的 Stratis 池。

流程

  1. 删除您要在 Stratis 池中使用的每个块设备上存在的任何文件系统、分区表或 RAID 签名:

    # wipefs --all block-device

    其中 block-device 是块设备的路径,例如: /dev/sdb

  2. 在所选块设备中创建新的未加密 Stratis 池:

    # stratis pool create my-pool block-device

    其中 block-device 是到空或有线块设备的路径。

    注意

    在一行中指定多个块设备:

    # stratis pool create my-pool block-device-1 block-device-2
  3. 确认创建了新的 Stratis 池:

    # stratis pool list

21.1.6. 创建加密的 Stratis 池

要保护您的数据,您可以从一个或多个块设备创建一个加密的 Stratis 池。

当您创建加密的 Stratis 池时,内核密钥环将用作主加密机制。后续系统重启此内核密钥环后,用于解锁加密的 Stratis 池。

在从一个或多个块设备创建加密的 Stratis 池时,请注意以下几点:

  • 每个块设备都使用 cryptsetup 库加密,并实施 LUKS2 格式。
  • 每个 Stratis 池都可以具有唯一密钥,或者与其他池共享相同的密钥。这些密钥保存在内核密钥环中。
  • 组成 Stratis 池的块设备必须全部加密或者全部未加密。不可能同时在同一个 Stratis 池中加密和未加密块设备。
  • 添加到加密 Stratis 池的数据层中的块设备会自动加密。

先决条件

  • 已安装 Stratis v2.1.0 或更高版本。如需更多信息,请参阅安装 Stratis
  • stratisd 服务正在运行。
  • 创建 Stratis 池的块设备没有被使用,且没有被挂载。
  • 创建 Stratis 池的块设备至少为 1GB。
  • 在 IBM Z 构架中,/dev/dasd* 块设备必须被分区。使用 Stratis 池中的分区。

有关分区 DASD 设备的详情,请参考在 IBM Z 中配置 Linux 实例

流程

  1. 删除您要在 Stratis 池中使用的每个块设备上存在的任何文件系统、分区表或 RAID 签名:

    # wipefs --all block-device

    其中 block-device 是块设备的路径,例如: /dev/sdb

  2. 如果您还没有创建密钥集,请运行以下命令并按照提示创建用于加密的密钥集。

    # stratis key set --capture-key key-description

    其中 key-description 是内核密钥环中创建的密钥的引用。

  3. 创建加密的 Stratis 池并指定用于加密的密钥描述。您还可以使用 --keyfile-path 选项指定密钥路径,而不是使用 key-description 选项。

    # stratis pool create --key-desc key-description my-pool block-device

    其中

    key-description
    引用您在上一步中创建的内核密钥环中存在的密钥。
    my-pool
    指定新的 Stratis 池的名称。
    block-device

    指定到空或者有线块设备的路径。

    注意

    在一行中指定多个块设备:

    # stratis pool create --key-desc key-description my-pool block-device-1 block-device-2
  4. 确认创建了新的 Stratis 池:

    # stratis pool list

21.1.7. 将 Stratis 池绑定到 NBDE

将加密的 Stratis 池绑定到网络绑定磁盘加密(NBDE)需要 Tang 服务器。当包含 Stratis 池的系统重启时,它与 Tang 服务器连接,以自动解锁加密的池,而无需提供内核密钥环描述。

注意

将 Stratis 池绑定到补充 Clevis 加密机制不会删除主内核密钥环加密。

先决条件

流程

  • 将加密的 Stratis 池绑定到 NBDE:

    # stratis pool bind nbde my-pool key-description tang-server

    其中

    my-pool
    指定加密的 Stratis 池的名称。
    key-description
    引用内核密钥环中存在的密钥,该密钥是在您创建加密的 Stratis 池时生成的。
    tang-server
    指定 Tang 服务器的 IP 地址或 URL。

21.1.8. 将 Stratis 池绑定到 TPM

当您将加密的 Stratis 池绑定到 Trusted Platform 模块(TPM) 2.0 时,当包含池的系统重启时,池会自动解锁,而无需提供内核密钥环描述。

先决条件

流程

  • 将加密的 Stratis 池绑定到 TPM:

    # stratis pool bind tpm my-pool key-description

    其中

    my-pool
    指定加密的 Stratis 池的名称。
    key-description
    引用内核密钥环中存在的密钥,该密钥是在您创建加密的 Stratis 池时生成的。

21.1.9. 使用内核密钥环解加密的 Stratis 池

系统重启后,您的加密 Stratis 池或组成它的块设备可能无法看到。您可以使用用于加密池的内核密钥环来解锁池。

先决条件

流程

  1. 使用之前使用的相同密钥描述重新创建密钥集:

    # stratis key set --capture-key key-description

    其中key-description 引用内核密钥环中存在的密钥,该密钥是在创建加密的 Stratis 池时生成的。

  2. 解锁 Stratis 池以及组成它的块设备:

    # stratis pool unlock keyring
  3. 验证 Stratis 池是可见的:

    # stratis pool list

21.1.10. 使用 Clevis 解锁加密的 Stratis 池

系统重启后,您的加密 Stratis 池或组成它的块设备可能无法看到。您可以使用池绑定到的附加加密机制解锁加密的 Stratis 池。

先决条件

流程

  1. 解锁 Stratis 池以及组成它的块设备:

    # stratis pool unlock clevis
  2. 验证 Stratis 池是可见的:

    # stratis pool list

21.1.11. 从补充加密中取消绑定 Stratis 池

当您从支持的附加加密机制中取消加密的 Stratis 池时,主内核密钥环加密仍会生效。

先决条件

流程

  • 从补充加密机制中取消分离加密的 Stratis 池:

    # stratis pool unbind clevis my-pool

    其中

    my-pool 指定您要取消bind 的 Stratis 池的名称。

21.1.12. 创建 Stratis 文件系统

在现有 Stratis 池中创建 Stratis 文件系统。

先决条件

流程

  1. 要在池中创建 Stratis 文件系统,请使用:

    # stratis fs create my-pool my-fs

    其中

    my-pool
    指定 Stratis 池的名称。
    my-fs
    为文件系统指定一个任意名称。
  2. 要验证,列出池中的文件系统:

    # stratis fs list my-pool

21.1.13. 挂载 Stratis 文件系统

挂载现有的 Stratis 文件系统以访问其内容。

先决条件

流程

  • 要挂载文件系统,使用 Stratis 在 /dev/stratis/ 目录中维护的条目:

    # mount /dev/stratis/my-pool/my-fs mount-point

现在该文件系统被挂载到 mount-point 目录中并可使用。

21.1.14. 永久挂载 Stratis 文件系统

这个过程永久挂载 Stratis 文件系统,以便在引导系统后自动可用。

先决条件

流程

  1. 确定文件系统的 UUID 属性:

    $ lsblk --output=UUID /stratis/my-pool/my-fs

    例如:

    例 21.1. 查看 Stratis 文件系统的 UUID

    $ lsblk --output=UUID /stratis/my-pool/fs1
    
    UUID
    a1f0b64a-4ebb-4d4e-9543-b1d79f600283
  2. 如果挂载点目录不存在,请创建它:

    # mkdir --parents mount-point
  3. 以 root 用户身份,编辑 /etc/fstab 文件并为文件系统添加一行,由 UUID 标识。使用 xfs 作为文件系统类型并添加 x-systemd.requires=stratisd.service 选项。

    例如:

    例 21.2. /etc/fstab 中的 /fs1 挂载点

    UUID=a1f0b64a-4ebb-4d4e-9543-b1d79f600283 /fs1 xfs defaults,x-systemd.requires=stratisd.service 0 0
  4. 重新生成挂载单元以便您的系统注册新配置:

    # systemctl daemon-reload
  5. 尝试挂载文件系统来验证配置是否正常工作:

    # mount mount-point

21.2. 使用额外块设备扩展 Stratis 卷

您可以在 Stratis 池中添加附加块设备以便为 Stratis 文件系统提供更多存储容量。

21.2.1. Stratis 卷的组件

了解组成 Stratis 卷的组件。

另外,Stratis 在命令行界面和 API 中显示以下卷组件:

blockdev
块设备,如磁盘或者磁盘分区。
pool

由一个或多个块设备组成。

池有固定大小,与块设备的大小相等。

该池包含大多数 Stratis 层,如使用 dm-cache 目标的非易失性数据缓存。

Stratis 为每个池创建一个 /dev/stratis/my-pool/ 目录。这个目录包含了到代表池里 Stratis 文件系统的设备的链接。

filesystem

每个池可以包含一个或多个文件系统来存储文件。

文件系统会被精简置备,且没有固定的总大小。文件系统的实际大小随着保存着文件系统中的数据而增长。如果数据的大小接近文件系统的虚拟大小,Sratis 将自动增大精简卷和文件系统。

文件系统使用 XFS 格式化。

重要

Stratis 跟踪关于使用 Stratis 创建的文件系统的信息,但 XFS 不了解,并且使用 XFS 进行的更改不会在 Stratis 中自动创建更新。用户不得重新格式化或重新配置由 Stratis 管理的 XFS 文件系统。

Stratis 在 /dev/stratis/my-pool/my-fs 路径创建到文件系统的链接。

注意

Stratis 使用很多设备映射器设备,可在 dmsetup 列表和 /proc/partitions 文件中显示。同样,lsblk 命令输出反映了 Stratis 的内部工作和层。

21.2.2. 在 Stratis 池中添加块设备

此流程在 Stratis 池中添加一个或多个块设备,供 Stratis 文件系统使用。

先决条件

  • 已安装 Stratis。请参阅 第 21.1.4 节 “安装 Stratis”
  • stratisd 服务正在运行。
  • 要添加到 Stratis 池中的块设备不会被使用且没有挂载。
  • 要添加到 Stratis 池中的块设备的大小至少为 1 GiB。

流程

  • 要在池中添加一个或多个块设备,请使用:

    # stratis pool add-data my-pool device-1 device-2 device-n

其它资源

  • stratis(8) man page

21.3. 监控 Stratis 文件系统

作为 Stratis 用户,您可以查看系统中 Stratis 卷的信息,以监控其状态和剩余空间。

21.3.1. 不同工具报告的 Stratis 大小

本节解释了标准工具(如 dfstratis 实用程序)报告的 Stratis 大小之间的差别。

标准 Linux 工具(如 df )报告 Stratis 中的 XFS 文件系统层大小,即 1 TiB。这不是有用的信息,因为 Stratis 的实际存储使用较少,因为精简配置也会导致 Stratis 在 XFS 层接近满时自动增大文件系统。

重要

定期监控写入 Stratis 文件系统的数据量,它报告为物理使用总数。请确定没有超过总计物理大小值。

其它资源

  • stratis(8) man page

21.3.2. 显示关于 Stratis 卷的信息

此流程列出了您的 Stratis 卷的统计信息,如总数、使用量、可用大小、文件系统以及属于池中的块设备。

先决条件

流程

  • 要显示系统中用于 Stratis 的所有块设备的信息:

    # stratis blockdev
    
    Pool Name  Device Node    Physical Size   State  Tier
    my-pool    /dev/sdb            9.10 TiB  In-use  Data
  • 显示系统中所有 Stratis 的信息:

    # stratis pool
    
    Name    Total Physical Size  Total Physical Used
    my-pool            9.10 TiB              598 MiB
  • 显示系统中所有 Stratis 文件系统的信息:

    # stratis filesystem
    
    Pool Name  Name  Used     Created            Device
    my-pool    my-fs 546 MiB  Nov 08 2018 08:03  /dev/stratis/my-pool/my-fs

其它资源

  • stratis(8) man page

21.4. 在 Stratis 文件系统中使用快照

您可以使用 Stratis 文件系统的快照任意时间捕获文件系统状态,并在以后恢复它。

21.4.1. Stratis 快照的特性

这部分论述了 Stratis 中文件系统快照的属性和局限性。

在 Stratis 中,快照是作为另一个 Stratis 文件系统的副本创建的常规 Stratis 文件系统。快照最初包含的文件内容与原始文件系统相同,但可能会随着快照的修改而更改。您对快照所做的任何修改都不会反映在原始文件系统中。

Stratis 中的当前快照实现的特征如下:

  • 文件系统快照是另一个文件系统。
  • 快照及其原始卷在生命周期中不会被链接。快照的文件系统可以比它从中创建的文件系统更长。
  • 文件系统不一定被挂载来生成快照。
  • 每个快照使用大约一半的实际后备存储,这是 XFS 日志所需要的。

21.4.2. 创建 Stratis 快照

这个过程会创建一个 Stratis 文件系统作为现有 Stratis 文件系统的快照。

先决条件

流程

  • 要创建 Stratis 快照,请使用:

    # stratis fs snapshot my-pool my-fs my-fs-snapshot

其它资源

  • stratis(8) man page

21.4.3. 访问 Stratis 快照的内容

这个过程挂载 Stratis 文件系统的快照,使其可在读写操作中访问。

先决条件

流程

  • 要访问快照,请将其作为常规文件系统挂载到 /dev/stratis/my-pool/ 目录中:

    # mount /dev/stratis/my-pool/my-fs-snapshot mount-point

21.4.4. 将 Stratis 文件系统恢复到以前的快照

这个过程将 Stratis 文件系统的内容恢复到 Stratis 快照中捕获的状态。

先决条件

流程

  1. 另外,还可备份文件系统的当前状态以便在以后访问它:

    # stratis filesystem snapshot my-pool my-fs my-fs-backup
  2. 卸载并删除原始文件系统:

    # umount /dev/stratis/my-pool/my-fs
    # stratis filesystem destroy my-pool my-fs
  3. 在原始文件系统名称下创建快照副本:

    # stratis filesystem snapshot my-pool my-fs-snapshot my-fs
  4. 挂载快照,它现在可以和原始文件系统的名称相同:

    # mount /dev/stratis/my-pool/my-fs mount-point

名为 my-fs 的文件系统的内容与快照 my-fs-snapshot 一致。

其它资源

  • stratis(8) man page

21.4.5. 删除 Stratis 快照

这个过程从池中删除 Stratis 快照。快照中的数据会丢失。

先决条件

流程

  1. 卸载快照:

    # umount /dev/stratis/my-pool/my-fs-snapshot
  2. 销毁快照:

    # stratis filesystem destroy my-pool my-fs-snapshot

其它资源

  • stratis(8) man page

21.5. 删除 Stratis 文件系统

您可以删除现有 Stratis 文件系统或 Stratis 池,销毁其中的数据。

21.5.1. Stratis 卷的组件

了解组成 Stratis 卷的组件。

另外,Stratis 在命令行界面和 API 中显示以下卷组件:

blockdev
块设备,如磁盘或者磁盘分区。
pool

由一个或多个块设备组成。

池有固定大小,与块设备的大小相等。

该池包含大多数 Stratis 层,如使用 dm-cache 目标的非易失性数据缓存。

Stratis 为每个池创建一个 /dev/stratis/my-pool/ 目录。这个目录包含了到代表池里 Stratis 文件系统的设备的链接。

filesystem

每个池可以包含一个或多个文件系统来存储文件。

文件系统会被精简置备,且没有固定的总大小。文件系统的实际大小随着保存着文件系统中的数据而增长。如果数据的大小接近文件系统的虚拟大小,Sratis 将自动增大精简卷和文件系统。

文件系统使用 XFS 格式化。

重要

Stratis 跟踪关于使用 Stratis 创建的文件系统的信息,但 XFS 不了解,并且使用 XFS 进行的更改不会在 Stratis 中自动创建更新。用户不得重新格式化或重新配置由 Stratis 管理的 XFS 文件系统。

Stratis 在 /dev/stratis/my-pool/my-fs 路径创建到文件系统的链接。

注意

Stratis 使用很多设备映射器设备,可在 dmsetup 列表和 /proc/partitions 文件中显示。同样,lsblk 命令输出反映了 Stratis 的内部工作和层。

21.5.2. 删除 Stratis 文件系统

这个过程删除现有的 Stratis 文件系统。保存的数据会丢失。

先决条件

流程

  1. 卸载文件系统:

    # umount /dev/stratis/my-pool/my-fs
  2. 销毁文件系统:

    # stratis filesystem destroy my-pool my-fs
  3. 验证文件系统不再存在:

    # stratis filesystem list my-pool

其它资源

  • stratis(8) man page

21.5.3. 删除 Stratis 池

此流程删除现有的 Stratis 池。保存的数据会丢失。

先决条件

流程

  1. 列出池中的文件系统:

    # stratis filesystem list my-pool
  2. 卸载池中的所有文件系统:

    # umount /dev/stratis/my-pool/my-fs-1 \
             /dev/stratis/my-pool/my-fs-2 \
             /dev/stratis/my-pool/my-fs-n
  3. 销毁文件系统:

    # stratis filesystem destroy my-pool my-fs-1 my-fs-2
  4. 销毁池:

    # stratis pool destroy my-pool
  5. 验证池不再存在:

    # stratis pool list

其它资源

  • stratis(8) man page

法律通告

Copyright © 2021 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.