ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux磁盘管理实战:LVM逻辑卷从入门到扩容与恢复

Linux磁盘管理实战:LVM逻辑卷从入门到扩容与恢复 干了这么多年 Linux隔三差五就能收到同事的求救消息“服务器磁盘满了怎么办”“根分区能扩吗”“新挂的数据盘怎么整成 LVM”这些问题看着零散其实都绕不开一件事——磁盘管理。而磁盘管理里最值得花时间研究的就是 LVM逻辑卷管理。它能把一堆物理磁盘揉成一个灵活的资源池扩容、迁移、快照都变得异常顺手。这篇文章我把自己这些年踩过的坑、验证过的流程包括云电脑重装系统前如何安全处理 LVM 数据盘的方法一次性梳理清楚。适合正在学 Linux 的运维新手也适合想系统补课的中级工程师。1. 磁盘管理从分区到挂载先把底子讲透1.1 分区、文件系统与挂载点谁先谁后我见过不少新手把分区和格式化当成一回事其实这是两个完全不同的环节。一块物理磁盘要被系统正常使用通常要经历一条固定链路物理盘 → 分区 → 创建文件系统 → 挂载到目录。任何一步缺失存储资源都无法变成你 ls 能看到的目录。物理盘通过分区表MBR 或 GPT划分出一个个分区。MBR 最大只能识别 2TB、最多支持 4 个主分区GPT 则天然支持大容量盘和更多分区所以现在新部署的服务器基本都用 GPT。分完区之后分区还只是一块空区域必须格式化成具体的文件系统才能存放文件。Linux 上最常见的是 ext4 和 xfsext4 是老牌稳将改大小方便xfs 在大文件和高并发下表现更猛目前也是很多发行版的默认选择但它的短板是不支持缩容。最后一步是挂载把文件系统关联到某个目录用户才能在该目录里正常读写。实操层面最常用的查看命令就三个我每天基本都会敲一遍lsblk # 看树状磁盘拓扑谁是谁的子设备一目了然 fdisk -l # 看磁盘全貌包含分区表和容量细节 df -hT # 看已挂载文件系统的使用率、类型新盘分区时我习惯用 fdisk 或 parted。fdisk 交互界面比较笨但可靠典型流程是fdisk /dev/sdb → 敲 n 新建分区 → 敲 p 选主分区 → 设起始和结束扇区一般直接回车用默认值→ 敲 w 写盘。这里要注意执行 fdisk 之前一定要确认目标磁盘上没有正在被使用的分区否则数据被写坏的那一瞬间你连后悔的机会都没有。1.2 传统分区方式的“三座大山”既然 fdisk 就能分区为什么还要引入 LVM因为传统分区管理在真实运维场景里有三个绕不开的痛点每一条都让人头疼。第一分区大小一旦定死后期很难扩展。你装系统时给 /home 分了 50G跑半年后磁盘满了想从旁边未分配空间匀一点过去基本不可能除非把分区删了重建但那样数据也没了。第二单块磁盘容量有上限。一块 1TB 的盘再厉害也就那么大想让多块盘合并成一个大的逻辑空间来用传统分区方式做不到RAID 能解决一部分问题但配置成本高、灵活性差。第三所有底层操作都发生在裸设备上风险极高。直接在分区表上做文章操作不当就可能引起整个磁盘的数据灾难心理压力特别大。LVM 恰恰把这几个问题全解决了。它的核心思路不是直接管理物理分区而是在物理磁盘和文件系统之间插一层虚拟化抽象层。你有两块 500G 的盘各自变成物理卷放进同一个卷组里就相当于拥有一个 1TB 的资源池想从中划一个 800G 的逻辑卷给 /data完全可以。将来逻辑卷空间不够只要资源池里有空闲空间一条命令就能在线扩容业务不中断。这是传统分区根本没法想象的体验。不过我要强调一点虽然 LVM 好处很多分区基本功依然要练扎实。因为 LVM 最终也落在物理磁盘上如果分区表、文件系统的基础概念不清楚后面排障会非常吃力。建议新人在测试环境里先用 fdisk 分别做做 GPT、MBR 分区再用 mkfs 格式化成不同文件系统最后用 mount 挂载并写入 /etc/fstab把这条路完整走一遍再上手 LVM 就顺理成章了。2. LVM 的核心机制与选型逻辑2.1 PV、VG、LV、PE 到底是怎么配合工作的LVM 对我来说是一套把“拆”和“拼”做成标准操作的管理体系。体系里一共有四个核心角色彼此之间的关系可以用一个生活化例子解释清楚。PVPhysical Volume物理卷由一块磁盘或一个分区创建而来是组成 LVM 的最小单元相当于造房子的砖头。VGVolume Group卷组由一块或多块 PV 汇聚而成是一个动态可增减容量的资源池相当于把砖头堆成一个料场。LVLogical Volume逻辑卷从 VG 这个料场里按需切出的逻辑盘格式化后挂载给应用使用相当于从料场里取料搭成的房间。PEPhysical Extent物理扩展块VG 分配空间的最小单位默认 4MB。LV 每次分配空间都以 PE 为粒度就像按箱发水不管你要不要那么多都是整箱整箱给。数据走向大概是这样的系统写文件时数据落到 LV 上LV 再按 PE 粒度映射到 VG 中的具体 PVPV 最终把数据写到对应的物理盘上。加了一层映射表面看多了一道弯实际上换来的是数据位置不再被物理分区卡死可以随时调整。举一个我经常给新人讲的例子。服务器上有一块 100G 的盘 /dev/sdb一块 200G 的盘 /dev/sdc。传统做法里可能 /dev/sdb 分给 /home/dev/sdc 分给 /var以后任何一边空间不足都麻烦。但用 LVM我可以把两块盘都建成 PV放进同一个 VG这个 VG 就有 300G 可用空间。我再从这个 VG 里匀 100G 给 /home匀 150G 给 /var剩下 50G 留作机动。将来 /home 告急了从机动空间里挤出 20G 给 /home一条命令在线完成。创建 LVM 之前有一个很容易被忽略的准备工作就是在 fdisk 分好区之后把分区类型设置为 8eLinux LVM。虽然即使不设类型pvcreate 也能强行识别但在很多生产脚本和后续排障场景里类型标记能省很多麻烦。刷完 8e 类型后再 pvcreate相当于先给操作系统打了声招呼别把这块地方当普通数据区。另外我平时排查问题优先跑 pvs、vgs、lvs 这三个简洁命令而不是 pvdisplay、vgdisplay、lvdisplay后者信息太全反而费眼。2.2 LVM 的优势在哪里短板又是什么先看优势我总结成四句话在线扩容缩容LV 可以在业务不中断的情况下增大ext4 和 xfs 都支持在线扩容ext4 还支持在线缩容。这在磁盘快满的深夜是救命级别的能力。跨磁盘聚合资源多块磁盘或分区可以放进同一个 VG统一调度还能随时向 VG 里加新盘扩资源池。快照机制LV 级快照可以秒级创建常用于数据库备份前的静默准备、测试环境回滚等场景比云主机整机快照轻量得多。设备更换友好如果 VG 里某块盘性能越来越差或者接近故障可以在线把数据迁移到新盘再把旧盘从 VG 里剔除业务不中断。再看短板这部分我在面试里也常被问性能有轻微损耗多一层映射必然会带来一点 IO 开销极端高 IO 场景里能感知到。不过现代硬件和内核优化下这个损耗通常不到 5%绝大多数业务可以忽略。维护复杂度上升概念多、命令多排障链路拉长。传统的 fdisk mkfs 对新手更直观LVM 则要求理解整套映射关系。某些文件系统不支持缩容xfs 可以扩不能缩这是文件系统层面的限制跟 LVM 无关但组合在一起就有点坑。规划时没想清楚后面想缩数据目录只能另起炉灶。单点隐患如果 VG 里有盘损坏又没做冗余那整个 VG 都可能受影响。LVM 本身不提供冗余要么靠 RAID 兜底要么靠备份兜底。选不选 LVM我的建议很直接只要是新建服务器、有持续写入的业务数据一律上 LVM。桌面简单环境也值得。它带来的灵活性远远大于那点复杂度。唯一不太适合的场景是极简的单盘嵌入式环境空间资源本来就固定用 LVM 反而多余。3. LVM 实操全流程从创建到扩容的完整记录3.1 从零开始搭建一套 LVM 环境以一个干净测试环境为例目标是把一块 20G 的新盘 /dev/sdb 做成 LVM挂到 /data 目录。第一步先分区。执行 fdisk /dev/sdb交互顺序我写在这里照着敲就行fdisk /dev/sdb # n 新建分区 → p 主分区 → 1 分区号 → 两次回车使用默认起止扇区 # t → 8e 设置分区类型为 Linux LVM # w 写盘第二步创建 PV、VG、LVpvcreate /dev/sdb1 vgcreate vg_data /dev/sdb1 lvcreate -L 10G -n lv_data vg_data第三条命令的解释-L 10G 表示逻辑卷大小 10G-n lv_data 是逻辑卷名字最后的 vg_data 指明从哪个卷组分配资源。如果要一次性占满卷组剩余空间也可以写成 -l 100%FREE。第三步格式化并挂载mkfs.xfs /dev/vg_data/lv_data mkdir -p /data mount /dev/vg_data/lv_data /data第四步写入 /etc/fstab 实现开机自动挂载。这里特别强调一定别写 /dev/sdb1 这种设备名。为什么因为磁盘在系统重启后可能改名比如新插一块盘后 /dev/sdb 变成了 /dev/sdc原有挂载就会失效。LVM 设备名比较稳定但更稳的还是用 UUID。执行 blkid /dev/vg_data/lv_data 看到 UUID 后在 /etc/fstab 里按这个格式写入# 注意实际 UUID 以 blkid 输出为准 UUIDxxxx-xxxx /data xfs defaults 0 0如果不想查 UUID也可以直接写设备路径 /dev/mapper/vg_data-lv_data它同样是稳定路径很多发行版默认就是用它。3.2 磁盘快满了怎么办在线扩容实战扩容是 LVM 用得最频繁的高级操作分两种情况处理。情况一卷组里还有空闲空间。先看 vgs 输出里的 VFree 列有剩余就说明不需要新增物理盘。这时直接执行lvextend -L 5G /dev/vg_data/lv_data然后根据文件系统类型执行后续步骤。如果是 ext4resize2fs /dev/vg_data/lv_data如果是 xfsxfs_growfs /data注意 resize2fs 后面跟的是逻辑卷设备xfs_growfs 后面跟的是挂载点。这个区别我见过太多人搞混了。resize2fs 对 ext4 可以离线也可以在线xfs_growfs 则必须在挂载状态下执行因为它读取的是挂载点信息。情况二卷组里也没有空闲空间了这就得往 VG 里补充容量。插上一块新盘 /dev/sdc执行pvcreate /dev/sdc vgextend vg_data /dev/sdc lvextend -l 100%FREE /dev/vg_data/lv_data xfs_growfs /data一套操作下来文件系统就扩大到了整块卷组的容量业务全程无感知。我自己的习惯是扩完 LV 之后、扩展文件系统之前先执行 lvs 和 vgs 各看一眼确认新容量确实生效再做文件系统扩展。因为如果 lvextend 因为某种原因没成功后面 resize2fs 或 xfs_growfs 自然也不会有反应容易让人产生命令失效的错觉其实是第一步就没过。3.3 缩容、迁移与删除的正确姿势扩容讲多了缩容不能不讲。缩容比扩容危险得多核心原则只有一个先缩文件系统再缩逻辑卷顺序绝对不能反。ext4 的缩容流程如下umount /data e2fsck -f /dev/vg_data/lv_data # 先强制检查不检查不让缩 resize2fs /dev/vg_data/lv_data 8G # 先缩文件系统 lvreduce -L 8G /dev/vg_data/lv_data # 再缩逻辑卷 mount -a如果你先 lvreduce 缩小了逻辑卷文件系统还占着原来那么大数据会直接损坏。而有缩容需求的场景里 90% 都是数据盘务必先备份再操作。xfs 根本不能缩容想缩小 xfs 的 LV唯一靠谱的路径是备份数据 → 删除 LV → 重建 LV → 恢复数据。所以在初次规划 xfs 的 LV 大小时宁可给大一点也别指望以后能缩。迁移的场景比如 VG 里 A 盘是慢速机械盘B 盘是 SSD想把 A 盘的数据全部移到 B 盘命令非常清爽pvmove /dev/sda /dev/sdb这条命令会持续地把 PV 上的数据挨个迁移到目标 PV迁移完成后再 pvremove /dev/sda就能把老盘从 VG 里摘除了。整个过程不用停业务执行前最好先 pvs 确认目标盘有余量。删除的流程也值得记一下先 lvremove 删掉逻辑卷再 vgremove 删掉卷组最后 pvremove 清理物理卷标记。删逻辑卷时命令会二次确认因为真的不可恢复手滑的话哭都来不及。4. 重装系统与数据盘迁移中的 LVM 处理方案4.1 云电脑/虚拟机的数据盘规划思路现在的云电脑、云服务器、虚拟机场景中常见做法是系统盘和数据盘分离。系统盘放操作系统想重装就重装不心疼数据盘独立挂载保存业务数据。在这种架构里数据盘往往也会被做成 LVM好处是以后加盘、扩容都方便。规划的第一件事是用 LVM 时尽量保持卷组名称的全局唯一性。比如服务器叫 web01数据盘卷组就叫 vg_web01别图省事全叫 vg_data。因为将来如果有多台机器、多块数据盘临时挂在一起排障重名卷组会带来识别困难。在磁盘上做标记的耐心往往会在关键时刻救你一命。第二件事数据盘上要建文件系统、要挂载目录这些信息最好写进一个独立的文档里记录 PV、VG、LV 的对应关系。别嫌麻烦几个月后重装系统时你会感谢当初的笔记。我见过太多同事重装系统后对着 lsblk 的输出一脸茫然完全想不起来哪个卷组对应哪个目录靠笔记能省下大量排查时间。4.2 重装系统前必须做的卸载流程这是我在云电脑场景里踩过一次深刻坑之后总结出来的铁律如果数据盘已经被 LVM 接管重装系统之前一定要先把逻辑卷卸载并停用卷组。否则重装后的新系统在扫描磁盘时会看到一块带着旧 LVM 元数据的数据盘轻则系统识别紊乱重则新旧系统对同一块 PV 的元数据产生冲突数据盘会被标记为 foreign 状态恢复起来非常折腾。完整流程如下假设数据盘挂载在 /data卷组名 vg_data# 第一步确保没有进程还在使用挂载点 lsof /data # 第二步卸载文件系统 umount /data # 第三步停用卷组让内核不再激活该卷组 vgchange -an vg_data # 第四步确认 PV 状态看清各物理卷在哪个卷组下 pvscan执行完前三步之后在云电脑或虚拟机控制台里对数据盘做卸载/分离操作这样重装系统时数据盘不会被系统盘安装过程误操作。如果你的云电脑支持在重装时保留数据盘那么把数据盘分离后重装、再重新挂载是更安全的路径。为什么要先 vgchange -an因为 vgchange -an 会停止卷组内所有逻辑卷的映射相当于让数据盘在 LVM 层面进入休眠。此时再分离磁盘底层元数据就不会被操作系统继续写入或改写。有些新手直接 umount 就以为万事大吉了其实卷组还处于激活状态控制台强拆数据盘反而可能留下不一致的元数据后续恢复会非常痛苦。4.3 重装之后如何快速恢复数据盘重装完系统、把数据盘重新挂回虚拟机后第一次会遇到的典型现象是lsblk 能看到磁盘但 /dev/vg_data/lv_data 不存在。这是正常的因为新系统还没有导入这块盘上的卷组信息。恢复步骤# 1. 扫描物理卷新挂载的盘会被标记为 foreign因为不属于当前主机 pvscan # 2. 如果提示 foreign需要先导入卷组 vgimport vg_data # 或者用 vgscan vgimport 的组合 vgscan vgimport vg_data # 3. 激活卷组 vgchange -ay vg_data # 4. 确认逻辑卷出现后直接挂载注意是挂 LV不是挂 PV mount /dev/vg_data/lv_data /data做完这些以后数据盘上的文件应该完整回归。最后再回到 /etc/fstab 里补上自动挂载条目。如果留下了之前规划文档里的 UUID直接写进去就行没留的话重新 blkid 看一眼再写。这里要特别提醒恢复过程中如果看到类似 Found volume group vg_data using metadata type lvm2 的提示说明系统检测到了卷组但还没导入千万别急着去 pvcreate 强制重建 PV那会把原有元数据覆盖。正确的动作永远是 vgimport 或 vgscan 去识别而不是重建。5. 常见问题排查与多年运维心得5.1 重启后卷组不激活逻辑卷设备不存在现象系统启动后df -h 里看不到 /data登录后 /dev/vg_data/lv_data 也不存在但 lsblk 能看到磁盘。这种八成是 LVM 服务启动时没有成功激活卷组。第一步跑 vgs 看卷组是否存在如果显示有卷组再执行 vgchange -ay 手动激活激活后再 lvs 确认逻辑卷出现mount -a 挂载。如果 vgs 压根看不到卷组就要检查 /etc/lvm/lvm.conf 里的 filter 配置。lvm.conf 的 filter 一项决定了系统扫描哪些设备很多人调过设备过滤器之后忘了放行新盘导致 LVM 服务根本不去扫这块 PV。日常运维时我还会定期备份 LVM 元数据执行 vgcfgbackup vg_data会把卷组配置存到 /etc/lvm/backup 下。万一哪天真把卷组信息搞丢了用 vgcfgrestore 能救回来。这个操作成本极低但很多人不知道属于典型的“教了才记得”的知识点。5.2 扩容不生效的典型场景扩容命令跑完了df -h 一看还是老容量这个问题几乎每个 LVM 新手都遇到过。原因基本就三类。第一文件系统类型没选对命令。ext4 用 resize2fsxfs 必须用 xfs_growfs。在 xfs 上执行 resize2fs 会直接报错但很多人没看报错就忽略过去了。第二lvextend 之后忘了刷新文件系统。这不怪命令不生效而是你跳过了必要步骤。第三卷组空闲空间不足。lvextend 已经敲了但实际上报错这类情况需要先 vgs 看 VFree 列如果是 0就得先新增 PV 加进 VG再扩。我的建议是把 lvextend 之后、文件系统扩展之前一直保持 lvs 快速核对容量的习惯。只要容量确实变大后面再执行对应文件系统命令基本一次成功。5.3 面试考点与新人常踩的坑我带人或者面试时常年盘问 LVM 的几件事新人可以参考着自查。创建 LVM 的完整步骤是什么答不出 pvcreate → vgcreate → lvcreate → mkfs → mount 的顺序基本不行。扩容 XFS 文件系统用什么命令xfs_growfs不是 resize2fs。PE 大小对性能有影响吗有但日常场景选默认 4MB 即可。太小会导致元数据膨胀和映射开销大太大在分配小块空间时浪费空间。了解概念比死背数字重要。快照有什么用、怎么恢复lvcreate -s 创建快照它记录的是区块变化不是全量数据可用于跨时间点回滚。但快照空间耗尽会导致快照失效创建时别抠门。至于新人常踩的坑我最常说的一句是不要在没备份的情况下对着生产盘尝试 lvremove、pvremove 这类删除命令。LVM 命令敲错往往没有后悔药错了就是数据没了。在测试环境里怎么折腾都行但上了生产环境第一件事一定是备份。另外还有一个细节fstab 里挂载顺序很关键。如果一行里的挂载点依赖另一个挂载点要合理排序。LVM 设备本身比较稳定但如果同时挂载了系统盘的 LV 和数据盘的 LV开机时 LVM 服务先于 fstab 激活基本没问题。真遇到开机后挂载失败第一反应跑 systemctl restart lvm2-lvmetad 或者 vgchange -ay大概率能救回来。最后聊点个人的真实体会。LVM 是我在 Linux 存储这一块最早系统性研究的内容原因是它真的救过我太多次。比如某个深夜数据库目录眼看就要写满我一边安抚业务方一边执行 lvextend 加 xfs_growfs十分钟内解决问题那种踏实感比任何面试成绩都真实。如果你也正在为磁盘扩容发愁建议别犹豫尽快在测试环境把 LVM 从创建到扩容完整走一遍再去生产机上实践。熟练之后你会发现那些看起来高深的存储问题其实都是纸老虎。
返回列表