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),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 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 提供去重压缩),实现能力叠加。创建顺序:pvcreate → vgcreate → lvcreate(底层 LV)→ vdo create --device=/dev/datavg/datalv。
15.9 常见问题与排查
| 问题现象 | 排查步骤 |
|---|---|
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 挂载失败(系统启动时) | 确认 fstab 含 x-systemd.requires=vdo.service;systemctl status vdo |
| VDO 节省率极低 | 数据本身已压缩(视频/音频/ZIP),属正常现象;可尝试写入文本类数据验证 |
# 综合存储状态检查
pvs && vgs && lvs
vdo list
vdostats --human-readable
df -hT
findmnt --verify
15.10 实践任务
- 在 VMware 中为
linuxdc添加一块 20 GB 虚拟磁盘,重启后确认/dev/sdb可见:lsblk。 - 使用
parted创建两个 GPT 分区(/dev/sdb1约 10 GB,/dev/sdb2约 10 GB),执行partprobe && udevadm settle刷新分区表。 - 将
/dev/sdb1格式化为 XFS,/dev/sdb2格式化为 ext4,通过 UUID 写入/etc/fstab,执行mount -a验证。 -
将
/dev/sdb1创建为 LVM 结构(PV → VGdatavg→ LVdatalv5 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 -
在线扩展
datalv至 8 GB,验证文件系统自动扩展:lvextend -L +3G /dev/datavg/datalv xfs_growfs /mnt/lvmdata df -hT /mnt/lvmdata -
创建 LVM 快照,只读挂载查看内容,卸载后删除。
- 在
/dev/sdb2上创建 VDO 卷vdo_data(逻辑大小 20 GB),格式化为 XFS,写入 fstab(含_netdev和x-systemd.requires=vdo.service),挂载至/vdodata,查看节省统计:vdostats --human-readable。 - 在 VMware 中创建快照
RHEL9-Storage-Base。
15.11 自测问题
Q1:为什么 fstab 中推荐使用 UUID 而不是 /dev/sdb1 这样的设备名?
设备名在系统重启、添加/移除磁盘后可能发生变化(如变为 /dev/sdc1),导致挂载失败甚至系统启动失败。UUID 是文件系统格式化时生成的全局唯一标识符,与设备物理位置无关,即使磁盘顺序变化也能正确匹配目标设备。
Q2:LVM 逻辑卷扩容后,为什么必须再执行 xfs_growfs 或 resize2fs?
lvextend 只扩展了 LVM 层的逻辑块设备大小,上层文件系统的元数据(超级块中的块总数、可用块数)尚未更新,应用程序看到的可用空间不变。xfs_growfs(XFS)或 resize2fs(ext4)将文件系统元数据同步更新到新的块设备边界,两步缺一不可。
Q3:VDO 的 fstab 条目为什么必须同时包含 _netdev 和 x-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 章备份恢复奠定坚实基础。