ARTICLE DETAIL

资讯详情

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

Linux磁盘管理与LVM实战:从分区到在线扩容与快照

Linux磁盘管理与LVM实战:从分区到在线扩容与快照 1. 磁盘管理与LVM运维绕不开的那道坎只要是跟Linux打过交道的不管你是刚入职的运维新人还是已经管理过几十台服务器的老手磁盘这个话题早晚都会找上门来。新服务器上线要给磁盘分区、业务日志把根分区撑满了要紧急扩容、数据库目录增长太快需要重新规划存储——这些事情我估计每个人都遇到过。而在所有的存储管理方案里LVMLogical Volume Manager逻辑卷管理器是Linux运维中最值得掌握的核心工具之一它最大的价值就是让存储从“静态”变成“动态”不必卸载分区、不必重新格式化系统在正常运行的状态下就能完成卷的扩容、缩容、迁移和快照。这篇文章我会从磁盘分区基础讲起逐步深入到LVM的架构、实操流程最后再聊聊我自己踩过的一些坑和排查方法。无论你是刚开始接触Linux的小白还是已经被“磁盘满了”吓过几次的同行这篇文章应该都能给你一些参考。2. 磁盘管理基础分区、文件系统与设备命名2.1 理解Linux设备命名sda、nvme0n1还是vda我记得第一次接触Linux磁盘的时候最大的困惑就是设备名怎么这么乱。其实搞清楚规律之后并不复杂。传统SATA、SCSI接口的硬盘在Linux里通常命名为/dev/sda、/dev/sdb这样的形式字母a、b、c对应的是磁盘的物理顺序。NVMe固态硬盘则命名为/dev/nvme0n1这种格式其中nvme0表示第一个NVMe控制器也就是第一个插槽n1表示该控制器下的第1个命名空间也就是第1块盘。而在云服务器上虚拟磁盘往往显示为/dev/vda或/dev/xvda这个v和x表示不同的虚拟化驱动类型。系统里查看磁盘信息最常用的命令组合是lsblk fdisk -l df -hTlsblk以树状结构显示磁盘和分区的关系一眼就能看出哪块盘分了几区、哪块盘还没挂载。fdisk -l显示的是底层分区表的详细信息包括分区起始扇区、大小、类型。df -hT则是查看已挂载文件系统的使用率、挂载点和文件系统类型。有个细节值得注意设备名并不是一成不变的。在部分系统里如果硬件枚举顺序发生变化/dev/sda可能变成/dev/sdb而这种变化会导致依赖设备名挂载的配置直接失效。所以现在的系统都推荐使用UUID文件系统通用唯一标识符或PARTUUID来指代分区这个后面会详细讲。2.2 分区表选择MBR还是GPT这块是很多人容易忽略的“老古董”问题。MBR主引导记录是老式分区表格式最大只能支持2TB的磁盘而且最多只能有4个主分区可以通过扩展分区和逻辑分区绕开这个限制但管理上很麻烦。GPTGUID分区表是新一代标准能支持128个分区单个磁盘容量可达EB级别还带了CRC校验来保证分区表完整性。现在的实操建议非常明确2025年的今天任何新磁盘都直接使用GPT分区表。哪怕是100GB的小盘也建议用GPT。原因不只是容量上限GPT在数据安全性和灵活性上都优于MBR。只有当你要兼容特别老的系统、或者做某些特定嵌入式引导场景时才需要回到MBR。使用parted工具可以查看和切换分区表格式parted /dev/sdb print parted /dev/sdb mklabel gpt这两条命令第一条查看当前分区表信息第二条把目标盘格式化为GPT格式。注意第二条命令会清空磁盘原有分区表操作前一定要确认盘符选对了我不止一次见过同事把数据盘当成空盘重新格式化抢救数据的痛苦过程实在不想再经历第二次。2.3 文件系统怎么选ext4、xfs还是其他分区只是划土地文件系统才是真正在上面建房子。Linux下主流的文件系统无非是ext4、xfs、btrfs另外还有面向特殊场景的zfs和面向非Linux生态的ntfs需要额外驱动支持。文件系统最大文件最大卷日志机制适用场景ext416TB1EB标准日志通用兼容性最好xfs8EB8EB元数据日志大文件、高性能场景btrfs16EB16EB写时复制需要快照、压缩等高级特性就我的实际经验来说CentOS/RHEL系列的默认文件系统现在是xfsUbuntu/Debian默认是ext4。7.x版本的RHEL把xfs作为默认选择之后xfs在大文件和高并发写入场景下表现确实更稳。有一点需要特别记住xfs文件系统不能直接缩容它的在线缩容功能直到现在也没有完全成熟。所以如果你规划了一个xfs的逻辑卷后面又觉得空间给多了想缩小那会很痛苦。而ext4在离线状态下可以缩小使用resize2fs但操作风险高必须备份。这个差异在做LVM规划的时候要提前想清楚。2.4 分区实操fdisk还是parted传统的MBR分区我用fdiskGPT分区推荐用parted。举例来说在一块新添加的100GB数据盘/dev/sdb上创建两个分区逻辑是这样的parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary ext4 1MiB 50GiB parted /dev/sdb mkpart primary ext4 50GiB 100GiB parted /dev/sdb print第一条命令设置分区表为GPT第二条创建第一个分区从1MiB开始到50GiB结束第三条创建第二个分区。至于为什么从1MiB开始而不是从0开始是因为现代磁盘的扇区大小为512B或4096B保留一部分空间给分区对齐可以避免读写性能损失尤其是使用SSD的时候不对齐的代价非常明显。分区创建完成后还需要让内核重新读取分区表partprobe /dev/sdb这个命令比重启服务器靠谱。当然如果你创建的是磁盘的第一个分区有些云平台环境可能还要额外注意是否已经挂载了某些自动化脚本。不过说句实在话现在我在大多数场景下已经很少手动做分区了——因为LVM可以直接把整块物理磁盘作为物理卷分区这一步在某种程度上可以省掉。但了解分区表机制依然重要因为很多服务器BIOS引导、云盘初始化仍需要涉及分区操作这也为理解LVM打好了基础。3. LVM核心概念PV、VG、LV、PE层层拆解3.1 LVM的架构层次从物理卷到逻辑卷LVM解决的核心问题一句话就能概括把多个物理磁盘的空间融合成一个“空间池”再从这个池子里灵活切出任意大小的逻辑卷给系统使用。它的架构分四层PVPhysical Volume物理卷就是经过LVM初始化后的物理磁盘或分区。你可以把整块盘sda做成一个PV也可以把一个分区sdb1做成PV。VGVolume Group卷组一个或多个PV组成VG。VG就是那个“空间池”。所有PV的空间加起来就是VG的总容量。LVLogical Volume逻辑卷从VG中划分出来的逻辑空间LV格式化文件系统之后就可以挂载使用相当于传统意义上的“分区”。PEPhysical Extent物理扩展块VG分配空间的最小单位默认大小是4MiB。可以理解为LVM的“内存页”。用通俗的话来说PV是砖头VG是盖好的仓库LV是仓库里划分出来的隔间PE则是每一块砖头的标准尺寸。理解这层的价值在于传统分区方案中一个分区的大小在创建时就固定死了想调整空间要么重新分区、要么换更大的硬盘再迁移数据。而LVM中LV是在VG这个“空间池”里动态划出来的你只需要往VG里增加PV或者从VG中移除PV就能调节LV的大小全程不需要卸载挂载点。3.2 PE和LE卷组里的“最小砖块”PE前面说了是PV层面的物理扩展块。严格来说还有对应LV层面的逻辑扩展块LELogical Extent。PE和LE是一一对应的LV的大小实际上就是LE的数量乘以PE大小。PE大小默认4MiB但这并不是北斗、定死的值。在有特殊需求的时候比如很多个超大容量的PV组成海量VG可以适当调大PE。PE的大小决定了一个VG能划分出的LV数量和最大容量仍然以4MiB为例一个PE的容量是4MiBVG最多支持65534个PE所以单个LV最大容量大约是4MiB × 65534 ≈ 256GiB。如果你的LV要超过256GiB就需要创建VG时用-s 16M甚至更大的PE值。当然现代LVM2已经支持更大的PE索引这个限制在大多数场景下不是问题但理解PE的存在能帮助你更清晰地解释LVM的空间计算。3.3 为什么用LVM与传统分区方案对比为了让不看技术文档的读者也能快速理解我做一个类比传统分区就像把一个小区划成固定地块每块地只能盖固定的房子户型大小从建设之初就定死了后改成特别困难。LVM就像是先建了一栋共享的大楼每个住户的房间面积可以根据人数灵活调整甚至可以拆掉隔墙重新划分——而且住户不用搬出去就能改。从运维角度我把传统方案和LVM方案的差异总结成下表维度传统分区LVM扩容需要卸载分区、重建分区、恢复数据在线扩展LV几分钟搞定缩容非常困难需要备份支持ext4可离线缩xfs不建议跨盘一个分区只能在一块盘上LV可跨多块PV空间可聚合快照无原生支持LVM快照非常方便迁移需停机拷贝可用pvmove在线迁移数据当然LVM也不是没有缺点。它的文件系统多了一层映射机制理论上有轻微性能损耗不过在做企业级存储的这些年里我实测下来这层损耗在绝大多数业务场景中可以忽略不计。另外LVM的元数据如果损坏恢复起来比传统分区麻烦所以建议对/etc/lvm/backup下的备份文件也要有定期保存的习惯。4. LVM实操全流程从初始化到扩容迁移4.1 创建PV、VG和LV从一块裸盘到可用逻辑卷假设服务器新增了两块物理磁盘/dev/sdc和/dev/sdd都是200GB我们想把这些空间整合成一个300GB的逻辑卷。实操命令如下pvcreate /dev/sdc /dev/sdd vgcreate vg_data /dev/sdc /dev/sdd lvcreate -n lv_data -L 300G vg_data第一条命令把两块盘初始化成物理卷第二条命令创建名为vg_data的卷组并把两块盘的PV加入到这个卷组中第三条命令在卷组中创建一个300GB的逻辑卷名字叫lv_data。执行vgdisplay可以看到卷组总容量约400GB200200可用空间约100GB。这里有个细节如果两块盘型号不一致例如一块SSD一块机械盘把它们放在同一个VG里其实是不太推荐的因为LVM不会区分底层盘的性能差异数据会按PE均匀分布在两块盘上机械盘会成为性能瓶颈。建议的做法是性能相近的盘放一个VG或者用pvcreate的时候指定--dataalignment参数但这个参数对于纯新手上手阶段不需要过多关注。4.2 格式化、挂载并设置开机自动挂载LV创建好之后它就像一个块设备在/dev/mapper/目录下能看到对应设备文件。接下来格式化、挂载mkfs.xfs /dev/mapper/vg_data-lv_data mkdir -p /data mount /dev/mapper/vg_data-lv_data /data为了开机自动挂载需要把挂载信息写入/etc/fstab。这里我强烈建议使用UUID而不是设备路径因为LVM设备路径在系统重启之后可能发生偏移尤其是多个VG重名或者扫描顺序改变时。获取UUID用命令blkid /dev/mapper/vg_data-lv_data然后在/etc/fstab中追加一行UUID你的uuid值 /data xfs defaults 0 0写好之后建议立刻验证一下mount -a df -hT /datamount -a会重新读取fstab并挂载所有未挂载的条目。如果这条命令把/data挂载成功了说明fstab配置没问题。千万别直接在fstab里写完就重启万一写错了会导致系统无法正常启动这个坑我年轻时踩过不止一次。4.3 LV扩容最频繁使用的LVM操作业务数据涨得永远比预期快。今天刚规划好的100GB逻辑卷三个月后就报警了。这个时候LVM的优势就体现出来了。扩容的步骤是先扩展LV大小再扩展文件系统大小。如果VG中有空闲空间直接扩展LVlvextend -L 50G /dev/mapper/vg_data-lv_data这两步扩展的方式有两种。一种是用resize2fsext4或xfs_growfsxfs扩展文件系统。CentOS/RHEL 7之后的版本很多发行版支持在lvextend后执行一条命令自动扩容文件系统lvextend -r -L 50G /dev/mapper/vg_data-lv_data-r选项就是“扩容LV时自动同步扩展文件系统”这个选项强烈推荐使用能避免忘了执行文件系统扩容导致的空间浪费。如果VG空间不足就需要先添加新的物理磁盘到VG里再扩展LVpvcreate /dev/sde vgextend vg_data /dev/sde lvextend -r -L 50G /dev/mapper/vg_data-lv_data这套组合拳会让总空间增长业务进程完全不需要重启。在线扩容对于7×24小时业务来说意义重大这也是LVM最吸引人的地方之一。4.4 LV缩容高风险操作能不动就不动如果说扩容是LVM最舒服的操作那么缩容就是最危险的动作之一。尤其是xfs文件系统前面已经说过它不支持缩容所以你的LV如果是xfs想缩容只能备份数据后重建LV和文件系统。ext4虽然支持离线缩容但步骤繁琐且一旦断电或者操作失误数据可能全丢。缩容ext4逻辑卷的标准步骤是umount /data e2fsck -f /dev/mapper/vg_data-lv_data resize2fs /dev/mapper/vg_data-lv_data 250G lvreduce -L 250G /dev/mapper/vg_data-lv_data mount /data第一步先卸载文件系统这是必须的在线缩容ext4大概率会损坏数据。第二步用e2fsck -f做强制完整检查确保文件系统没有错误。第三步把文件系统缩小到250GB第四步把LV也缩小到250GB。大小顺序一定不能反先缩文件系统再缩LV如果反过来LV比文件系统还小那文件系统的数据就直接损坏了。我的个人建议是生产环境的LV尽量不要缩容。空间给多了就留着当缓冲或者重新规划新的逻辑卷再迁移数据。缩容的操作收益太低、风险太高不值得为了省那几十GB空间去挑战它。4.5 快照LVM的隐藏技能LVM快照是我在实际工作中用得最多的“后悔药”。它的原理是写时复制Copy-on-Write创建快照时系统不会立即把整个LV拷贝一份而是记录一个时间点的元数据之后每当源LV有数据块要修改时先把原始数据拷贝到快照空间再覆盖写。创建快照的命令lvcreate -s -n snap_data -L 10G /dev/mapper/vg_data-lv_data这条命令为lv_data创建名为snap_data的快照快照空间分配10GB。快照创建时要求VG有足够的空闲空间。日常使用场景最典型的是数据库备份前打快照、然后基于快照进行备份避免直接在线拷贝数据文件的不一致性。还可以基于快照恢复误删的文件mkdir -p /mnt/snap mount /dev/mapper/vg_data-snap_data /mnt/snap # 在 /mnt/snap 中找到需要的文件并拷贝回去 umount /mnt/snap lvremove /dev/mapper/vg_data-snap_data每次用完快照记得lvremove删除否则快照空间一旦被写满快照就会失效。这点非常关键我遇到过同事打了一个快照忘记删除过了一个月快照空间满了源LV的写入变得异常缓慢排查了大半天才找到症结。4.6 pvmove在线迁移数据VG里的某一个PV对应的物理磁盘如果出现早期坏道或者想用一块更大、更快的盘替换掉旧盘pvmove可以让你在不停止业务的情况下把数据从旧盘迁移到新盘pvcreate /dev/sdf vgextend vg_data /dev/sdf pvmove /dev/sdd /dev/sdf vgreduce vg_data /dev/sdd pvremove /dev/sdd这段操作的逻辑是新盘/dev/sdf加入卷组然后pvmove把旧盘/dev/sdd上的所有PE搬到新盘迁移完成后从VG中移除旧盘最后彻底移除旧盘的PV标记。旧物理盘就可以拔掉或者重新使用了。迁移过程可以实时监控进度在另一终端执行pvmove -i 5就会每5秒打印一次进度。5. 常见问题与排查实录5.1 “No space left on device”但df显示还有空间这是经典问题之一。你的df -h显示分区用了60%但写入文件时提示磁盘已满。绝大多数情况是inode耗尽了。Linux文件系统里每个文件对应一个inode索引节点inode数量在mkfs时就已经确定。小文件特别多的业务比如邮件服务器、缓存目录、docker overlay目录会快速耗尽inode。排查方法df -i /data如果IUsed接近IFree那基本就是inode满的问题。解决办法有两个方向一是清理无用的小文件二是换用btrfs或xfs这类支持动态inode分配的文件系统。后者才是根本解法xfs和btrfs不再有固定inode数量的限制可以按需分配。5.2 VG里的某块PV故障了数据还能救吗磁盘硬件故障导致PV丢失这是存储管理员最头疼的事。如果丢失的PV上恰好没有数据非镜像状态那只能自认倒霉LVM并不能在无冗余的情况下保证数据安全。但如果两个PV配置了镜像lvcreate -m1那么故障PV上的镜像副本会自动切换到正常PV业务基本无感。检查VG状态的命令是vgdisplay -v vg_data能看到“partial”这种关键字表示VG中有PV处于离线状态。此时执行vgreduce --removemissing vg_data可以把缺失PV从VG中移除再补充一块新盘到VG中恢复容量。如果你的LV是以普通线性方式创建的没有镜像缺失PV数据段无法恢复只能从备份中还原数据。这里必须强调一个原则LVM本身不是数据安全方案冗余和备份才是。所有涉及关键数据的LV都应该有对应的备份策略LVM的灵活性只是方便你管理空间数据安全还得靠自己守住备份底线。5.3 挂载失败UUID变了还是fstab写错了重启之后系统起不来提示找不到某个文件系统——这种情况多半是fstab里的设备标识写错了或者是LV激活顺序不对。LVM的设备在系统启动早期由lvm2-lvmetad服务负责扫描和激活如果服务启动失败或者VG名冲突/dev/mapper/xxx就不会按时出现。这时不要慌。在紧急模式下执行vgscan --mknodes vgchange -ay mount -avgscan --mknodes重新扫描并创建设备节点vgchange -ay激活所有VG最后mount -a把所有文件系统挂载到位。然后检查fstab中的UUID是否和blkid输出一致确认无误后再重启验证。5.4 快照空间写满导致源文件系统阻塞前面的内容提过快照空间用满会让快照失效。更隐蔽的是源LV在快照空间耗尽之后写入会直接报错业务停顿。排查手段是lvdisplay查看快照的Allocated to snapshot是否接近100%。解法就是提前规划好快照的使用周期和空间。如果你只是做备份前的短暂快照那么10GB绰绰有余如果要做比较长时间的数据比对分析建议分配快照大小等于源LV空间的10%~15%并配合定时任务自动删除过期快照。到这里磁盘管理与LVM的精髓部分已经基本讲完了。每次我在生产环境执行LVM操作的时候心里还是会默念一遍“先备份、再看盘符、再动手”。这三步的顺序一个都不能少。LVM确实是个好工具它让我从一个被磁盘空间折磨的加班运维变成了能笑着说“扩容要什么停机”的人。如果你在实操中遇到了什么奇怪的存储问题也欢迎认真翻一翻/var/log/messages很多答案其实系统早就告诉你了。
返回列表