跳转至

15. 磁盘与存储管理

本章介绍 RHEL 9 的磁盘管理全流程:磁盘查看与分区、文件系统格式化与挂载、/etc/fstab 持久化配置、LVM 逻辑卷管理(创建、扩容、快照),以及 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 9 默认包含):
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),TYPEdisk,无分区,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 等设备节点),确保后续的 mkfsblkid 等命令能立即使用新分区。若跳过此步骤,在 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 9 默认使用 XFS 作为根文件系统,生产中推荐数据分区保持一致。

# 格式化为 XFS(RHEL 9 默认,推荐)
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.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

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 VDO 虚拟数据优化器

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

15.7.1 VDO 工作原理

应用写入数据
      ↓
  VDO 层(/dev/mapper/vdo_data)
      ├─ 去重:识别已存在的数据块,直接引用,不重复写入
      ├─ 压缩:对唯一数据块进行 LZ4 压缩,减少实际写入量
      └─ 写入底层存储(/dev/sdb 或 LVM LV)

VDO 适用场景

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

15.7.2 安装 VDO 组件

dnf install -y vdo kmod-kvdo

# 启动 VDO 服务
systemctl enable --now vdo
systemctl status vdo

15.7.3 创建 VDO 卷

VDO 卷构建在原始块设备之上(本例使用 /dev/sdb2,约 10 GB)。

# 创建 VDO 卷
# --name:VDO 卷名称
# --device:底层存储设备
# --vdoLogicalSize:逻辑大小(可超配,如 3 倍超配)
vdo create \
  --name=vdo_data \
  --device=/dev/sdb2 \
  --vdoLogicalSize=30G

# 查看 VDO 卷状态
vdo status --name=vdo_data

# 列出所有 VDO 卷
vdo list

逻辑大小超配(Thin Provisioning)

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

15.7.4 格式化与挂载 VDO 卷

VDO 卷创建后,设备路径为 /dev/mapper/<name>。格式化 XFS 时必须添加 -K 参数禁用 TRIM 预处理(VDO 自身管理空间回收):

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

# 创建挂载点
mkdir -p /vdodata

# 临时挂载验证
mount /dev/mapper/vdo_data /vdodata
df -hT /vdodata

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

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

# 获取 VDO 卷的 UUID
blkid /dev/mapper/vdo_data

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

vim /etc/fstab
# VDO 虚拟数据优化器卷
UUID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz  /vdodata  xfs  defaults,_netdev,x-systemd.requires=vdo.service  0 0

VDO fstab 挂载选项说明

选项 说明
_netdev 延迟挂载至网络就绪后,防止启动时设备尚未就绪
x-systemd.requires=vdo.service 告知 systemd 挂载此设备前必须先启动 vdo.service,保证 VDO 卷已激活

这两个参数对 VDO 卷均为必须,缺少任一项都可能导致重启后挂载失败。

umount /vdodata
mount -a
df -hT /vdodata

检查点

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

15.7.5 查看 VDO 节省统计

# 查看实时去重/压缩节省情况
vdostats --human-readable

# 详细统计(含块级别统计)
vdostats --verbose /dev/mapper/vdo_data

关键指标解读:

指标 说明
Physical blocks used 实际使用的物理块数
Logical blocks used 逻辑层面已写入的块数
Saving percent 节省百分比(= 1 - 物理/逻辑)
Dedupe ratio 去重比率
Compression ratio 压缩比率
# 写入测试数据验证去重效果
cp /usr/share/doc /vdodata/doc-copy1 -r 2>/dev/null || true
cp /usr/share/doc /vdodata/doc-copy2 -r 2>/dev/null || true
sync

# 再次查看节省统计
vdostats --human-readable

15.7.6 VDO 卷管理操作

# 停止 VDO 卷(卸载后执行)
umount /vdodata
vdo stop --name=vdo_data

# 启动 VDO 卷
vdo start --name=vdo_data
mount -a

# 手动触发去重(后台异步执行,通常无需手动触发)
vdo enableDeduplication --name=vdo_data
vdo enableCompression --name=vdo_data

# 删除 VDO 卷(不可逆,数据将丢失)
# umount /vdodata
# vdo remove --name=vdo_data --force

15.8 存储方案对比与选型

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

LVM + VDO 叠加使用

生产环境推荐将 VDO 卷建立在 LVM LV 之上(LVM 提供灵活扩容,VDO 提供去重压缩),实现能力叠加。创建顺序:pvcreatevgcreatelvcreate(底层 LV)→ vdo create --device=/dev/datavg/datalv


15.9 常见问题与排查

问题现象 排查步骤
partprobe 后分区设备未出现 执行 udevadm settle 等待 udev 处理完成;若仍未出现执行 reboot
mount -awrong fs type blkid 确认实际文件系统类型与 fstab fstype 列一致
LVM 命令报 device not found 执行 pvscanvgscanlvscan 重新扫描
XFS 文件系统无法缩减 XFS 不支持缩减;需要缩减的场景改用 ext4
LVM 快照 Data% 接近 100% 立即 lvextend 扩大快照,或完成备份后删除
VDO 挂载失败(系统启动时) 确认 fstab 含 x-systemd.requires=vdo.servicesystemctl status vdo
VDO 节省率极低 数据本身已压缩(视频/音频/ZIP),属正常现象;可尝试写入文本类数据验证
# 综合存储状态检查
pvs && vgs && lvs
vdo list
vdostats --human-readable
df -hT
findmnt --verify

15.10 实践任务

  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. /dev/sdb2 上创建 VDO 卷 vdo_data(逻辑大小 20 GB),格式化为 XFS,写入 fstab(含 _netdevx-systemd.requires=vdo.service),挂载至 /vdodata,查看节省统计:vdostats --human-readable
  8. 在 VMware 中创建快照 RHEL9-Storage-Base

15.11 自测问题

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

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

Q2:LVM 逻辑卷扩容后,为什么必须再执行 xfs_growfsresize2fs

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

Q3:VDO 的 fstab 条目为什么必须同时包含 _netdevx-systemd.requires=vdo.service

VDO 卷(/dev/mapper/vdo_*)由 vdo.service 管理,该服务在系统启动时激活各 VDO 卷。若挂载操作在 vdo.service 启动前执行,设备节点尚不存在,挂载必然失败。x-systemd.requires=vdo.service 确保 systemd 先启动 vdo.service 再尝试挂载;_netdev 将挂载推迟到 network.target 之后,进一步保证设备就绪顺序。两个参数协同作用,保障重启后的可靠自动挂载。

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

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


15.12 章节总结

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