尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Docker根分区告警?LVM在线扩容实战与避坑指南
1. 磁盘告警背后的真相为什么容器环境总先撑爆根分区凌晨两点监控面板上那台跑了十几个容器的宿主机突然飘红/dev/mapper/centos-root使用率冲到 98%Docker 日志写入直接卡死几个业务容器开始反复重启。这种场景我遇到过不止一次几乎成了容器化部署的月经贴。很多人第一反应是磁盘不够就加盘但真正的问题往往不在容量本身而在于根分区被 Docker 的数据目录、镜像层、容器日志和临时文件共同蚕食而/dev/mapper/centos-root恰恰是 CentOS 默认 LVM 布局里最容易被忽视的那块逻辑卷。先把概念理清楚。/dev/mapper/centos-root不是一块物理磁盘它是 LVMLogical Volume Manager逻辑卷管理体系下centos卷组里的一个逻辑卷通常挂载在/根目录。CentOS 7 及更早版本默认安装时会把大部分剩余空间划给root逻辑卷而/home往往只分到很小一块。Docker 默认把数据放在/var/lib/docker这个路径就在根分区下面于是镜像、容器可写层、日志、卷数据全部堆在centos-root上。镜像拉得越多、容器跑得越久、日志不清理根分区就越危险。这篇文章面向的是已经在生产或测试环境跑 Docker、并且遇到根分区告警的运维和开发人员也适合刚接触 LVM 想搞清楚扩容逻辑的新手。我会从 LVM 的底层结构讲起把为什么能在线扩容扩容前必须确认什么具体命令怎么敲踩过哪些坑全部摊开讲。你不需要停机重装系统也不需要把数据搬来搬去只要卷组里还有空闲空间扩容就是几条命令的事。但如果卷组也满了那就得先解决物理层的问题这部分我也会讲清楚。需要提前说明的是扩容本身是在线操作LVM 和 XFS 文件系统都支持在线扩展不需要卸载分区、不需要重启。但在线不等于无风险操作前该做的备份、该确认的挂载点、该检查的文件系统类型一个都不能省。下面我按实际排查和操作的顺序把整个流程拆开讲。2. LVM 三层结构拆解扩容到底扩的是哪一层2.1 物理卷、卷组、逻辑卷的关系要搞懂扩容先得把 LVM 的三层结构吃透。我用一个生活化的类比物理卷PV像一块块砖头卷组VG像把这些砖头垒成的一面墙逻辑卷LV像从这面墙上切出来的一块块区域。你可以往墙里加砖头加物理卷也可以把某块区域切大一点扩逻辑卷只要墙上还有没被切走的面积。对应到命令层面PVPhysical Volume物理卷通常是/dev/sda3、/dev/sdb1这样的分区或者整块盘。用pvs、pvdisplay查看。VGVolume Group卷组把多个 PV 聚合成一个资源池。用vgs、vgdisplay查看重点看VFree剩余空闲空间。LVLogical Volume逻辑卷从 VG 里划分出来的实际使用单元/dev/mapper/centos-root就是其中一个。用lvs、lvdisplay查看。扩容的本质就一句话从 VG 的空闲空间里再切一块给 LV然后让文件系统识别到这块新空间。所以第一步永远是确认 VG 有没有空闲空间。如果VFree是 0那再怎么敲lvextend都没用得先加物理卷或者清理空间。2.2 为什么 CentOS 默认布局容易出问题CentOS 7 的默认分区方案里/根分区通常拿到 50G 左右剩下的空间可能分给/home或者干脆没分配。而 Docker 一上来就把/var/lib/docker放在根分区下一个中等规模的镜像动辄几百 MB 到几个 GB跑上十几个容器日志再一累积50G 很快见底。更麻烦的是很多人装系统时选了自动分区LVM 结构是自动生成的自己都不清楚 VG 里还剩多少空间。我见过最典型的情况是vgs一看VFree还有 200G但根分区就是满了。这种最好办直接扩 LV 就行。另一种情况是VFree为 0但物理机上还有未分配的磁盘或未使用的分区那就得先pvcreate再vgextend把新空间加进 VG然后再扩 LV。还有一种最被动的物理盘本身就没空间了那只能加新硬盘或者迁移数据这属于另一个层面的问题。2.3 扩容前必须确认的四件事在敲任何命令之前我习惯先做四项检查这几步能避免 90% 的翻车确认挂载点和文件系统类型df -Th看/dev/mapper/centos-root挂在哪、是什么文件系统。CentOS 7 默认是 XFSCentOS 6 是 ext4两者扩容命令不同。确认 VG 剩余空间vgs看VFree这是能不能直接扩的关键。确认是否有快照如果这个 LV 上有 LVM 快照扩容前要特别小心快照空间不足会导致快照失效。确认备份虽然在线扩容很成熟但涉及分区操作重要数据该备份还是得备份。我一般会至少确认数据库已经做了逻辑备份。提示XFS 文件系统只能扩大不能缩小这是它和 ext4 最大的区别。如果你扩错了想缩回去XFS 是做不到的只能备份数据重建。所以扩容前想清楚要加多少宁可一次加够别反复折腾。3. 实操全流程从告警到扩容完成的每一步3.1 现场诊断先看清楚磁盘到底怎么分的登录机器第一件事不是急着敲扩容命令而是把现状摸清楚。我通常按这个顺序来# 看各分区使用率和文件系统类型 df -Th # 看 LVM 逻辑卷、卷组、物理卷的概况 lvs vgs pvs # 看块设备整体情况 lsblkdf -Th的输出里你会看到类似这样一行/dev/mapper/centos-root xfs 50G 48G 2.1G 96% /这说明根分区是 XFS总共 50G已经用了 48G。接着vgs的输出VG #PV #LV #SN Attr VSize VFree centos 1 3 0 wz--n- 299.00g 200.00g这里VFree有 200G说明卷组里还有大量空闲空间直接扩 LV 就行。如果VFree是 0那就要看pvs和lsblk确认有没有未使用的磁盘或分区可以加进来。我特别建议用lsblk看一眼整体结构它能直观显示磁盘、分区、LVM 的层级关系sda 8:0 0 300G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 299G 0 part ├─centos-root 253:0 0 50G 0 lvm / ├─centos-swap 253:1 0 4G 0 lvm [SWAP] └─centos-home 253:2 0 45G 0 lvm /home看到这个结构心里就有数了sda2是 LVM 的物理卷centos卷组建立在它上面root、swap、home是三个逻辑卷。如果home用不上甚至可以考虑从home缩容再扩给root但 XFS 不支持缩容这条路对 XFS 走不通只能靠 VG 空闲空间或加新盘。3.2 情况一VG 有空闲空间直接扩 LV这是最省事的情况。假设我要把根分区从 50G 扩到 100G也就是增加 50G。命令分两步先扩逻辑卷再扩文件系统。# 第一步扩展逻辑卷增加 50G lvextend -L 50G /dev/mapper/centos-root # 第二步扩展 XFS 文件系统让它占满整个逻辑卷 xfs_growfs /如果是 ext4 文件系统第二步换成resize2fs /dev/mapper/centos-root这里有个细节值得说清楚lvextend的-L 50G表示在现有基础上增加 50G而-L 100G表示扩展到总共 100G。这两个写法差别很大用错了要么扩不够要么报错。我一般用的写法因为不用去记当前容量直接说加多少更直观。xfs_growfs后面跟的是挂载点不是设备路径。这一点很多人会搞混写成xfs_growfs /dev/mapper/centos-root会报错。而resize2fs后面跟的是设备路径。这是 XFS 和 ext4 在扩容命令上的一个关键区别记牢了能少踩坑。执行完再df -Th看一眼根分区应该已经变成 100G 了。整个过程几秒钟业务无感知。3.3 情况二VG 没空间先加物理卷再扩如果vgs显示VFree为 0但机器上还有未使用的磁盘比如/dev/sdb或者未分配的分区那就得先把新空间加进 VG。假设/dev/sdb是一块全新的 500G 磁盘# 第一步把新磁盘创建为物理卷 pvcreate /dev/sdb # 第二步把新物理卷加入 centos 卷组 vgextend centos /dev/sdb # 第三步确认卷组空间已增加 vgs # 第四步扩展逻辑卷 lvextend -L 200G /dev/mapper/centos-root # 第五步扩展文件系统 xfs_growfs /这里有个容易忽略的点pvcreate会清空磁盘上的分区表和文件系统签名。如果/dev/sdb上还有数据这一步会直接毁掉。所以执行前一定要用lsblk和blkid确认这块盘是干净的、没有挂载、没有重要数据。我见过有人把数据盘误当成新盘pvcreate结果数据全没了这种事故完全可以在操作前用一条blkid /dev/sdb避免。另外如果新空间是磁盘上的一个未使用分区比如/dev/sdb1那pvcreate的对象就是/dev/sdb1而不是整块盘。用fdisk -l或parted -l能看清楚分区情况。3.4 情况三物理盘也满了只能加盘或迁移最被动的情况是物理磁盘本身没有剩余空间也没有空闲分区。这时候有几条路加新硬盘物理机加盘或者云主机挂载新云盘然后按 3.3 的流程pvcreatevgextendlvextend。迁移 Docker 数据目录把/var/lib/docker迁到一块独立的大盘上从根分区卸载压力。这个方案治本但需要停 Docker 服务操作步骤多。清理空间docker system prune -a清理无用镜像和容器清理日志文件这是应急手段不解决根本问题。我个人的经验是生产环境最好一开始就把 Docker 数据目录规划到独立分区或独立盘上别让它和根分区抢空间。如果已经混在一起了扩容之后也建议做一次数据目录迁移把根分区彻底解放出来。4. 避坑指南扩容过程中最容易翻车的几个点4.1 文件系统类型判断错误这是新手最常犯的错。CentOS 7 默认 XFS但如果你装系统时手动选了 ext4或者从 CentOS 6 升级上来文件系统可能是 ext4。用错命令的后果是xfs_growfs对 ext4 报错resize2fs对 XFS 也报错虽然不会损坏数据但会让人一脸懵。判断方法很简单df -Th的输出里有一列就是文件系统类型或者用blkid /dev/mapper/centos-root看TYPE字段。XFS 用xfs_growfs 挂载点ext4 用resize2fs 设备路径记住这个对应关系就不会错。4.2 扩容命令参数写反lvextend -L 50G和lvextend -L 50G是两回事。前者是增加 50G后者是扩展到 50G。如果当前已经是 50G你敲-L 50G它会提示New size matches existing size什么都不做。如果当前是 80G你敲-L 50G它会报错说不能缩小。所以加空间一律用这是最稳妥的写法。还有一个参数是-l小写 L它按扩展块extent数量来算不是按容量。除非你很清楚 PEPhysical Extent的大小否则别用-l用-L按容量算最直观。4.3 忘记扩文件系统lvextend只是把逻辑卷这个容器变大了里面的文件系统还是原来的大小。很多人敲完lvextend一看df -Th没变化就以为扩容失败了。其实还差最后一步xfs_growfs或resize2fs。这两步是配套的缺一不可。我习惯把这两条命令写成一个组合执行完立刻df -Th验证。如果df显示容量没变先检查文件系统类型对不对再检查命令有没有报错。4.4 快照和精简卷的坑如果 LV 上存在 LVM 快照扩容主卷之前要确认快照的 COWCopy-On-Write空间是否足够。主卷扩容后如果快照空间不足快照会失效变成Invalid状态虽然不影响主卷数据但快照就没用了。另外如果用的是精简置备thin provisioning的逻辑卷扩容命令略有不同要用lvextend配合-L并确保 thin pool 有足够空间。普通线性卷没这个问题但精简卷在容器和虚拟化环境里越来越常见值得留意。4.5 常见问题速查表现象可能原因排查与解决lvextend报 insufficient free spaceVG 没有空闲空间vgs确认 VFree为 0 则先pvcreatevgextenddf -Th扩容后容量没变忘记扩文件系统XFS 执行xfs_growfs /ext4 执行resize2fsxfs_growfs报 not a mounted XFS参数写成了设备路径改成挂载点如xfs_growfs /resize2fs报 Bad magic number文件系统不是 ext 系列用df -Th确认类型XFS 改用xfs_growfspvcreate后数据丢失误对数据盘操作操作前blkid确认盘是空的有数据先备份扩容后根分区还是满Docker 日志或镜像占用docker system df看占用清理无用镜像和日志5. 扩容之后的收尾让根分区不再反复告警扩容只是止血真正要解决的是为什么根分区会满。我一般会在扩容后做几件事把隐患掐掉。第一件事是限制 Docker 日志大小。默认情况下Docker 容器的日志是无限增长的一个疯狂打日志的应用几天就能吃掉几十 G。在/etc/docker/daemon.json里加上日志限制{ log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }这样每个容器最多保留 3 个 100M 的日志文件总共 300M不会无限膨胀。改完重启 Docker 生效注意这只对新创建的容器生效已有容器需要重建。第二件事是定期清理无用镜像和容器。docker system df能看清楚镜像、容器、卷、构建缓存各占多少。docker system prune -a能清理所有未使用的资源但会删掉没在运行的容器和没被引用的镜像生产环境用之前要确认清楚。我一般用更保守的docker image prune和docker container prune分开清理。第三件事是把 Docker 数据目录迁到独立盘。如果机器上有独立的数据盘把/var/lib/docker迁过去是最彻底的方案。步骤是停 Docker 服务rsync迁移数据修改/etc/docker/daemon.json里的>
RELATED

相关推荐

FY-4A数据读取与处理:从HDF5到亮温云图

FY-4A数据读取与处理:从HDF5到亮温云图

简介:围绕风云四号(FY4A)卫星数据读取与解析的 Python 代码包,面向气象、遥感及卫星数据处理初学者和开发者,解决原始观测数据解析与预处理问题,可用于气象预报、气候监测、环境灾害预警等场景。资源共含6个…

📅 2026/10/21 1:45:38
TinyML开发板选型指南:为什么现成板子不够用及自研硬件全流程

TinyML开发板选型指南:为什么现成板子不够用及自研硬件全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/21 1:45:38
气体传感模组低功耗物联网设计:从原理选型到功耗预算的工程实践

气体传感模组低功耗物联网设计:从原理选型到功耗预算的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/21 1:45:38
MORE NEWS

更多资讯

📰

DLMS/COSEM 蓝皮书解读(四十一):IEC 61334-4-32 LLC setup(class_id = 55)—— S-FSK 的 LLC 子层“参数本“

DLMS/COSEM 蓝皮书解读(四十一):IEC 61334-4-32 LLC setup(class_id 55)—— S-FSK 的 LLC 子层"参数本":帧长上限 RDR 待读清单系列说明:本系列基于 DLMS UA《Blue Book&#xff0…

📰

NVQLink:破解量子与经典计算互连瓶颈的开放式架构

量子计算这两年热度一直很高,不过大多数人聊的都是比特数、保真度、纠错阈值这些“芯片内部”的话题。真正把一台量子处理器装进数据中心机柜之后,你会发现最大的瓶颈其实不在量子比特本身,而在它和外面那套经典计算系统之间的互连层。NVQLin…

📰

ABS建模避坑指南:从滑移率物理一致性到制动器热-机耦合

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ABAP 里的引路蜂,如何把业务带回可识别的起点

《仙剑奇侠传 1》的引路蜂有一个很明确的用途,使用后回到迷宫起点。把它放进企业系统,问题就变得有意思了。我们正在处理一张单据,页面已经跳过好几层,后台执行了校验,可能还调用了另一个系统。此时想要「回到起点」,究竟是让屏幕显示最初的页面,找出这张单据从哪里进入…

📰

YOLO模型从PyTorch到RKNN的完整转换链路:ONNX中转与量化部署指南

做边缘端部署的人,只要碰过瑞芯微的RKNN NPU,多半都绕不开这条链路:把Ultralytics框架训练好的YOLO模型,从PyTorch的.pt格式,转成ONNX,再转成RKNN格式。这篇内容就围绕这条转换链路展开,把每一步…

📰

CTGAN核心机制拆解:表格数据生成原理、应用与排坑指南

先说个我实际踩过的坑。有一段时间我接了个数据脱敏的活儿,对方要求在不泄露某些敏感字段的前提下,把一批几万行的表格数据整体“复制”一份出来,供开发和测试环境使用。我当时第一反应是上 GAN,因为在图像领域拟合效果已经很成熟…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬