首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
CentOS7 LVM分区调整实战:缩减/home扩容/var,解决磁盘空间不足
📅 2026/10/19 5:16:32
✍️ 爱科研究院
👁 阅读 3,247
做运维的朋友应该都遇到过这种场景装系统时分区没规划好或者以前规划的时候压根没细想默认给了/home很大的空间结果跑了几个月发现/var分区被日志、缓存、数据库文件给塞满了告警邮件一封接一封而/home那边几百个G闲着连零头都没用上。这时候最不想干的事就是重装系统或者把数据拷出来再重新分区。CentOS7下用LVM逻辑卷管理就能很方便地解决——把/home腾空把空间匀给/var整个过程能在线完成数据也不用大动干戈。这篇博文就把我实际操作中的步骤、原理、还有踩过的坑都捋一遍照着做基本能少走弯路。1. LVM究竟是个什么底层机制1.1 物理卷、卷组、逻辑卷三层关系很多新手听到LV扩容觉得很高深其实LVM的本质就是给磁盘加了一层“虚拟化”。它把物理磁盘划分成物理卷PV多个物理卷聚合成一个卷组VG卷组里的空间再按需切给逻辑卷LV。你平时看到的/dev/mapper/centos-root、/dev/mapper/centos-home这些都是逻辑卷。系统读写文件时LVM负责把逻辑卷上的数据映射到物理卷上的具体位置。这层抽象最大的好处就是——分区大小不再是死的。传统分区用fdisk切完之后想要改大小只能删了重建而LVM的逻辑卷可以在线扩大甚至可以从一个卷里把空间挤出来挪到另一个卷里。这正是“减少home增加到var”能实现的前提。1.2 为啥能腾挪关键在PE这个最小单位逻辑卷的空间分配单位叫PEPhysical Extent默认大小是4MB。你在创建VG、扩容LV的时候LVM本质上就是在做PE的分配和回收。你缩减/home的LV就是从home所属的PE中“释放”出一批空闲PE还给VG你扩展/var的LV就是把VG里的空闲PE再分配给var。整个过程就像从一个大仓库里先腾出一块区域再划给另一个部门用物理磁盘上数据所在的位置可能变但这些事情LVM在底层处理上层文件系统只需要配合调整自己的元数据。这也是为什么缩容比扩容复杂扩容只需要把新的PE块加进来文件系统再扩展一下自己的空间信息就行缩容则牵涉到把文件系统里的数据往前面搬、把后面的块释放掉数据一多操作起来就必须非常小心顺序错了可能直接干掉整个文件系统。1.3 为什么默认安装时home往往特别大CentOS7装系统时如果用自动分区安装器经常把大部分剩余空间分给/home。你要是选择“手动配置分区”但不改大小它也常按默认的比例来。等于说很多服务器的/home一开始就是个“隐形大块头”。但实际上无论是跑Web服务、容器、数据库还是充当监控、日志收集节点真正吃磁盘的都是/var/log、/var/lib、/var/cache这些目录。于是“home白白闲着、var天天告急”的矛盾就这么来了。2. 动手前的风险评估与分区现状摸底2.1 真实场景案例某台服务器的分区现状我以之前处理过的一台某业务服务器为例。运行环境是CentOS7.9磁盘是一块500G的云盘LVM卷组名是centos。安装系统时用的是默认分区方案结果如下/dev/mapper/centos-root50G挂载 //dev/mapper/centos-home400G挂载 /home/dev/mapper/centos-var50G挂载 /var这台机器跑的是应用服务加日志采集几百个用户数据都放在数据库里实际存在/home下面的文件大概只有20G。而/var/log和/var/lib/mysql一路疯涨眼看50G就撑不住了。df -h里/var的使用率到了92%再这么下去服务随时会崩。这时候最稳的解法就是把/home的400G瘦身成40G匀出360G给/var。2.2 核心风险提示这一步必须放在最前面在我正式开始讲具体命令之前必须先泼一盆冷水所有涉及缩容的操作都存在数据损坏风险。缩容逻辑卷时如果文件系统缩容失败或者中间断电数据就有可能丢。所以一定、一定、一定要先备份。哪怕你觉得“这台机器上没什么重要数据”也至少要确认这一点。我之前就有一次帮别人处理服务器对方说“home随便搞”结果/home里藏着一个从来没人提过的归档备份目录几十个G还好提前备份了不然后果完全不敢想。备份方式可以根据数据量选数据量小直接tar打包到其他分区量大就考虑用rsync同步到另一台机器或者挂载的存储盘。备份这一步做不做、做到什么程度直接决定了后面操作的风险等级。2.3 先看清现状检查文件系统类型和挂载情况实际操作前先确认三件事文件系统类型、当前挂载情况、逻辑卷的具体尺寸。CentOS7默认文件系统一般是xfs但有些场景会手工做成ext4。xfs和ext4在扩容缩容上有本质区别这一步没搞清楚后面很容易直接踩爆坑。先看挂载和文件系统类型df -hT输出类似这样Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 50G 6.3G 44G 13% / /dev/mapper/centos-home xfs 400G 20G 381G 5% /home /dev/mapper/centos-var xfs 50G 46G 4.0G 92% /var再看LVM底层的卷组情况vgs lvs pvdisplayvgs看卷组总容量和剩余空间lvs看每个逻辑卷的大小pvdisplay看物理卷的具体情况。要是卷组里本来就有空闲空间那根本不用动home直接lvextend var就行。但大多数默认安装的场景下VG的空间已经被home占完所以必须先从home那边“挤空间”出来。2.4 xfs和ext4的扩容缩容差异这里必须重点提一下xfs和ext4的区别因为很多人就是栽在这上面xfs文件系统可以在线扩容但不支持缩减。也就是说如果/home是xfs你不能直接resize2fs把它缩小再lvreduce。必须走备份、卸载、删除逻辑卷/重建逻辑卷、格式化、恢复数据的路子或者用一些弯道操作。ext4文件系统既支持在线扩容也支持在卸载状态下缩容。缩容顺序必须是先缩小文件系统再缩小LV扩容反过来先扩LV再扩文件系统。CentOS7默认的/home和/var基本都是xfs所以标题里“减少home”这个操作对xfs来说实际上是“把home的数据备份走、删掉原LV、创建新小LV、格式化、挂载、还原数据”。如果数据量大这个过程就会比较痛苦这也是为什么我一直在强调先看文件系统类型。如果你的home恰好是ext4那倒是可以直接走缩容流程会快很多。3. 核心实操步骤缩减home、扩容var3.1 第一步备份home并卸载在动/home之前必须先把数据备份出来。我是用rsync将/home下所有数据同步到/backup目录的mkdir -p /backup rsync -avxP --delete /home/ /backup/rsync参数说明-a表示归档模式保留权限和时间戳-v显示过程-x不跨文件系统-P显示进度并支持断点续传--delete删除目标端多余文件确保两边完全一致。备份完成后用diff或者再跑一次rsync检查一下一致性。接下来卸载/home。如果服务器上没有任何服务依赖/home直接umount /home这一步通常没问题。但有时候umount会提示target is busy说明有进程正在使用/home目录下的文件。需要先找出来并处理掉。一般用fuser -mv /home lsof | grep /home找到占用进程后能停的先停或者用fuser -km /home强制杀掉。这一步在生产环境要特别小心不要误杀关键进程。杀完之后再次umount直到成功。3.2 第二步删除或缩减home逻辑卷这里分两种情况。如果你的home是xfs不支持缩减最简单干脆的做法是直接删掉整个home LV然后用回收的空间创建一个小一点的home LVlvremove /dev/centos/home等等在lvremove之前还得先把/etc/fstab里关于/home的挂载项处理好不然后面重启会起不来。你可以在fstab里临时注释掉或者等创建了新LV之后再把新UUID写回去。我习惯于先注释掉后面重建完成再补上。修改fstab用vi /etc/fstab找到类似这一行/dev/mapper/centos-home /home xfs defaults 0 0在行首加#注释掉。然后删除LVlvremove /dev/centos/home系统会询问是否确认输入y。此时卷组里就多出来400G的空闲空间。接下来创建新LVlvcreate -L 40G -n home centos这条命令的意思是在卷组centos里创建一个名字叫home、大小40G的逻辑卷。然后格式化mkfs.xfs /dev/centos/home再挂载mount /home确认没问题后把fstab里的注释恢复最好把挂载方式改成UUID方式避免以后设备名错乱blkid /dev/centos/home把输出的UUID写到fstab里。最后把备份数据还原rsync -avxP /backup/ /home/如果/home数据量小这个流程几分钟就完成。但如果数据量大备份、恢复两头都要花时间这时候务必预留足够的窗口期。3.3 第三步把空间分给varhome释放出来的空间现在回到了卷组centos里。可以先确认一下vgs看到Free那一列变了就说明空间已经回到VG了。接下来把多出来的空间全部分配给varlvextend -l 100%FREE /dev/centos/var这里我用了-l 100%FREE意思是把卷组里所有剩余空间都扩展到var逻辑卷。也可以用更精确的写法比如lvextend -L 360G /dev/centos/var如果卷组剩余空间刚好是360G这效果一样但用百分比更省事不需要手算。我个人在这个场景喜欢直接100%FREE毕竟home已经缩到够用剩下的全给var就是目标。3.4 第四步扩容var文件系统LV扩容完成只代表块设备层有了更多空间文件系统还要再“吃”进来才算真正可用。xfs用xfs_growfsext4用resize2fs千万别搞混。对xfs执行xfs_growfs /var注意xfs_growfs后面的参数是挂载点不是设备路径。它支持在线扩容不需要卸载。执行完输出里会显示新的块数量说明文件系统已经扩大。如果var是ext4则执行resize2fs /dev/centos/varext4的resize2fs同样支持在线扩容。这里再次提醒xfs千万别用resize2fs会直接报错不认文件系统类型ext4也千万别用xfs_growfs同样报错。我见过有同事把这两个搞混结果以为操作失败折腾了半天排查其实只是工具用错了。3.5 第五步验证结果并更新fstab全部弄完后该验证了df -hT lvdisplay确认var已经变成400G左右home是40G左右并且正常挂载。同时还要确认fstab里的home挂载项没有任何问题。用mount -a这条命令用于重新加载fstab里的所有挂载项。如果没报错说明fstab没问题。如果报错马上看是不是设备名写错了或者UUID不对。修完之后可以shutdown -r now重启验证一次确保重启后一切正常。虽然重启会短暂中断服务但比起“一周后发现起不来”这个代价要小得多。4. 常见问题与排查技巧实录4.1 umount提示target is busy卸载不掉这是最常遇到的第一个坑。卸载/home时提示umount: /home: target is busy原因基本只有一个有进程打开着/home目录里的文件。排查手段fuser -mv /home会列出使用/home的进程PID和命令行。也可以用lsof | grep /home看到进程后能正常停的就正常停确实停不了的用fuser -km /home强制终止。但这个命令要慎用生产环境上杀错进程的影响可能比磁盘空间告警还严重。所以最好先人工看一遍lsof的结果确认这些进程到底在干嘛再决定动作。有一种特殊情况当前用户的工作目录就在/home下比如你用某个账户登录后cd到了/home那也会导致卸载失败。解决方法是切到/或其他目录再卸载。4.2 lvremove报错提示逻辑卷正被使用即使umount成功了lvremove仍然可能提示“/dev/centos/home: contains a filesystem in use”或者类似“Logical volume centos/home in use”。这有可能是某个进程仍持有句柄也可能是udev设备状态还没更新。处理办法lvchange -an /dev/centos/home dmsetup remove_all然后重新查看状态。如果还不奏效用lsof再次检查是否有进程持有句柄。还不行的话有一个终极大招就是重启机器反正fstab里你已经注释掉了home重启之后home不会挂载LV设备也会释放再lvremove就顺畅了。4.3 扩容后df -h看不到新增空间LV已经lvextend了但df看到的大小没变化。这种情况几乎都是忘记了最后一步——文件系统扩容。xfs的需要xfs_growfsext4的需要resize2fs这步绝对不能省。只要执行完对应命令df就会体现出变化。4.4 误用resize2fs去缩xfs报错“Filesystem has unsupported features”这个坑很隐蔽有可能会遇到某些教程在写“缩小home”操作时直接甩一句resize2fs /dev/centos/home 200G但你的home是xfs执行时会提示resize2fs: Bad magic number in super-block while trying to open /dev/centos/home这里根本不是“坏”了而是文件系统类型不支持。xfs没有缩小工具不要在xfs文件系统上尝试缩小操作。唯一的正道是备份、删除、重建、恢复。如果遇到数据量特别大、没法轻松备份的机器建议在业务低峰期操作或者干脆评估另一套方案——保留home不动另加一个新磁盘挂到/var上。4.5 重启后进不了系统卡在挂着home设备这种情况多半是fstab没有处理好。要么注释不彻底要么重启后又把旧的home挂载项启用了但LV已经被删于是开机就报错。挂在失败的时候会提示按CtrlD进入维护模式。进入维护模式后把fstab里的home那一行注释掉或改成新UUID再重启就好。这也是我为什么一直强调mount -a和重启验证这两个步骤不要省略。5. 另一种常见思路保留home不动直接加物理卷扩容有时候home虽然占着空间但业务上确实还需要继续往home里写数据不太想动它。这时候可以换个思路如果有条件加一块新磁盘把它做成物理卷并加入到卷组centos里然后直接把VG的空间扩大再lvextend给var。这样完全不需要碰home操作风险更低。步骤是pvcreate /dev/sdb vgextend centos /dev/sdb lvextend -l 100%FREE /dev/centos/var xfs_growfs /var三分钟搞定啥都不用迁也不用卸载。这个方案适合那种磁盘空间整体不够、而不是分区比例失衡的场景。另外还有一种思路是把/var下的某几个子目录直接挪到独立分区或另一块盘上比如把/var/lib/docker、/var/log单独挂盘。逻辑上更干净也能避免和系统分区抢空间但这属于“未来的规划”解决不了眼前“var快满了”的燃眉之急。作为运维解决问题既要看当下的需求也要考虑以后的增长模式如果日志增长非常快可能这次给了400G半年后又满了这时候就该考虑把/var/log放到独立磁盘、配上日志轮转从根上解决问题。6. 几个我特别想提醒的实操细节6.1 操作窗口期要留足缩减home再扩容var如果走的是重建home这条路中间有很长一段时间home是不可用的。业务上有任何依赖/home的服务都要提前停机或切换。我一般在计划操作前会先做一次全量备份再和业务方确认操作窗口然后才动手。6.2 格式化之前必须确认设备路径lvremove之后重建homemkfs.xfs /dev/centos/home这步非常危险。如果设备路径写错比如说手滑把/dev/centos/var给格式化了那数据直接全部消失。我在执行前会反复确认lvs的输出核对设备名。有条件的话甚至可以先给lvm的LV做一个快照万一操作出错还能回滚。6.3 云服务器的特殊注意事项如果你的服务器是云主机还有一层额外的东西要考虑云平台上的磁盘可能本身就能在线扩容。比如云盘控制台先把磁盘从500G扩到800G然后进系统用growpart、pvresize把新空间吸收进VG最后lvextend给var。这种路径比“从home挤空间”更平滑不需要动home也不需要考虑数据搬移。同理如果是物理机可能就要考虑RAID卡、阵列等相关因素不同环境差别很大。我在某云环境上处理过一个类似问题思路就是控制台扩云盘——系统里pvresize——lvextend——xfs_growfs四步就完成了。这种方法也有局限性云盘扩容需要花钱而且有些老实例类型不支持在线扩容。具体操作前最好先去控制台看看支持不支持。6.4 调整完别忘了监控空间调整完不代表一劳永逸。日志类分区增长非常快建议配置好日志轮转比如logrotate并且加一个简单的磁盘空间监控脚本或者接入监控系统到80%就告警。否则下次再发现的时候又是急到跳脚的场景。以前我给某台机器配过一个简单的cron任务*/10 * * * * df -h | awk NR1 $5085 {print $0} | mail -s disk alarm opsexample.com简单粗暴但确实能在空间打满之前提前发现。建设一个完善的监控体系这一块的价值其实比“会扩容命令”大多了——毕竟扩容解决的是已经发生的问题监控解决的是“还没发生的问题”。6.5 关于“减少home增加var”的最终操作顺序总结最后再帮你理顺一遍整体顺序避免来回折腾检查文件系统类型df -hT确认home、var的是xfs还是ext4。备份/home数据rsync到/backup或其他安全位置。停止使用/home的进程卸载/home。注释fstab里的home挂载项。删除home逻辑卷lvremove。创建新home逻辑卷并格式化lvcreate、mkfs.xfs。挂载新home并恢复数据。把释放的空间扩展给varlvextend -l 100%FREE。扩容var文件系统xfs_growfs或resize2fs。更新fstab重启验证。这套流程在CentOS7上跑过很多遍稳不稳的基本要点都在上面说清楚了。核心就是一件事搞清楚文件系统类型、备份做足、顺序别乱。把这三点做到这个操作的风险基本可以降到很低。至于其他Linux发行版只要你用的是LVM管理磁盘这套思路也是通用的——改改卷组名、包管理器不太一样而已大方向一模一样。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/19 5:16:32
AI Code Review 建议重构怎么办?Resolve 前的决策清单与技术债排期
2026/10/19 5:16:32
动物图片数据集:10类28K JPG用于CNN图像分类实战指南
2026/10/19 5:16:32
开源AI一键生成产品宣传片:本地部署实测与避坑指南
2026/10/19 5:56:36
diagram-design:从草图到系统,技术图设计方法论与工程实践
2026/10/19 5:56:35
数据规范化Python实战:三种缩放方法选型与数据泄露避坑
2026/10/19 5:56:35
artcraft 创意手工项目管理框架:从素材到归档的完整工作流
2026/10/19 5:56:35
从零搭建图表设计器:SVG渲染、拖拽交互与数据模型全解析
2026/10/19 5:56:35
信息稀缺项目代号如何破局:从rea三字母到可运行原型
2026/10/19 5:51:35
XML、JSON、TXT标注格式互转实战:数据预处理的核心技术
2026/10/19 0:01:13
频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现
2026/10/19 0:01:13
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道
2026/10/19 0:01:13
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统
2026/10/18 0:02:43
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/19 2:04:59
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/18 0:02:43
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/17 10:15:50
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/16 18:46:48
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/16 18:46:46
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)