ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Linux磁盘管理与LVM实操指南:分区、扩容、快照与避坑总结

Linux磁盘管理与LVM实操指南:分区、扩容、快照与避坑总结 1. 从一块“塞满的盘”说起搞Linux运维的朋友十有八九都经历过这种时刻磁盘满了应用直接宕掉跑过去一看df -h输出红字/分区 100%一堆日志和临时文件把/var堆到一点不剩。更头疼的是当初装系统时图省事所有空间全给了根分区想扩容只能找停机窗口拆机加盘流程长还容易出岔子。我自己最早那几年就吃过这个亏线上数据库的磁盘告警扩容花了大半夜从那时候起我就意识到Linux 磁盘管理不能只靠“分区格式化挂载”三板斧得把 LVMLogical Volume Manager逻辑卷管理这套东西真正吃透用它来解决动态扩容和灵活调整的痛点。这篇文章以“Linux 磁盘管理与 LVM”为主线不讲虚的直接拆解底层概念、常用命令、完整实操流程再附上我踩过的坑和排查经验。适用于刚接触 Linux 服务器管理的初学者也适合正在准备运维面试、想把磁盘这块知识补全的中级学习者。看完这篇文章至少你能做到拿到一块新盘知道怎么分区、格式化、挂载对现有 LVM 布局能一眼看懂遇到扩容、缩容、快照这类需求不再心里发怵。2. 磁盘管理基本功分区、格式化与挂载2.1 分区工具怎么选fdisk vs parted vs lsblkLinux 下磁盘分区工具很多但我实际用下来日常维护主力还是fdisk和parted两个lsblk则是我每次动手前必看的“地形图”。fdisk最经典的工具交互式操作适合 MBR 分区表单盘容量 2TB 以下时够用。操作逻辑简单n新建、d删除、w保存退出用熟了全程盲打都行。parted专门应对 GPT 分区表和大容量磁盘2TB 以上必须用它支持交互式和命令行两种模式。实际生产环境里我更喜欢直接用parted /dev/sdb --script mklabel gpt这种非交互写法方便写进脚本里批量操作避免人工输入出错。lsblk查看磁盘和分区关系的利器树状结构一目了然。它能显示每个块设备的大小、挂载点和类型排查“这块盘对应哪个设备名”的时候比fdisk -l输出更直观。选型背后的逻辑很简单分区表类型决定上限。MBR 只能用四个主分区GPT 几乎不受限而且 GPT 是现在新服务器的默认选择。运维工作中除非是接手老机器必须兼容旧 BIOS否则我强烈建议一律 GPT parted。2.2 格式化到底做了什么分区只是把一块物理盘划分成多个独立的“空间段”真正让它能被写入数据必须做文件系统也就是俗称的“格式化”。这个动作的本质是在分区上初始化一套数据结构比如 inode 表、块组描述符、超级块等内核通过这些结构来管理文件读写。常用命令是mkfs.ext4 /dev/sdb1或mkfs.xfs /dev/sdb1加-t可以指定类型确认例如mkfs -t ext4。具体选 ext4 还是 xfs我建议看场景文件系统优点适用场景ext4兼容性最强支持在线扩容和缩容前提是未挂载时缩容也费劲通用业务、老系统迁移xfs性能好大文件处理强扩容只需xfs_growfs大数据、数据库、高并发存储btrfs支持快照、压缩、校验和实验环境、特殊存储需求一个很容易被忽略的点xfs 不支持在线缩容只能扩不能缩。如果你预期后续要缩容一开始就别选 xfs。这是个花了大代价换来的教训我有一次在日志服务器上用了 xfs后来空间分配不合理想缩容只能迁移数据重建文件系统相当痛苦。2.3 挂载与永久挂载格式化完的分区要挂载到目录树里才能用。临时挂载用mount /dev/sdb1 /data重启就失效永久挂载得写进/etc/fstab。为什么不能只写mount因为重启后系统不会自动恢复未登记的挂载关系。/etc/fstab每一行的格式是设备名、挂载点、文件系统类型、挂载选项、dump 备份标记、fsck 检查顺序。实际操作我会建议别直接写设备名比如/dev/sdb1而是写 UUID因为重启后设备名可能漂移但 UUID 是稳定不变的。用blkid可以查到分区的 UUID。典型的 fstab 行UUIDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults 0 2写完 fstab 后务必用mount -a测试一遍。别问我为什么强调这个——我有一次改完 fstab 没验证重启后系统因为挂载失败进不去只能进 rescue 模式改回来冷汗都下来了。加nofail选项可以在挂载设备不存在时跳过避免这种问题但核心还是写完后先测。3. LVM 设计哲学为什么你需要它3.1 传统分区的瓶颈与 LVM 的解法传统分区方案下一个分区的边界一旦定死想调整就只能删了重建这在生产环境等于灾难。LVM 的核心思路是把物理磁盘抽象成“资源池”你不再直接面对物理分区而是面对逻辑卷逻辑卷的大小可以动态调整底层空间来自一个或多个物理磁盘聚合出的“池子”。拿生活化例子类比传统分区像一套固定隔间的出租房每个隔间的墙都浇筑死了想扩大某间屋只能砸墙重砌LVM 像一个仓库里面堆着可移动货架你随时可以调整某个区域的边界甚至可以临时把隔壁区域的货架挪过来用。这个灵活性就是 LVM 存在的最大价值。LVM 的分层结构是理解一切命令的钥匙PVPhysical Volume物理卷一块磁盘或分区标记后就能被 LVM 使用。VGVolume Group卷组多个 PV 聚合形成的资源池相当于“总仓库”。LVLogical Volume逻辑卷从 VG 里划出的具体空间是最终格式化挂载使用的对象。PEPhysical ExtentPV 上的最小存储单元默认 4MiB类似文件系统里的块。LV 的分配就是按 PE 个数来计算的。3.2 LVM 里的关键术语与数据流向数据写入路径是这样的进程 → LV → VG → PE → PV → 磁盘扇区。理解这个链路后你就明白为什么 LVM 可以跨磁盘——一个 VG 里可以加入多块 PVLV 的数据可以散布在多块物理盘上。但这也带来一个隐患如果某个 PV 故障且它是 VG 里唯一的数据源整个 VG 就危险了。所以生产环境往往用 RAID 或硬件阵列把多块盘先做成整列再在其上建 LVM这样既拿到 LVM 的灵活性又保住数据可靠性。pvcreate、vgcreate、lvcreate这三个命令是 LVM 的核心入口。pvcreate /dev/sdb1把分区初始化为 PVvgcreate vg_data /dev/sdb1 /dev/sdc1把两个 PV 放入卷组lvcreate -L 100G -n lv_data vg_data从卷组划出逻辑卷。每步完成后用pvs、vgs、lvs三个简写命令查看状态基本能覆盖 90% 的排查场景。4. LVM 实操全流程从初始化到扩容4.1 场景设定与初始化操作为了把流程串起来我们假设一个常见需求机器上新增了两块 500GB 的物理盘/dev/sdb和/dev/sdc要把它们组合成一个卷组划分出逻辑卷挂载到/data下用于存放业务文件。第一步确认磁盘识别状态lsblk输出中能看到/dev/sdb和/dev/sdc都是裸盘状态未分区未格式化。第二步创建 PVpvcreate /dev/sdb /dev/sdc这里有个细节可以直接把整个裸盘设为 PV也可以分区后再设。用裸盘省事但如果盘上已有分区表或数据痕迹pvcreate会拒绝执行并要求加-f强制这个操作有破坏性生产环境务必先确认盘内数据不需要了。第三步创建 VGvgcreate vg_data /dev/sdb /dev/sdc默认 PE 大小是 4MiB不需要动。用vgdisplay vg_data可以看到 VG 总大小和剩余空间我这里应该显示约 931GB。第四步创建 LV 并格式化挂载lvcreate -L 800G -n lv_data vg_data mkfs.xfs /dev/vg_data/lv_data mkdir -p /data mount /dev/vg_data/lv_data /data这里故意留了约 131GB 空闲后面扩容演示就是用这部分剩余空间。把挂载写入 fstab 时建议使用逻辑卷的路径而非/dev/vg_data/lv_data因为系统启动时 LVM 的激活顺序由lvm2服务保证直接写逻辑卷路径是安全的。更稳妥的做法是用blkid查逻辑卷的 UUID 后写入两种方式我都在用实测都没问题。4.2 LV 在线扩容的正确姿势扩容是 LVM 最吸引人的功能但许多人第一次操作时容易搞错顺序。核心原则先扩 LV再扩文件系统顺序反了会报错或者导致内核没有刷新识别新大小。比如要把lv_data从 800G 扩到 900G命令是lvextend -L 100G /dev/vg_data/lv_data或者直接指定扩容后大小lvextend -L 900G /dev/vg_data/lv_data然后看文件系统类型xfs 用xfs_growfs /dataext4 用resize2fs /dev/vg_data/lv_dataxfs_growfs的参数是挂载点而resize2fs的参数是设备路径这个区别几乎每天都有新手问。xfs 不能在挂载状态下缩容所以它对扩容方向特别友好ext4 缩容必须在卸载状态下用resize2fs而且有风险千万别在挂载状态强行缩。4.3 缩容与迁移真到用时方知难缩容比扩容复杂得多因为要保证数据安全必须先减小文件系统再减小 LV。ext4 的流程是卸载文件系统umount /data检查文件系统e2fsck -f /dev/vg_data/lv_data缩文件系统resize2fs /dev/vg_data/lv_data 500G缩逻辑卷lvreduce -L 500G /dev/vg_data/lv_data重新挂载mount /dev/vg_data/lv_data /data每一步都要确认成功再走下一步特别是第 3 步和第 4 步的大小必须严格一致不然逻辑卷比文件系统小数据会被截断那是灾难级的故障。xfs 没有缩容能力想缩小就只能备份数据、重建 LV、恢复数据。所以我再次强调创建 xfs 文件系统前先想清楚未来是否有缩容需求。至于 LV 迁移用pvmove /dev/sdb /dev/sdc可以将数据从一块故障盘迁移到另一块这在磁盘预警后做热替换非常有用。我经历过的场景是某块物理盘 SMART 报警但还没完全挂掉就是靠pvmove把数据搬到新盘然后vgreduce移除旧 PV全程业务无感知。4.4 LVM 快照回滚的秘密武器LVM 快照不是物理复制数据而是基于 COWCopy-On-Write写时复制机制。创建快照时系统只记录原卷的元数据状态实际数据不动后续原卷有修改时旧数据才被复制到快照区。因此快照空间占用远小于原始数据量但快照区一旦被写满快照就会失效这点必须提前留出充足空间。常用操作lvcreate -L 20G -s -n snap_lv_data /dev/vg_data/lv_data这里的-s表示 snapshot-n指定快照名。回滚时卸载原 LV用lvconvert --merge /dev/vg_data/snap_lv_data把快照合并回去。这个操作我一般在业务发版前做一版快照万一出问题几十秒就能回到发布前状态大大缩短回滚时间。需要注意快照期间原卷的每次写入都会触发 COW如果业务写入量大快照区会迅速膨胀一定要监控快照使用率满了立即删除或扩容。5. 常见故障排查与避坑手记5.1 挂了但没挂上fstab 与 UUID 问题这是 Linux 磁盘管理最经典的坑。系统启动时报错进不去多半是/etc/fstab里的设备名失效了。排查思路分三步开机时查看日志确认哪行失败进 rescue 模式把 fstab 里对应的行注释掉正常启动后再用blkid核对 UUID 重新挂载。还有一种情况是设备存在但挂载点写错比如挂载点没创建就直接mount系统会报 “mount point does not exist”。解决方案简单先mkdir -p再挂。别笑新手阶段我至少犯过三次。5.2 pvdisplay 看不到 PV先看分区类型执行pvcreate成功但重启后pvdisplay找不到 PV这种情况通常和分区类型标识有关。如果 PV 建在分区/dev/sdb1上分区 ID 应该是8eLinux LVM 类型用fdisk -l可以确认。如果是裸盘建 PV不存在这个问题。但更常见的原因是/etc/lvm配置文件里filter过滤规则设置了accept列表把某些设备排除了。排查时用vgscan -v查看扫描过程能定位到被过滤的设备。5.3 快照空间不足导致锁死快照写满后原 LV 不会立刻损坏但相关 I/O 会变慢甚至卡住。处理方式立即删除快照lvremove -f /dev/vg_data/snap_lv_data释放 COW 压力原卷数据不受影响。如果业务需要保留快照就得在创建时预留 20% 以上的空间并且设置监控告警。我在 KVM 虚机上做过一次实验快照区只有 2G业务写入高峰期半小时就写爆当时数据库写入明显变慢丢了两分钟监控数据后续再也没敢把快照区设得太小。5.4 常用排查命令清单场景命令说明查看空间df -h看挂载点使用率查看磁盘lsblk看块设备树状结构查看分区表fdisk -lMBR/GPT 分区信息查看 UUIDblkid获取设备唯一标识查看 PVpvs/pvdisplay物理卷状态查看 VGvgs/vgdisplay卷组状态和大小查看 LVlvs/lvdisplay逻辑卷状态扫描 LVMvgscan/lvscan重新识别 LVM 设备查看挂载findmnt确认挂载关系这些命令建议背下来面试和技术答辩基本都会问到平时排查也足够用了。真正的高手不是记住每个参数而是能在出问题时快速定位是哪一层出了问题——是物理层、分区层、LVM 层还是文件系统层。5.5 性能问题的隐雷LVM 不是万能的最后说一个容易被忽视的坑。LVM 的条带化striped功能可以提升并发读写性能但配置起来相当谨慎。lvcreate -i 2 -I 64k -L 100G vg_data表示在两个 PV 间做条带化条带大小 64KiB。这种配置对顺序读写有明显帮助但一旦其中一个 PV 故障整个 LV 的数据都可能不可用可靠性反而下降。我个人的建议是生产环境优先做 RAID 底层LVM 只做逻辑管理个人测试环境可以随意折腾条带化实验。性能不够别急着上 LVM 条带先去查文件系统挂载参数、IO 调度器、缓存策略这些往往影响更大。6. 面试高频题与实战复盘很多人在准备 Linux 面试时会发现磁盘管理和 LVM 是必考模块。最常被问的几个问题这里直接给出我认为最到位的答法思路。问题请解释 PV、VG、LV 的关系并说明 PE 的作用。答题思路先讲分层结构——PV 是物理卷由物理磁盘或分区构成多个 PV 组成 VGVG 是资源池LV 从 VG 划出是对外可见的逻辑卷。PE 是 LVM 最小的分配单位默认 4MiBLV 的大小就是 PE 数量的整数倍。用一句话总结PE 是 LVM 的“砖块”PV 是“砖场”VG 是“仓库”LV 是“隔出来的房间”。问题怎么给根分区扩容答题思路先说根分区能否扩取决于当初是否用了 LVM。如果是标准分区且空间不足要么迁移数据到新盘要么用分区调整工具如 gparted 的 LiveCD 方式但风险高如果根分区在 LVM 里新增一块 PV 加入 VG然后lvextend扩根分区对应的 LV再扩容文件系统即可。关键在于向面试官展示你能分清楚“标准分区”和“LVM”两种场景的差异。问题xfs 和 ext4 的区别答题思路xfs 适合大文件高并发扩展性强但不支持缩容ext4 兼容性好支持缩容但操作复杂。如果磁盘容量规划不明确优先 ext4如果确定未来只增不减且重视性能选 xfs。回答时可以补一个实际案例比如数据库日志目录用的是 xfs普通业务数据目录用的是 ext4。问题在线扩容时为什么必须先扩 LV 再扩文件系统答题思路LV 是逻辑边界文件系统是数据管理边界。如果先扩文件系统文件系统尝试使用超出 LV 限定的空间会立刻报错如果只扩 LV 不扩文件系统文件系统感受不到新增空间也无法使用。顺序其实是系统设计上的强约束理解了这一层就不会再犯顺序颠倒的错误。7. 实际操作中的一些个人习惯文章快写完了按惯例分享几个我个人多年养成的习惯算不上什么标准答案但确实帮我避免过几次事故。第一每次改 LVM 或 fstab 之前先cp /etc/fstab /etc/fstab.bak.日期改完用mount -a验证确认没问题再继续。备份这件事在服务器管理里永远不嫌多特别是牵涉到启动流程的文件多一份备份就多一条退路。第二生产环境新建 LV 实际使用量不要超过 80%。LVM 虽然能在线扩容但扩的时候需要 VG 有足够空闲空间如果整块盘都分配完再想扩就只能加新盘。预留 20% 的空间既是性能冗余也是操作空间。这个比例我在数据库服务器上甚至放到 30%。第三监控快照使用率。创建完快照后我会挂一条 cron 或者写进现有监控脚本里每小时检查一次/dev/mapper下的快照空间超过 70% 立即处理。快照写满这件事不发生则已一发生就是生产事故预防成本比处理成本低太多了。第四熟悉 rescue 模式。不管用什么发行版都值得花半小时练习进入 rescue 模式的路径。因为磁盘和 LVM 出问题时很多时候系统起不来你连命令都打不了再强的知识也用不上。能把系统救起来才有后续的修复操作。Linux 磁盘管理和 LVM 是运维工程师的基本功也是系统设计里最容易被低估的一环。很多人觉得“能用就行”等真正空间不够、磁盘报警的时候才后悔当初没好好规划。趁现在手上环境还能折腾多建几个 PV、多切几个卷、多做几次快照回滚练习这些操作熟练了以后真遇上故障心里就有底了。
返回列表