
磁盘不够用了?不用慌,LVM 让你在线扩容;担心数据丢失?RAID 给你冗余保障。
在上一篇文章中,我们学习了内存与磁盘的基础管理命令(free、df、fdisk、mount 等)。这一篇我们深入存储管理的进阶话题:逻辑卷管理(LVM)、磁盘阵列(RAID)以及文件系统的底层原理。这些知识是应对磁盘空间不足、保障数据安全、理解“磁盘空间去哪了”等问题的关键。
一、逻辑卷管理 LVM:让磁盘扩容不再停机
传统分区管理中,分区的容量是固定的。当分区空间不足时,需要备份数据、重新分区、再恢1复数据——这个过程通常需要停机,对于生产环境来说难以接受。
LVM(Logical Volume Manager)就是为了解决这个问题而生的。它把多块物理硬盘抽象为一个统一的存储池,在这个池子上按需分配空间,并且支持在线扩容。
1.1 LVM 的分层架构
LVM 将磁盘管理抽象为四个层级,每一层都是对下层的进一步虚拟化:

| | |
|---|
| 物理卷 PV | | pvcreate |
| 卷组 VG | | vgcreate |
| 逻辑卷 LV | | lvcreate |
核心优势:
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 常用命令速查
| | | |
|---|
| pvcreate | vgcreate | lvcreate |
| pvs | vgs | lvs |
| | vgextend | lvextend |
| | vgreduce | lvreduce |
| pvremove | vgremove | lvremove |
| | | lvcreate -s |
| 扫描 | pvscan | vgscan | lvscan |
生产环境警告:LVM 缩容(lvreduce)风险极高,可能导致数据丢失,如果必须缩容,需先缩小文件系统再缩小 LV,且 EXT4 缩容需卸载文件系统,XFS 不支持在线缩容。生产环境不建议操作。
二、RAID 磁盘阵列:用多块硬盘换安全或性能
RAID(Redundant Array of Independent Disks)通过将多块硬盘组合使用,实现比单块硬盘更高的可靠性、更高的性能或两者兼得。
2.1 RAID 的实现方式
选型原则:服务器环境推荐硬件 RAID(带 BBu 缓存保护),个人学习或测试环境可使用软件 RAID。云服务器(AWS EBS、阿里云云盘)已在底层实现冗余,通常无需自行配置 RAID。
2.2 常用 RAID 级别对比
| | | | | | |
|---|
| RAID 0 | | | | | | |
| RAID 1 | | | | | | |
| RAID 5 | | | | | | |
| RAID 6 | | | | | | |
| RAID 10 | | | | | | |
图 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 10 兼顾性能,RAID 1 成本更低(仅需 2 块盘) |
| 平衡需求 | | |
| 数据库/虚拟机 | | 金融、证券等高要求场景标准配置,随机 IO 性能远优于 RAID 5 |
| 超大容量归档 | | |
三、生产环境的组合方案:RAID + LVM
企业服务器的最佳实践是:先做硬件 RAID(获得冗余和性能),再在 RAID 逻辑盘上做 LVM(获得灵活扩容能力)。这两者并不互斥,而是互补关系。
3.1 组合架构
图 3:RAID 10 + LVM 生产架构 — 冗余、性能与灵活扩容的叠加- 1. 硬件 RAID:确保单盘故障不影响业务运行,并提升读写性能。
- 2. LVM:在 RAID 提供的可靠存储之上,实现按需分配和在线扩容。
大多数企业级服务器的标准配置就是硬件 RAID 10 + LVM 管理。
3.2 LVM 与 RAID 的定位差异
| 对比项 | LVM | RAID |
|---|
| 核心目的 | 容量管理(灵活扩容、按需分配) | 性能 / 冗余(速度提升、数据安全) |
| 数据保护 | 无冗余,单盘故障可能导致数据丢失 | 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 | | |
| 删除原文件 | | |
| 跨文件系统 | | |
| 目录链接 | | |
| 创建命令 | ln file.txt hardlink.txt | ln -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。两者在设计理念和适用场景上有明显差异。
| | |
|---|
| | Ubuntu / Debian / 较早的 RHEL |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| 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验证配置正确性,不确定时可先注释掉。
七、排查磁盘空间的完整流程
当磁盘空间告警时,按以下流程逐层排查:
df -h # 查看各分区使用率df -i # 如果空间够但报 No space,检查 inode
# 进入满了的分区根目录cd /du -sh * 2>/dev/null | sort -h | tail -20
# 查找 >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
# 文件被删除但进程仍持有句柄时,空间不会释放lsof | grep deleted# 重启相关进程或 kill -HUP 即可释放空间
lvextend -L +50G /dev/vg1/lv1xfs_growfs /mnt/lv1 # XFS 用挂载点resize2fs /dev/vg1/lv1 # EXT4 用设备路径
八、落地实践:从裸盘到生产存储
将前面所有知识点串联起来,以下是一个完整的生产环境部署方案——从 4 块裸盘到运行中的业务存储,涵盖 RAID 创建、LVM 配置、文件系统格式化和挂载的全流程。

# 使用 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)
# 在 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
# 格式化(统一使用 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
# 写入 /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
# 场景:/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 提供大文件场景下的优秀性能和在线扩容支持。掌握这套架构的设计思路和操作流程,是运维工程师从初级走向资深的必经之路。