当前位置:首页>Linux>Linux 系统管理篇(七):LVM、RAID 与文件系统原理

Linux 系统管理篇(七):LVM、RAID 与文件系统原理

  • 2026-09-02 16:11:03
Linux 系统管理篇(七):LVM、RAID 与文件系统原理

磁盘不够用了?不用慌,LVM 让你在线扩容;担心数据丢失?RAID 给你冗余保障。

在上一篇文章中,我们学习了内存与磁盘的基础管理命令(free、df、fdisk、mount 等)。这一篇我们深入存储管理的进阶话题:逻辑卷管理(LVM)、磁盘阵列(RAID)以及文件系统的底层原理。这些知识是应对磁盘空间不足、保障数据安全、理解“磁盘空间去哪了”等问题的关键。

一、逻辑卷管理 LVM:让磁盘扩容不再停机

传统分区管理中,分区的容量是固定的。当分区空间不足时,需要备份数据、重新分区、再恢1复数据——这个过程通常需要停机,对于生产环境来说难以接受。

LVM(Logical Volume Manager)就是为了解决这个问题而生的。它把多块物理硬盘抽象为一个统一的存储池,在这个池子上按需分配空间,并且支持在线扩容。

1.1 LVM 的分层架构

LVM 将磁盘管理抽象为四个层级,每一层都是对下层的进一步虚拟化:

层级
说明
管理命令
物理卷 PV
在物理磁盘或分区上创建
pvcreate
、pvs、pvdisplay
卷组 VG
由一个或多个 PV 组成的存储池
vgcreate
、vgs、vgdisplay
逻辑卷 LV
从 VG 中划分的逻辑存储单元,可动态调整大小
lvcreate
、lvs、lvdisplay

核心优势:

  • • 可以跨多个物理硬盘组成一个逻辑卷
  • • 支持在线扩容(无需卸载文件系统)
  • • 支持快照功能(快速备份和恢复)

1.2 创建 LVM 的完整流程

我们以新增两块硬盘 /dev/sdb 和 /dev/sdc 为例。

第一步:创建物理卷 PV

pvcreate /dev/sdb /dev/sdc # 将两块物理磁盘初始化为 PVpvs                        # 验证 PV 创建结果

第二步:创建卷组 VG

# 将两个 PV 合并为一个 VG,命名为 vg1vgcreate vg1 /dev/sdb /dev/sdc# 验证 VG,关注 VFree(可用空间)vgs                 

第三步:创建逻辑卷 LV

# 从 vg1 中划分 100M 的逻辑卷lvcreate -L 100M -n lv1 vg1# 或使用全部剩余空间# lvcreate -l 100%FREE -n lv1 vg1lvs                 # 验证

第四步:格式化和挂载

# 创建 XFS 文件系统(CentOS 7+ 默认)mkfs.xfs /dev/vg1/lv1# 挂载到目录mkdir /mnt/lv1mount /dev/vg1/lv1 /mnt/lv1# 永久生效 — 写入 /etc/fstabecho "/dev/vg1/lv1 /mnt/lv1 xfs defaults 0 0" >> /etc/fstab

1.3 LVM 动态扩容(在线操作,无需停机)

场景:卷组空间不足,新增一块硬盘 /dev/sdd。

第一步:扩充卷组

pvcreate /dev/sddvgextend vg1 /dev/sddvgs                 # VFree 应已增加

第二步:扩充逻辑卷

# 增加 50G 空间lvextend -L +50G /dev/vg1/lv1# 或使用全部剩余空间:lvextend -l 100%FREE /dev/vg1/lv1

第三步:扩容文件系统(关键步骤)

逻辑卷扩容后,文件系统还不知道空间变大了,需要单独执行文件系统扩容命令:

# XFS 文件系统(CentOS 7 默认)— 参数是挂载点xfs_growfs /mnt/lv1# EXT4 文件系统 — 参数是设备路径resize2fs /dev/vg1/lv1

验证:

df -h /mnt/lv1      # 确认文件系统已扩容lvs                 # 确认 LV 已扩容

1.4 LVM 快照:秒级备份与回滚

快照基于写时复制(Copy-On-Write)机制:创建瞬间不复制任何数据,仅在原卷数据被修改时才将旧数据拷贝到快照区。因此快照创建几乎是瞬时的,空间开销仅取决于快照期间有多少数据发生了变化。

第一步:创建快照

# 为 lv1 创建一个 1G 的快照卷# 快照大小取决于备份期间预计修改的数据量lvcreate -L 1G -s -n lv1_snap /dev/vg1/lv1lvs                 # 可看到 lv1_snap 的 Snap% 列

第二步:挂载快照并备份

# 以只读方式挂载快照mount -o ro /dev/vg1/lv1_snap /mnt/snap# 从快照中备份 — 此时获取的是创建快照时刻的数据一致性视图tar -czf /backup/lv1_$(date +%F).tar.gz -C /mnt/snap .# 备份完成后卸载并删除快照umount /mnt/snaplvremove -f /dev/vg1/lv1_snap

第三步:快照回滚(数据恢复)

# 回滚到快照创建时刻的状态# 注意:回滚会丢失快照创建后的所有数据变更umount /mnt/lv1lvconvert --merge /dev/vg1/lv1_snap# 重新激活逻辑卷(merge 操作在下次激活时生效)lvchange -an /dev/vg1/lv1lvchange -ay /dev/vg1/lv1mount /dev/vg1/lv1 /mnt/lv1

注意:如果快照空间(Snap%)达到 100%,快照将变为不可用状态,无法用于恢复。快照期间数据变更量较大时,应分配更大的快照空间,或尽快完成备份并删除快照。

1.5 LVM 精简配

精简配置(Thin Provisioning)允许逻辑卷的虚拟容量超过实际物理容量,按需分配实际存储空间。适合虚拟化环境和开发测试场景,但需要监控实际使用量防止耗尽物理空间。

# 创建精简池(实际物理空间)lvcreate -T vg1/thinpool -L 10G# 从精简池创建精简卷(虚拟容量可超过池大小)lvcreate -T vg1/thinpool -V 50G -n thin_lv1# 格式化并挂载mkfs.xfs /dev/vg1/thin_lv1mount /dev/vg1/thin_lv1 /mnt/thin1# 查看精简池使用情况lvs -o name,thin_pool,data_percent,metadata_percent

超配风险:如果所有精简卷的实际写入量总和超过精简池大小,将导致数据损坏。生产环境建议设置 thin_pool_autoextend_threshold 自动扩容阈值,并配合监控告警。

1.6 LVM 常用命令速查

操作
PV 命令
VG 命令
LV 命令
创建
pvcreatevgcreatelvcreate
查看
pvs
 / pvdisplay
vgs
 / vgdisplay
lvs
 / lvdisplay
扩容
-
vgextendlvextend
缩减
-
vgreducelvreduce
(高危)
删除
pvremovevgremovelvremove
快照
-
-
lvcreate -s
扫描pvscanvgscanlvscan

生产环境警告:LVM 缩容(lvreduce)风险极高,可能导致数据丢失,如果必须缩容,需先缩小文件系统再缩小 LV,且 EXT4 缩容需卸载文件系统,XFS 不支持在线缩容。生产环境不建议操作。

二、RAID 磁盘阵列:用多块硬盘换安全或性能

RAID(Redundant Array of Independent Disks)通过将多块硬盘组合使用,实现比单块硬盘更高的可靠性、更高的性能或两者兼得。

2.1 RAID 的实现方式

方式
实现
优点
缺点
硬件 RAID
专用 RAID 卡
不占 CPU,支持热插拔和自动重建
成本高(2000+)
软件 RAID
Linux mdadm
零成本,配置灵活
消耗 CPU 资源

选型原则:服务器环境推荐硬件 RAID(带 BBu 缓存保护),个人学习或测试环境可使用软件 RAID。云服务器(AWS EBS、阿里云云盘)已在底层实现冗余,通常无需自行配置 RAID。

2.2 常用 RAID 级别对比

级别
最少磁盘
容量利用率
容错能力
读性能
写性能
典型用途
RAID 0
2
100%
无
极高
极高
临时数据/高速缓存
RAID 1
2
50%
单盘故障
高
中等
系统盘/关键日志
RAID 5
3
(n-1)/n
单盘故障
高
中等
文件服务器/通用存储
RAID 6
4
(n-2)/n
双盘故障
中等
低
大容量归档存储
RAID 10
4
50%
高冗余
极高
高
数据库/虚拟化主机
图 2:各 RAID 级别容量利用率与容错能力对比(以 4×1TB 磁盘为例)

2.3 mdadm 实战:从创建到故障恢复

以下是一个完整的软件 RAID 5 操作流程,涵盖创建、查看、故障模拟和重建。

第一步:安装 mdadm

# CentOS / RHELyum install mdadm -y# Ubuntu / Debianapt install mdadm -y

第二步:创建 RAID 5

# 使用 3 块磁盘创建 RAID 5,1 块作为热备盘mdadm --create --verbose /dev/md0 \  --level=5 \  --raid-devices=3 \  --spare-devices=1 \  /dev/sdb /dev/sdc /dev/sdd /dev/sde

第三步:查看 RAID 状态

# 查看同步进度(初始化时会有几小时的同步过程)cat /proc/mdstat# 查看详细信息mdadm --detail /dev/md0# 关键字段说明:# State : clean              — 正常状态# Rebuild Status : 30%       — 重建中(30% 进度)# Active Devices : 3          — 在线磁盘数# Working Devices : 4         — 工作磁盘数(含热备)

第四步:保存配置(重启后自动组装)

# CentOS / RHELmdadm --detail --scan >> /etc/mdadm.confdracut -H           # 更新 initramfs# Ubuntu / Debianecho 'DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde' >> /etc/mdadm/mdadm.confmdadm --detail --scan >> /etc/mdadm/mdadm.confupdate-initramfs -u

第五步:模拟磁盘故障与重建

# 1. 标记磁盘为故障状态mdadm /dev/md0 --fail /dev/sdbcat /proc/mdstat      # 可看到热备盘自动开始重建# 2. 移除故障磁盘mdadm /dev/md0 --remove /dev/sdb# 3. 插入新磁盘并加入阵列mdadm /dev/md0 --add /dev/sdb# 4. 等待重建完成watch cat /proc/mdstat

热备盘的价值:配置 --spare-devices 热备盘后,当阵列中某块磁盘故障时,RAID 会自动使用热备盘开始重建,无需人工干预。对于 7×24 运行的生产环境,这是减少 MTTR(平均恢复时间)的关键配置。

2.4 选型建议

优先级
推荐级别
说明
性能优先
RAID 0
速度最快,但无冗余,单盘故障即全部数据丢失
安全优先
RAID 1 或 RAID 10
RAID 10 兼顾性能,RAID 1 成本更低(仅需 2 块盘)
平衡需求
RAID 5
性价比最高,适合 3 块以上磁盘的场景
数据库/虚拟机
RAID 10
金融、证券等高要求场景标准配置,随机 IO 性能远优于 RAID 5
超大容量归档
RAID 6
双盘容错,适合重建时间可能很长的大容量阵列

三、生产环境的组合方案:RAID + LVM

企业服务器的最佳实践是:先做硬件 RAID(获得冗余和性能),再在 RAID 逻辑盘上做 LVM(获得灵活扩容能力)。这两者并不互斥,而是互补关系。

3.1 组合架构

图 3:RAID 10 + LVM 生产架构 — 冗余、性能与灵活扩容的叠加
  1. 1. 硬件 RAID:确保单盘故障不影响业务运行,并提升读写性能。
  2. 2. LVM:在 RAID 提供的可靠存储之上,实现按需分配和在线扩容。

大多数企业级服务器的标准配置就是硬件 RAID 10 + LVM 管理。

3.2 LVM 与 RAID 的定位差异

对比项LVMRAID
核心目的容量管理(灵活扩容、按需分配)性能 / 冗余(速度提升、数据安全)
数据保护无冗余,单盘故障可能导致数据丢失RAID 1/5/6/10 提供冗余
扩容能力在线扩容扩容复杂(通常需重建阵列)
性能提升无RAID 0/10 提升读写

四、文件系统底层原理:inode 与数据块

理解文件系统的底层结构,能帮你更好地理解“磁盘空间去哪了”这类问题。

4.1 EXT4/XFS 的三层架构

超级块 → 记录整个分区的元数据(文件总数、空间使用情况、块大小)   ↓i节点(inode表) → 记录每个文件的元数据(大小、权限、时间戳、数据块指针、硬链接计数)   ↓数据块(block) → 实际存储文件内容,默认4KB,是最小的分配单元

超级块:位于文件系统开头,记录整个分区的文件总数和空间使用情况。df 命令能快速显示分区信息,就是因为直接读取了超级块的统计。超级块有多个副本分布在分区不同位置****,防止主超级块损坏导致数据丢失。

i 节点(inode):记录文件大小、权限、时间戳、数据块指针和链接数。文件名不存储在 inode 中,而是存储在父目录的 inode 所指向的数据块中——目录本质上是一个记录了文件名与 inode 编号映射关系的特殊文件。

数据块:实际存储文件内容,默认大小通常为 4KB,是文件系统分配空间的最小单元。

4.2 关键特性

空文件:只分配 inode,不分配数据块。

1 字节文件:虽然只有 1 个字节,但仍然占用一个完整的 4KB 数据块(默认 4KB)。

echo 1 > test.txtls -lh test.txt      # 显示 1B(文件逻辑大小)du -sh test.txt      # 显示 4.0K (实际磁盘占用)# 查看文件的 inode 编号ls -li test.txt

当磁盘报"No space left on device"但 df -h 显示仍有剩余空间时,通常是 inode 耗尽而非空间不足——大量小文件会消耗大量 inode。可用 df -i 查看 inode 使用率。

4.3 硬链接与软链接

特性
硬链接
软链接(符号链接)
inode
共享同一个 i 节点
有独立的 i 节点(指向目标路径)
删除原文件
数据仍然存在(链接计数减 1)
链接失效(断链)
跨文件系统
不支持
支持
目录链接
不支持(仅 root 可用特殊方式)
支持
创建命令ln file.txt hardlink.txtln -s file.txt softlink.txt

4.4 vi 修改文件时 i 节点的变化

vi 编辑文件时会创建临时文件 .file.txt.swp,保存时用临时文件替换原文件,因此 i 节点编号可能发生变化。而 echo "xxx" >> file.txt 追加内容不会改变 i 节点,因为它直接修改了原文件的数据块。

4.5 文件系统修复

当文件系统因异常断电、硬件故障等原因损坏时,需要使用专用工具进行修复。

XFS 文件系统修复

# 1. 卸载文件系统(修复前必须卸载)umount /mnt/lv1# 2. 检查文件系统(只检查不修复)xfs_repair -n /dev/vg1/lv1# 3. 修复文件系统xfs_repair /dev/vg1/lv1# 4. 重新挂载mount /dev/vg1/lv1 /mnt/lv1

EXT4 文件系统修复与超级块恢复

# 1. 卸载文件系统umount /dev/sda1# 2. 修复(-y 表示自动回答 yes)fsck.ext4 -y /dev/sda1# 如果主超级块损坏,使用备份超级块修复:# 3a. 查找备份超级块位置mke2fs -n /dev/sda1# 3b. 使用备份超级块修复(32768 是上一步输出的第一个备份块位置)e2fsck -b 32768 /dev/sda1

修复注意事项:文件系统修复可能删除损坏的文件或目录。修复前应尽可能先做完整磁盘镜像备份(如 dd if=/dev/sda1 of=/backup/sda1.img)。对于关键业务数据,建议联系专业数据恢复服务。

4.6 删除文件的本质

删除文件并不是立即清除数据块,而是断开文件名与 inode 的链接,将 inode 和数据块标记为空闲,等待数据块被后续写入覆盖。在被覆盖之前,数据仍然物理存在于磁盘上——这也是误删后应立即停止写入操作的原因,数据块被覆盖前仍有恢复可能。

误删后的第一原则:误删文件后应立即停止对所在分区的所有写入操作,甚至直接以只读模式重新挂载。每多一次写入,数据块被覆盖的概率就增加一分。可使用 extundelete(EXT4)或 xfs_undelete(XFS)等工具尝试恢复,或使用 debugfs 手动恢复。

五、XFS vs EXT4:如何选择文件系统

CentOS 7 起默认使用 XFS,而 Ubuntu 和 Debian 长期使用 EXT4。两者在设计理念和适用场景上有明显差异。

对比项
XFS
EXT4
默认发行版
CentOS 7+ / RHEL 7+
Ubuntu / Debian / 较早的 RHEL
最大文件大小
8 EB
16 TB
最大文件系统大小
8 EB
1 EB
大文件性能
优秀(并行 IO、高效的延迟分配)
良好
小文件性能
一般
优秀
在线扩容
支持(xfs_growfs,挂载点参数)
支持(resize2fs,设备参数)
在线缩容
不支持
支持(需卸载)
元数据日志
日志 + 写屏障
JBD2 日志
快照支持
通过 LVM 快照
通过 LVM 快照
碎片整理
xfs_fsr
(在线碎片整理)
e4defrag

选型建议

大文件存储(数据库、虚拟化、视频流)首选 XFS;小文件密集型场景(邮件服务器、代码仓库)可考虑 EXT4;如果未来可能需要缩容,只能选择 EXT4。在 LVM 之上,两者都支持在线扩容,运维差异不大。

六、磁盘配额与 Swap 管理

6.1 XFS 文件系统的磁盘配额

在多用户共享服务器时,可用配额限制用户磁盘使用量,防止个别用户占满整个分区。

挂载时启用配额:

mount -o uquota,gquota /dev/sdb1 /mnt/disk1

设置用户配额(软限制 5 个文件,硬限制 10 个文件):

xfs_quota -x -c 'limit -u isoft=5 ihard=10 user1' /mnt/disk1

查看配额状态:

xfs_quota -x -c 'report -ugibh' /mnt/disk1

注意:root 用户不受配额限制。在云原生环境下,更推荐通过 Kubernetes PVC 限制存储空间,传统磁盘配额的使用场景已大幅减少。EXT4 配额需使用 quota 工具包,配置方式与 XFS 不同。

6.2 交换分区 Swap 管理

Swap 是磁盘上的一块空间,当物理内存不足时充当虚拟内存。Swap 的速度远低于物理内存,应作为应急手段而非长期依赖。

# 查看当前 Swap 使用情况free -hswapon -s# 通过文件方式增加 Swap(40GB)dd if=/dev/zero of=/swapfile bs=4M count=10240chmod 600 /swapfilemkswap /swapfileswapon /swapfile# 永久生效 — 写入 /etc/fstabecho "/swapfile swap swap defaults 0 0" >> /etc/fstab

警告:/etc/fstab 配置错误可能导致系统无法启动!修改后务必执行mount -a验证配置正确性,不确定时可先注释掉。

七、排查磁盘空间的完整流程

当磁盘空间告警时,按以下流程逐层排查:

  1. 1. 定位满了的分区
df -h                  # 查看各分区使用率df -i                  # 如果空间够但报 No space,检查 inode
  1. 2. 逐层排查大目录
# 进入满了的分区根目录cd /du -sh * 2>/dev/null | sort -h | tail -20
  1. 3. 查找大文件
# 查找 >100MB 的文件(-xdev 不跨文件系统)find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null# 查找最近 7 天修改的大文件find / -xdev -type f -size +100M -mtime -7 -exec ls -lh {} \; 2>/dev/null
  1. 4. 检查已删除但仍被占用的文件
# 文件被删除但进程仍持有句柄时,空间不会释放lsof | grep deleted# 重启相关进程或 kill -HUP  即可释放空间
  1. 5. 在线扩容(如果确认是 LVM)
lvextend -L +50G /dev/vg1/lv1xfs_growfs /mnt/lv1    # XFS 用挂载点resize2fs /dev/vg1/lv1 # EXT4 用设备路径

八、落地实践:从裸盘到生产存储

将前面所有知识点串联起来,以下是一个完整的生产环境部署方案——从 4 块裸盘到运行中的业务存储,涵盖 RAID 创建、LVM 配置、文件系统格式化和挂载的全流程。

  1. 1. 创建 RAID 10
# 使用 4 块 2TB 磁盘创建 RAID 10mdadm --create --verbose /dev/md0 \  --level=10 \  --raid-devices=4 \  /dev/sdb /dev/sdc /dev/sdd /dev/sde# 等待初始化完成watch cat /proc/mdstat# 保存配置mdadm --detail --scan >> /etc/mdadm.confdracut -H  # 或 update-initramfs -u (Ubuntu)
  1. 2. 创建 LVM 结构
# 在 RAID 设备上创建 PVpvcreate /dev/md0# 创建卷组vgcreate vg_data /dev/md0# 创建逻辑卷(按业务需求分配)lvcreate -L 500G -n lv_app vg_datalvcreate -L 200G -n lv_log vg_datalvcreate -L 1T   -n lv_data vg_data# 验证vgslvs
  1. 3. 格式化与挂载
# 格式化(统一使用 XFS)mkfs.xfs /dev/vg_data/lv_appmkfs.xfs /dev/vg_data/lv_logmkfs.xfs /dev/vg_data/lv_data# 创建挂载点mkdir -p /app /var/log/app /data# 挂载mount /dev/vg_data/lv_app  /appmount /dev/vg_data/lv_log  /var/log/appmount /dev/vg_data/lv_data /data
  1. 4. 永久挂载配置
# 写入 /etc/fstab(使用 LV 设备路径或 UUID)cat >> /etc/fstab << 'EOF'/dev/vg_data/lv_app  /app          xfs  defaults,noatime  0 0/dev/vg_data/lv_log  /var/log/app  xfs  defaults,noatime  0 0/dev/vg_data/lv_data /data         xfs  defaults,noatime  0 0EOF# 验证 fstab 配置(重要!避免重启失败)mount -a
  1. 5. 后续扩容(按需)
# 场景:/data 空间不足,新增一块 4TB 磁盘扩容pvcreate /dev/sdfvgextend vg_data /dev/sdflvextend -l 100%FREE /dev/vg_data/lv_dataxfs_growfs /data       # 挂载点,不是设备路径df -h /data            # 验证扩容结果

noatime 挂载选项:在 fstab 中使用 noatime 选项可以禁止更新文件的访问时间(atime),减少不必要的磁盘写入,对 SSD 和高 IO 场景有明显的性能提升。对于日志文件和数据库数据文件尤其有效。

总结

LVM 解决的是容量灵活分配的问题——在线扩容、快照备份、精简配置是三个核心能力。RAID 解决的是性能和冗余问题——硬件 RAID 10 是数据库和虚拟化场景的标准配置,软件 RAID(mdadm)适合学习和测试环境。文件系统是存储的最后一层抽象——理解 inode、数据块和超级块的关系,才能高效排查磁盘空间问题和进行数据恢复。

生产环境的标准存储架构是 RAID 10 + LVM + XFS:RAID 10 提供冗余和性能,LVM 提供灵活扩容能力,XFS 提供大文件场景下的优秀性能和在线扩容支持。掌握这套架构的设计思路和操作流程,是运维工程师从初级走向资深的必经之路。

最新文章

随机文章