跳转至

15. 磁盘与存储管理

本章介绍 RHEL 10 的磁盘管理全流程:磁盘查看与分区、文件系统格式化(XFS/ext4/VFAT)与挂载(UUID 或 LABEL 方式)、/etc/fstab 持久化配置、LVM 逻辑卷管理(创建、扩容、快照)、swap 交换空间管理,以及 VDO(虚拟数据优化器)内联去重压缩技术。存储管理是数据持久化的基础,也是第 16 章网络文件系统和第 17 章备份恢复的前提条件。

操作前提示

磁盘分区与格式化操作不可逆,会永久销毁数据。所有操作前务必通过 VMware 创建快照,并用 lsblk 反复确认目标设备名称,防止误操作生产磁盘。


15.1 前提条件

  • 已完成第一阶段全部配置(第 1–9 章)及第二阶段配置(第 10–14 章)。
  • 通过 SecureCRT(SSH 端口 2222)以 ops 用户、密钥认证方式登录 192.168.1.100,执行 sudo -i 切换至 root 环境。
  • 系统中已通过 VMware 添加一块 20 GB 未使用虚拟磁盘(本章统一使用 /dev/sdb)。
  • LVM 工具已安装(RHEL 10 默认包含):
rpm -q lvm2 || dnf install -y lvm2

本章全局参数

参数 值
主机名 linuxdc
管理 IP 192.168.1.100/24
新增数据盘 /dev/sdb(20 GB)
LVM 卷组名 datavg
LVM 逻辑卷名 datalv
LVM 挂载点 /mnt/lvmdata
VDO 卷名 vdo_data
VDO 挂载点 /vdodata

15.2 磁盘查看与信息收集

在任何操作前,先全面了解当前磁盘状态。

# 查看所有块设备(树形结构,最直观)
lsblk

# 查看磁盘分区详情(含分区表类型、扇区信息)
fdisk -l

# 查看磁盘与挂载点、UUID、文件系统类型的对应关系
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,UUID

# 查看文件系统使用情况
df -hT

# 查看特定磁盘详情
fdisk -l /dev/sdb

检查点

lsblk 输出中可见 /dev/sdb(约 20 GB),TYPE 为 disk,无分区,MOUNTPOINT 为空。


15.3 磁盘分区

15.3.1 分区方案选择

分区工具 分区表类型 适用场景
parted GPT 推荐,支持 > 2 TB,UEFI 标准
fdisk MBR 兼容旧系统,仅支持 ≤ 2 TB

15.3.2 使用 parted 创建 GPT 分区(推荐)

parted /dev/sdb

在 parted 交互模式中依次执行:

(parted) mklabel gpt
(parted) mkpart primary xfs 1MiB 10GiB
(parted) mkpart primary xfs 10GiB 100%
(parted) print
(parted) quit

通知内核刷新分区表,并等待 udev 完成设备节点创建:

partprobe /dev/sdb
udevadm settle

udevadm settle 的作用

partprobe 通知内核分区表已变化,udevadm settle 等待 udev 守护进程处理完所有待处理事件(创建 /dev/sdb1、/dev/sdb2 等设备节点),确保后续的 mkfs、blkid 等命令能立即使用新分区。若跳过此步骤,在 I/O 繁忙的系统上可能出现"设备不存在"的竞争条件。

# 验证分区已创建
lsblk /dev/sdb

检查点

lsblk /dev/sdb 显示 /dev/sdb1(约 10 GB)和 /dev/sdb2(约 10 GB)两个分区。

15.3.3 使用 fdisk 创建 MBR 分区(备选)

fdisk /dev/sdb

交互序列:

命令: n          # 新建分区
分区类型: p      # 主分区
分区号: 1
起始扇区: Enter  # 接受默认
末尾扇区: +10G   # 分配 10 GB
命令: w          # 写入并退出
partprobe /dev/sdb
udevadm settle
lsblk /dev/sdb

15.4 格式化文件系统

RHEL 10 默认使用 XFS 作为根文件系统,生产中推荐数据分区保持一致。

# 格式化为 XFS(RHEL 10 默认,推荐)
mkfs.xfs /dev/sdb1

# 格式化为 ext4(通用场景,支持文件系统缩减)
mkfs.ext4 /dev/sdb2

# 获取 UUID(后续 fstab 配置的依据,不使用设备名)
blkid /dev/sdb1
blkid /dev/sdb2

XFS 与 ext4 选型依据

XFS:适合大文件、高并发写入(数据库、日志流);不支持在线缩减,须提前规划容量。ext4:适合通用场景,支持文件系统收缩(resize2fs);格式化和 fsck 速度略慢于 XFS。生产环境建议与根分区保持同一类型,便于统一管理。

15.4.1 VFAT 文件系统(RHCSA 官方考点)

VFAT(FAT32)是跨平台兼容性最好的文件系统,常用于与 Windows/macOS 交换数据的可移动存储,也是 UEFI 系统分区(/boot/efi)的固定格式。RHCSA 要求掌握创建、挂载、使用 VFAT 文件系统(以下假设存在一块待格式化的分区 /dev/sdc1,实操时替换为实际设备):

# 安装 VFAT 工具(部分精简安装环境需要)
dnf install -y dosfstools

# 格式化为 VFAT
mkfs.vfat -F 32 /dev/sdc1    # -F 32 指定 FAT32(默认即为 32,可省略)

# 创建挂载点并临时挂载
mkdir -p /mnt/vfat-data
mount -t vfat /dev/sdc1 /mnt/vfat-data

# 写入测试文件验证可用
echo "test" > /mnt/vfat-data/test.txt
df -hT /mnt/vfat-data

VFAT 权限模型的特殊性

VFAT 不支持 Unix 风格的 ugo/rwx 权限与 UID/GID 属主,所有文件默认权限由挂载选项统一控制,而非文件自身的 inode 权限位。永久挂载时常见做法:

blkid /dev/sdc1
vim /etc/fstab
UUID=xxxx-xxxx  /mnt/vfat-data  vfat  defaults,uid=1000,gid=1000,umask=0022  0 0

uid/gid 指定挂载后文件的属主(因 VFAT 本身不记录 UID/GID),umask 控制统一权限掩码,这与 XFS/ext4 依赖文件自身权限位的模型完全不同,是 RHCSA 考试中排查"VFAT 挂载后无法写入"问题的关键点。


15.5 挂载文件系统

15.5.1 临时挂载(验证用,重启后失效)

mkdir -p /data/disk1
mkdir -p /data/disk2

mount /dev/sdb1 /data/disk1
mount /dev/sdb2 /data/disk2

df -hT | grep /data

15.5.2 永久挂载(写入 /etc/fstab)

fstab 配置错误会导致系统无法启动

修改 /etc/fstab 前先备份,修改后必须执行 mount -a 验证。若 mount -a 报错,立即用备份文件回滚,否则下次重启系统将进入急救模式。

# 备份 fstab
cp /etc/fstab /etc/fstab.bak

# 获取 UUID(命令输出示例见下方)
blkid /dev/sdb1 | grep -oP 'UUID="\K[^"]+'
blkid /dev/sdb2 | grep -oP 'UUID="\K[^"]+'

编辑 /etc/fstab,追加以下内容(将 xxxxx... 替换为实际 UUID):

vim /etc/fstab
# /data/disk1 - XFS 数据分区
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /data/disk1  xfs   defaults  0 0

# /data/disk2 - ext4 数据分区
UUID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy  /data/disk2  ext4  defaults  0 0

验证配置:

# 先卸载,再用 mount -a 测试(不重启即可验证 fstab 语法正确性)
umount /data/disk1 /data/disk2
mount -a

df -hT | grep /data

检查点

mount -a 无报错;df -hT 显示 /data/disk1(xfs)和 /data/disk2(ext4)均已挂载。

fstab 字段说明:

字段 说明 示例值
设备标识 UUID(推荐)或设备路径 UUID=xxx...
挂载点 目录路径 /data/disk1
文件系统类型 格式化时的类型 xfs
挂载选项 逗号分隔的选项列表 defaults
dump 是否备份(0=不备份) 0
fsck 开机检查顺序(0=不检查,1=根分区,2=其他) 0

按 LABEL 挂载(RHCSA 官方考点:UUID 或 label 均需掌握)

除 UUID 外,/etc/fstab 也支持按卷标(label)挂载,语法更直观但要求标签在系统内唯一:

# 格式化时直接指定卷标
mkfs.xfs -L data1 /dev/sdb1
mkfs.ext4 -L data2 /dev/sdb2

# 事后为已有文件系统设置/修改卷标
xfs_admin -L data1 /dev/sdb1        # XFS 专用命令
e2label /dev/sdb2 data2             # ext4 专用命令

# 查看卷标
lsblk -f
blkid /dev/sdb1

fstab 中对应写法:

LABEL=data1  /data/disk1  xfs   defaults  0 0
LABEL=data2  /data/disk2  ext4  defaults  0 0

生产环境仍优先推荐 UUID(唯一性由内核生成,不会重复;label 依赖人工命名,多块磁盘用同一 label 会导致挂载指向不确定的设备),但 RHCSA 考试两种方式均可能被要求,需都能熟练操作。


15.6 LVM 逻辑卷管理

LVM(Logical Volume Manager)在物理磁盘之上提供灵活的存储抽象层,支持在线扩容、快照等企业级特性,是 RHEL 生产环境的标准存储方案。

15.6.1 LVM 概念层次

物理磁盘/分区  →  物理卷(PV)  →  卷组(VG)  →  逻辑卷(LV)  →  文件系统
  /dev/sdb       pvcreate         vgcreate        lvcreate         mkfs.xfs

15.6.2 创建 PV、VG、LV

# 第一步:创建物理卷(PV)
pvcreate /dev/sdb1
pvdisplay /dev/sdb1     # 验证,查看 PV 大小

# 第二步:创建卷组(VG),命名为 datavg
vgcreate datavg /dev/sdb1
vgdisplay datavg         # 关注 Free PE / Size

# 第三步:创建逻辑卷(LV),命名为 datalv,大小 5 GB
lvcreate -L 5G -n datalv datavg
lvdisplay /dev/datavg/datalv

# 第四步:格式化并挂载
mkfs.xfs /dev/datavg/datalv
mkdir -p /mnt/lvmdata
mount /dev/datavg/datalv /mnt/lvmdata

# 第五步:写入 fstab 永久挂载(LVM 设备路径比 UUID 更直观,两者均可)
echo '/dev/datavg/datalv  /mnt/lvmdata  xfs  defaults  0 0' >> /etc/fstab
mount -a
df -hT /mnt/lvmdata

检查点

lvs 显示 datalv(5 GB,datavg);df -hT /mnt/lvmdata 显示 xfs 文件系统已挂载。

15.6.3 在线扩展逻辑卷

LVM 最核心的优势之一:业务不中断即可扩展存储空间。

# 确认 VG 剩余可用空间
vgdisplay datavg | grep "Free PE"

# 将 datalv 扩展 3 GB
lvextend -L +3G /dev/datavg/datalv

# 扩展 XFS 文件系统(XFS 仅支持在线扩容,不支持缩减)
xfs_growfs /mnt/lvmdata

# ext4 文件系统扩展命令(如使用 ext4 时)
# resize2fs /dev/datavg/datalv

# 验证
df -hT /mnt/lvmdata
lvdisplay /dev/datavg/datalv | grep "LV Size"

检查点

df -hT /mnt/lvmdata 显示大小已增加至约 8 GB。

15.6.4 添加新磁盘扩展卷组

当 VG 空间耗尽时,通过添加新物理磁盘扩展:

# 假设新磁盘为 /dev/sdc(已在 VMware 中添加)
pvcreate /dev/sdc

# 将新 PV 加入现有 VG
vgextend datavg /dev/sdc

# 验证 VG 已扩大
vgdisplay datavg | grep -E "VG Size|Free PE"

15.6.5 创建 LVM 快照

# 创建快照(大小为快照期间预计写入量,一般为原 LV 的 10–20%)
lvcreate -L 2G -s -n datalv-snap /dev/datavg/datalv

# 挂载快照(只读)
mkdir -p /mnt/snap
mount -o ro /dev/datavg/datalv-snap /mnt/snap

# 查看快照使用情况(Data% 字段,接近 100% 需及时处理)
lvs /dev/datavg/datalv-snap

# 使用完毕后卸载并删除快照
umount /mnt/snap
lvremove -f /dev/datavg/datalv-snap

快照大小选择

快照大小应为快照存活期间原 LV 预计写入量。用 lvs 监控 Data%,超过 80% 时执行 lvextend -L +<size> /dev/datavg/datalv-snap 扩大,避免快照自动失效。


15.7 交换空间(swap)管理(RHCSA 官方考点)

RHCSA 明确要求"以非破坏性方式新增分区、逻辑卷和 swap",swap 可以建立在原始分区或 LVM 逻辑卷之上,两种方式命令略有差异。

15.7.1 基于原始分区创建 swap

# 使用 parted 创建一个新分区作为 swap(假设 /dev/sdb3 已通过 15.3 节方式创建好分区)
mkswap /dev/sdb3                    # 将分区格式化为 swap 格式
swapon /dev/sdb3                    # 立即启用

# 验证
swapon --show
free -h

永久生效需写入 /etc/fstab:

blkid /dev/sdb3
vim /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  none  swap  sw  0 0
# 验证 fstab 语法(swapon -a 会启用 fstab 中所有未启用的 swap 条目)
swapoff /dev/sdb3
swapon -a
swapon --show

15.7.2 基于 LVM 逻辑卷创建 swap(生产环境更灵活)

LVM 方式的优势是可以像普通 LV 一样后续在线扩容(需先关闭再扩容,见下文说明)。

# 在已有卷组中创建一个 2G 的逻辑卷用作 swap
lvcreate -L 2G -n swaplv datavg

mkswap /dev/datavg/swaplv
swapon /dev/datavg/swaplv

fstab 条目(LVM 设备路径而非 UUID 也可以,但仍推荐 UUID):

/dev/datavg/swaplv  none  swap  sw  0 0

15.7.3 非破坏性扩容已有 swap(LVM 方式)

swap 设备不能在启用状态下直接扩容,必须先停用:

swapoff /dev/datavg/swaplv          # 必须先停用,否则 lvextend 会失败或数据损坏
lvextend -L +1G /dev/datavg/swaplv  # 扩大逻辑卷
mkswap /dev/datavg/swaplv           # 重新格式化为 swap(原 swap 数据无法保留,属正常现象)
swapon /dev/datavg/swaplv           # 重新启用

swapon --show
free -h

RHCSA 常见易错点

swap 分区/逻辑卷在 swapon 激活状态下无法直接 lvextend 或格式化,必须先 swapoff 再操作,操作完成后别忘了 swapon 重新启用——考试环境中经常有人扩容后忘记重新启用,导致 swap 总容量未变化。


15.8 VDO 虚拟数据优化器

VDO(Virtual Data Optimizer)是 RHEL 内置的存储优化层,在数据写入磁盘前自动执行内联去重(deduplication)和内联压缩(compression),可显著减少实际存储占用,通常能节省 30–70% 的磁盘空间,是虚拟化、容器、备份等场景的理想选择。

RHEL 9 已弃用:独立 vdo 命令行工具

RHEL 9 及更早版本使用独立的 vdo 命令(vdo create、vdo status、vdo start/stop 等,由 vdo.service 管理)创建和管理 VDO 卷。该 Python 实现的独立管理工具已在 RHEL 10 中移除,VDO 功能改为完全整合进 LVM,作为一种逻辑卷类型(lvcreate --type vdo)管理,用法与 LVM 精简置备卷(thin volume)类似。本节以 RHEL 10 的 LVM-VDO 方式为准。

15.8.1 工作原理

应用写入数据
      ↓
  VDO LV(/dev/<vg名>/<lv名>,构建于 VDO Pool LV 之上)
      ├─ 去重:识别已存在的数据块,直接引用,不重复写入
      ├─ 压缩:对唯一数据块进行压缩,减少实际写入量
      └─ 写入 VDO Pool LV 对应的底层物理存储

VDO 适用场景

适合:虚拟机磁盘镜像(大量重复数据)、容器存储、备份数据、数据库冷数据;不适合:已压缩数据(视频、音频、ZIP 文件,压缩效果微弱)、写吞吐量极高的场景(去重/压缩引入额外 CPU 开销)。

15.8.2 安装 VDO 组件

dnf install -y lvm2 vdo

关于 vdo 包

RHEL 10 中 vdo 包不再提供 vdo create 等管理命令,但仍提供 vdostats、vdoformat 等 LVM-VDO 依赖的底层工具,安装时仍需包含该包。VDO 的实际管理入口统一为 lvcreate/lvchange/lvextend 等标准 LVM 命令。

15.8.3 创建 LVM-VDO 卷

VDO 卷构建在 LVM 卷组之上,先将原始块设备(本例使用 /dev/sdb2,约 10 GB)纳入 LVM 管理:

# 创建 PV 与 VG
pvcreate /dev/sdb2
vgcreate vg_vdo /dev/sdb2

# 创建 VDO 类型逻辑卷
# --type vdo:指定逻辑卷类型为 VDO
# --name:VDO 逻辑卷名称
# --size:VDO Pool 物理大小(底层实际占用空间上限)
# --virtualsize:VDO 逻辑(虚拟)大小,可远大于物理大小实现超配
lvcreate --type vdo \
  --name vdo1 \
  --size 9.5G \
  --virtualsize 30G \
  vg_vdo

# 查看逻辑卷状态(VAttr 中 v 表示 VDO 类型)
lvs vg_vdo

逻辑大小超配(Thin Provisioning)

--virtualsize 可以远大于 --size(底层物理容量),利用去重和压缩实现存储超配。例如底层约 10 GB 设备,逻辑大小设为 30 GB(约 3 倍超配),适用于大量重复数据的场景。生产环境应根据实际压缩/去重比率谨慎设置,并持续监控实际占用。

15.8.4 格式化与挂载 VDO 卷

VDO 逻辑卷路径为 /dev/<vg名>/<lv名>。格式化 XFS 时仍需添加 -K 参数禁用 TRIM 预处理(VDO 自身管理空间回收):

# 格式化 VDO 卷(必须使用 -K 参数)
mkfs.xfs -K /dev/vg_vdo/vdo1

# 创建挂载点
mkdir -p /vdodata

# 临时挂载验证
mount /dev/vg_vdo/vdo1 /vdodata
df -hT /vdodata

永久挂载(写入 /etc/fstab):

cp /etc/fstab /etc/fstab.bak.vdo

# 获取 VDO 逻辑卷的 UUID
blkid /dev/vg_vdo/vdo1

编辑 /etc/fstab,追加以下条目:

vim /etc/fstab
# VDO 虚拟数据优化器卷(LVM-VDO)
UUID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz  /vdodata  xfs  defaults  0 0

对比 RHEL 9:fstab 配置显著简化

RHEL 9 独立 VDO 卷依赖 vdo.service,fstab 条目必须附加 _netdev 与 x-systemd.requires=vdo.service 两个选项,否则重启后可能因服务未就绪而挂载失败。RHEL 10 中 VDO LV 是普通 LVM 逻辑卷,由 LVM 自身的激活机制在启动时统一处理,无需任何额外挂载选项,与普通 LV 挂载方式完全一致。

umount /vdodata
mount -a
df -hT /vdodata

检查点

df -hT /vdodata 显示 /vdodata(xfs,逻辑大小约 30 GB)已挂载。

15.8.5 查看 VDO 节省统计

# 通过 lvs 查看去重/压缩状态与节省比例(推荐)
lvs -a -o +vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state,vdo_saving_percent vg_vdo

关键字段解读:

字段 说明
VDOCompression / VDODeduplication 压缩 / 去重功能是否启用(enabled/disabled)
VDOCompressionState / VDOIndexState 运行状态(online 表示正常工作)
Data%(lvs 默认列) VDO Pool LV 实际数据占用百分比
VDOSavingPercent 节省百分比
# 写入测试数据验证去重效果
cp -r /usr/share/doc /vdodata/doc-copy1 2>/dev/null || true
cp -r /usr/share/doc /vdodata/doc-copy2 2>/dev/null || true
sync

# 再次查看节省统计
lvs -a -o +vdo_saving_percent vg_vdo

vdostats 命令仍可使用

vdostats --human-readable 命令仍随 vdo 包提供,但需要指定内部 VDO Pool 设备(/dev/mapper/vg_vdo-vdo1_vpool0 形式的内部命名),日常巡检更推荐直接使用 lvs -o+vdo_*。

15.8.6 VDO 卷管理操作

# 停用逻辑卷(卸载后执行)
umount /vdodata
lvchange -an vg_vdo/vdo1

# 重新激活
lvchange -ay vg_vdo/vdo1
mount -a

# 手动切换去重/压缩开关(通常保持默认启用即可)
lvchange --deduplication y vg_vdo/vdo1
lvchange --compression y vg_vdo/vdo1

# 在线扩容 VDO 逻辑卷(虚拟大小)
lvextend -L +5G vg_vdo/vdo1
xfs_growfs /vdodata

# 删除 VDO 卷(不可逆,数据将丢失)
# umount /vdodata
# lvremove vg_vdo/vdo1

15.9 存储方案对比与选型

方案 适用场景 在线扩容 快照 去重/压缩
直接分区 简单、固定存储 不支持 不支持 不支持
LVM 企业标准,灵活扩容 支持 LVM 快照 不支持
VDO 虚拟化、备份、容器 支持(底层可用 LVM) 需配合 LVM 支持
LVM + VDO 企业高级场景 支持 双重保障 支持

LVM + VDO 叠加使用

生产环境推荐将 VDO 卷建立在独立卷组之上,通过 LVM 统一管理去重压缩与容量扩展。创建顺序:pvcreate → vgcreate → lvcreate --type vdo(同时确定物理与虚拟大小)。


15.10 常见问题与排查

问题现象 排查步骤
partprobe 后分区设备未出现 执行 udevadm settle 等待 udev 处理完成;若仍未出现执行 reboot
mount -a 报 wrong fs type blkid 确认实际文件系统类型与 fstab fstype 列一致
LVM 命令报 device not found 执行 pvscan;vgscan;lvscan 重新扫描
XFS 文件系统无法缩减 XFS 不支持缩减;需要缩减的场景改用 ext4
LVM 快照 Data% 接近 100% 立即 lvextend 扩大快照,或完成备份后删除
VDO 逻辑卷未挂载(系统启动时) lvs vg_vdo 确认 LV 处于 active 状态;必要时 lvchange -ay vg_vdo/vdo1
VDO 节省率极低 数据本身已压缩(视频/音频/ZIP),属正常现象;可尝试写入文本类数据验证
# 综合存储状态检查
pvs && vgs && lvs
lvs -a -o+vdo_compression,vdo_deduplication
df -hT
findmnt --verify

15.11 实践任务

  1. 在 VMware 中为 linuxdc 添加一块 20 GB 虚拟磁盘,重启后确认 /dev/sdb 可见:lsblk。
  2. 使用 parted 创建两个 GPT 分区(/dev/sdb1 约 10 GB,/dev/sdb2 约 10 GB),执行 partprobe && udevadm settle 刷新分区表。
  3. 将 /dev/sdb1 格式化为 XFS,/dev/sdb2 格式化为 ext4,通过 UUID 写入 /etc/fstab,执行 mount -a 验证。
  4. 将 /dev/sdb1 创建为 LVM 结构(PV → VG datavg → LV datalv 5 GB),格式化并挂载至 /mnt/lvmdata:

    pvcreate /dev/sdb1
    vgcreate datavg /dev/sdb1
    lvcreate -L 5G -n datalv datavg
    mkfs.xfs /dev/datavg/datalv
    mkdir -p /mnt/lvmdata && mount /dev/datavg/datalv /mnt/lvmdata
    
  5. 在线扩展 datalv 至 8 GB,验证文件系统自动扩展:

    lvextend -L +3G /dev/datavg/datalv
    xfs_growfs /mnt/lvmdata
    df -hT /mnt/lvmdata
    
  6. 创建 LVM 快照,只读挂载查看内容,卸载后删除。

  7. 在 datavg 中创建 2G 的 swap 逻辑卷 swaplv,启用后用 free -h 验证;然后练习非破坏性扩容流程:swapoff → lvextend +1G → mkfs → swapon,再次验证总容量已增加。
  8. 基于 /dev/sdb2 创建 VG vg_vdo,用 lvcreate --type vdo 创建 VDO 逻辑卷 vdo1(虚拟大小 20 GB),格式化为 XFS,写入 fstab(普通条目,无需额外选项),挂载至 /vdodata,查看节省统计:lvs -a -o+vdo_saving_percent vg_vdo。
  9. 在 VMware 中创建快照 RHEL10-Storage-Base。

15.12 自测问题

Q1:为什么 fstab 中推荐使用 UUID 而不是 /dev/sdb1 这样的设备名?

设备名在系统重启、添加/移除磁盘后可能发生变化(如变为 /dev/sdc1),导致挂载失败甚至系统启动失败。UUID 是文件系统格式化时生成的全局唯一标识符,与设备物理位置无关,即使磁盘顺序变化也能正确匹配目标设备。

Q2:LVM 逻辑卷扩容后,为什么必须再执行 xfs_growfs 或 resize2fs?

lvextend 只扩展了 LVM 层的逻辑块设备大小,上层文件系统的元数据(超级块中的块总数、可用块数)尚未更新,应用程序看到的可用空间不变。xfs_growfs(XFS)或 resize2fs(ext4)将文件系统元数据同步更新到新的块设备边界,两步缺一不可。

Q3:RHEL 10 中 LVM-VDO 卷的 fstab 条目为什么不再需要 _netdev 和 x-systemd.requires=vdo.service(RHEL 9 独立 VDO 卷的必需选项)?

RHEL 9 的独立 VDO 卷(/dev/mapper/vdo_*)由专门的 vdo.service 在系统启动时单独激活,若挂载操作先于该服务执行,设备节点尚不存在,挂载必然失败,因此必须靠 x-systemd.requires=vdo.service 声明依赖顺序。RHEL 10 中 VDO 已整合为标准 LVM 逻辑卷类型,与其他 LV 一样由 LVM 自身的激活机制(lvm2-activation-generator / lvm2-pvscan@.service)统一处理,不存在独立的激活服务,因此按普通 LVM 逻辑卷挂载即可,无需任何额外选项。

Q4:partprobe 后为什么还需要执行 udevadm settle?

partprobe 通知内核刷新分区表,但内核仅将事件放入 udev 处理队列,并不等待 udev 完成设备节点的创建。udevadm settle 会阻塞,直到 udev 处理完所有待处理事件(即 /dev/sdb1、/dev/sdb2 等设备节点已创建完毕)。若跳过 udevadm settle 直接执行 mkfs,在 I/O 繁忙或慢速设备上可能因设备节点未就绪而报"设备不存在"错误。

Q5:为什么不能对正在使用(swapon 激活状态)的 swap 逻辑卷直接执行 lvextend?

swap 设备一旦激活,内核会直接按固定的 swap 元数据格式管理其空间分配,扩容会改变底层块设备的大小,与已激活 swap 区域记录的元数据不一致,可能导致数据错乱甚至内核崩溃。正确流程必须先 swapoff 停用,此时该设备不再被内核当作 swap 使用,才能安全地 lvextend 调整大小,之后需要重新 mkswap 写入 swap 元数据(原 swap 中的数据本身也无保留必要,因为 swap 只是临时内存交换空间,不存储需要保留的用户数据),最后 swapon 重新启用。


15.13 章节总结

本章介绍了 RHEL 10 磁盘与存储管理的完整体系:GPT 分区(parted + udevadm settle)、文件系统格式化(XFS/ext4/VFAT)、/etc/fstab 永久挂载(UUID 或 LABEL 方式)、LVM 逻辑卷管理(创建、在线扩容、VG 扩展、快照)、swap 交换空间管理(原始分区与 LVM 两种方式,含非破坏性扩容流程),以及 VDO 虚拟数据优化器(内联去重、内联压缩、超配部署)。合理运用这些技术能够构建灵活、高效、节省空间的企业级存储架构,为第 16 章网络文件共享和第 17 章备份恢复奠定坚实基础。