ARTICLE DETAIL

资讯详情

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

Linux磁盘管理:LVM解决磁盘满与分区扩容实战

Linux磁盘管理:LVM解决磁盘满与分区扩容实战 干运维这些年我接到过最多的求助就是“磁盘满了”和“分区不够用”。一说Linux很多新人第一反应就是敲命令、装软件但真正上了服务器最先被现实教育的往往是磁盘管理。无论是虚拟机里的一块数据盘还是物理机上的一组RAID跑着跑着空间不够了、扩容不会搞、重启后卷组不见了这些场景我全都经历过而且每一次都跟LVM脱不开关系。所以这篇东西我不打算写成命令手册而是按我自己从实际项目中趟出来的路线把Linux下的磁盘管理、分区、文件系统以及LVM这套“可动态调整”的存储方案从头到尾拆一遍。你会看到它到底解决了什么问题、有哪些坑、怎么从零搭一套LVM、怎么在云电脑和国产系统上安全扩容和卸载数据盘。适合刚接触服务器的运维新人也适合那些手里有机器但不敢乱动分区、怕把数据搞没的朋友。1. 磁盘管理到底在管什么1.1 从一次“磁盘满”事故说起之前接手过一台内部服务器跑着监控服务日志增长速度远超预期。一开始只是df -h看着/的使用率到了82%想着还能顶一阵结果第三天早上服务直接告警ssh能连但用户程序全在报“No space left on device”。我上去一看根分区已经100%但旁边还有一块2TB的数据盘几乎是空的。为什么不用因为业务日志目录写的是绝对路径全在系统盘上扩容又不敢随意操作只能手动清理。那时候我就意识到一个事磁盘管理不是“插上盘就能用”这么简单它涉及从设备识别、分区规划、文件系统选择到挂载策略的一整条链路。这块做不好后续所有操作都是在给事故埋雷。1.2 先搞懂磁盘、分区、文件系统的关系很多人把“磁盘”和“分区”混在一起说但在Linux里这是三层完全不同的概念。磁盘是物理设备比如/dev/sda、/dev/vda分区是在磁盘上划出来的地址段比如/dev/sda1文件系统是分区之上用于组织数据的格式比如xfs、ext4。我们平时df -h看到的是文件系统的空间fdisk -l看到的是磁盘和分区的布局lsblk则把这几层关系按树状结构展示出来。理解这个分层非常重要。我做培训时最爱打的比方是磁盘是一套毛坯房分区是把房间隔成客厅、卧室文件系统则是你在每个房间里订制的收纳柜。收纳柜再满也不能直接拆墙反过来墙再结实收纳柜规划不合理照样住得不舒服。Linux里对应一句话一切皆文件但文件的落地位置由文件系统管理文件系统的边界由分区决定分区的边界又受限于物理磁盘。任何一层操作失误轻则目录挂不上重则整块盘数据不可读。1.3 第一步该做的盘点现状拿到任何一台新服务器我建议第一件事不是想着扩还是缩而是先盘点。我常规会敲这么几个命令lsblk df -hT fdisk -l blkid pvs vgs lvslsblk看拓扑能一眼看出哪些盘做了分区、哪些盘还在裸奔df -hT看挂载情况顺便知道每个已用文件系统的格式因为xfs和ext4在“能不能缩容”这件事上差别很大fdisk -l适合看全盘信息和有没有GPT或MBR分区表blkid记录UUID和文件系统类型写/etc/fstab时离不开它。一旦输出里出现了pvscan、vgscan能认出来的设备说明这台机器已经用了LVM后面所有操作就得按LVM的规矩来。这里有个经验不要迷信“服务器自动就是最合理的布局”。很多云镜像默认把系统盘整个分给根分区数据盘却完全没初始化也有的机器做了LVM但没考虑后续扩容路径卷组里只剩一个小PV。先花两分钟看清现状比事后再去恢复数据划算得多。2. 为什么要选 LVM以及它的代价2.1 LVM 的立身之本LVM 的全称是 Logical Volume Manager逻辑卷管理。它的核心思路是把物理磁盘从“直接划分固定分区”的思维中解放出来中间加一层逻辑抽象。物理磁盘可以做成物理卷PV多个PV汇聚成卷组VG再从VG里按需求切出逻辑卷LV。应用看到的只是LV至于LV底层到底落在哪块物理盘、由几个盘拼起来应用完全不关心。这个抽象带来的最大好处就是“动态”。传统分区一旦建好想扩大就得用growpart之类的工具去操作分区表能不能扩还要看分区后面有没有空闲区域而LVM里只要VG还有剩余空间lvextend一条命令就能在线扩容底层根本不用动分区表。反过来如果一块数据盘空间不够了你可以再加一块物理盘把它并入VG原有LV无需迁移就能用上新增空间。这种“拼积木”式的体验是运维为什么偏爱LVM的最直接原因。2.2 优缺点对照我整理过一张对照表每次给别人介绍LVM都会拿出来用维度LVM 的优势LVM 的代价扩容在线扩展LV业务无感知需要预留VG空间规划不当时仍要加盘缩容ext4等文件系统可以缩小LVxfs不支持缩容且缩容风险极高磁盘利用率多个PV可以聚合突破单盘容量限制元数据占少量空间管理复杂度增加灵活性支持在线迁移、快照、thin provisioning快照和精简配置需要额外学习成本故障恢复卷组级管理数据盘解绑相对清晰误删除VG或卷组激活异常恢复更麻烦性能多数场景下性能损耗可忽略极高压力的IO场景下逻辑层会引入轻微开销这张表不是劝你所有机器都必须上LVM。如果只是一块独立数据盘、固定用途、永远不扩容那么传统分区也够用还更简单。但只要你有一点点“以后可能要扩容”“可能要跨盘合并”的念头LVM就是更值得的选择。我实际接手的机器里凡是给数据库、日志、备份这类“空间增长不可预测”的目录几乎都会建议用LVM兜底。2.3 LVM 的组成要素LVM的术语不难理解PV是物理卷可以是一块完整的磁盘也可以是一个分区VG是卷组把多个PV的空间合并为一个资源池LV是逻辑卷从资源池里切割出来格式化和挂载后就是系统里看到的一个“分区”。中间还有个单位为PE的分配粒度相当于LVM的最小分配单元默认4MB。你不需要频繁调PE大小但知道它的存在看到pvdisplay里的PE信息就不会懵。判断机器是否已经启用LVM最快的办法是lsblk /dev/sdb pvdisplay vgdisplay lvdisplay如果lsblk输出里出现sdb1、然后在上一层看到vg_data-lv_data这种名字基本就能断定这是LVM布局。此时千万不要直接把盘mkfs否则会把LVM元数据冲掉。3. 从零搭建一套 LVM 的完整流程3.1 准备物理磁盘假设你有一块新盘/dev/sdb目标是把它做成数据盘并挂载到/data。在开始前先看一下设备是否被系统识别lsblk如果没看到先确认云控制台或虚拟机设置里是否已经挂载磁盘再运行partprobe或直接重启。很多新手以为“加了盘就能看见”其实还需要让内核重新扫描总线partprobe能解决大部分“新盘没出现”的问题。接下来决定使用整块裸盘还是分区。LVM里两种方式都合法。我个人的倾向是如果是云服务器数据盘经常直接使用裸盘做PV避免分区带来的4K对齐和后续扩容麻烦如果是物理机且需要配合硬件RAID则更建议先分区再把分区类型改为8e这样目录结构更清晰后续万一要拔盘也有更强的辨识度。3.2 创建 PV、VG、LV用整块裸盘创建PVpvcreate /dev/sdb创建卷组vgcreate vg_data /dev/sdb创建逻辑卷。比如我要一个80G的卷lvcreate -L 80G -n lv_data vg_data这几条命令看起来简单但顺序不能反。建立PV相当于把裸盘“登记”进LVM建立VG相当于把登记过的盘纳入资源池建立LV则是从资源池中按需划拨空间。你可以用-l 100%FREE把VG剩余空间全部分给某个LV也可以先只分80G剩下的留给以后扩容。假设后续又加了一块/dev/sdc要扩充资源池就执行pvcreate /dev/sdc vgextend vg_data /dev/sdc这时vgdisplay里的Free空间会变大逻辑卷不需要任何重启就能拥有潜在扩容能力。3.3 格式化、挂载与开机生效LV创建之后它只是块“未格式化的裸区域”还不能直接用。常见的文件系统选择是xfs或ext4。xfs在RHEL、CentOS、麒麟这些系统里是默认优点是性能稳定、支持在线扩容ext4的优势是支持缩容但操作麻烦。我倾向于数据盘都用xfs除非你有明确的缩容需求。格式化并挂载mkfs.xfs /dev/vg_data/lv_data mkdir -p /data mount /dev/vg_data/lv_data /data但这样重启后会失效必须写进/etc/fstab。我更推荐用UUID方式挂载因为设备名在重启后可能变化。先查UUIDblkid /dev/vg_data/lv_data然后在/etc/fstab里加一行UUIDxxxxx /data xfs defaults,nofail 0 0nofail参数很重要尤其是云主机或带外部数据盘的机器。如果盘没挂上有nofail系统仍能正常启动不会卡在“等待挂载”或掉进紧急模式。写完fstab后一定不要偷懒用下面这行验证一下mount -a这个动作不会重启机器却能提前发现配置错误。否则真到了重启那一刻才发现一条错误记录把整个系统拖进emergency mode处理起来就痛苦了。4. 扩容和缩容最常用的 LVM 操作4.1 在线扩容数据盘扩容是所有LVM操作里最让人“爽”的一步。只要VG里有空闲空间扩数据盘就是两条命令的事lvextend -L 20G /dev/vg_data/lv_data xfs_growfs /data第一行扩展LV第二行让xfs文件系统使用新增空间。xfs在线扩完之后立刻df -h就能看到容量变化整个过程业务不需要停。如果是ext4步骤略有不同lvextend -L 20G /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data这里有个细节新版lvextend支持-r参数比如lvextend -r -L 20G /dev/vg_data/lv_data它会自动调用xfs_growfs或resize2fs。但我还是习惯分开执行因为自动扩容如果正好在文件系统忙碌时执行报错输出混在一起不利于排查。手动分步你能清楚知道到底是LV没变大还是文件系统没跟上。4.2 给根分区扩容的注意点很多人一上来就问“Ubuntu根分区怎么扩容”这几乎是运维后台出现频率最高的问题。根分区和独立数据盘不一样它通常不是单独一个PV而是系统安装时创建的VG里的LV。比如在Ubuntu Server默认安装里整个系统盘可能分成了/dev/sda1作为EFI分区剩余空间做成PV卷组可能是vgubuntu根分区是/dev/vgubuntu/root。扩容根分区时如果磁盘本身还有未分配的空间需要先扩展分区growpart /dev/sda 2 pvresize /dev/sda2growpart会扩展现有分区表pvresize让PV感知分区变大然后再lvextend -r -L 50G /dev/vgubuntu/root。整个过程最好在单用户模式或至少确认没有关键业务写盘的情况下操作。虚拟机场景里如果你给VMware里的Ubuntu增加了磁盘容量也要先回到客户机执行上面的流程。很多朋友在VMware里把硬盘调大了进系统一看容量没变就是漏了growpart和pvresize这两步。4.3 缩容是高危操作和扩容相比缩容才是真正考验功底的地方。xfs文件系统官方不支持缩小这一点一定要刻在脑子里。网上有些教程教你直接lvreduce -L 20G然后xfs就挂了数据全没。如果你用的是xfs唯一安全的“缩”就是从源头规划好或者把数据迁移到更小的新LV而不是在线缩减。ext4的缩容也不是毫无代价。流程大致是umount /数据目录 e2fsck -f /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data 80G lvreduce -L 80G /dev/vg_data/lv_data mount /dev/vg_data/lv_data /数据目录这中间任何一步都不能省尤其是先缩文件系统再缩LV。如果顺序反了文件系统元数据超出LV容量后果就是文件系统损坏。而且缩容前必须有备份必须停业务最好把整个VM快照打一个。我给客户做迁移时缩容永远是排在周末凌晨的操作不是因为我迷信而是真见过缩到一半断电的惨案。5. 重装系统前的 LVM 卸载与数据盘解绑5.1 为什么不能直接拔盘云电脑、云主机里最常见的LVM事故之一是系统盘和数据盘被放进了同一个VG。用户重装系统前想当然地认为“我直接注销云主机、保留数据盘就行”结果重装完开机系统找不到卷组或者数据盘在另一个系统里无法识别。原因很简单LVM的VG是一套逻辑组合数据盘虽然是独立物理盘但它带着整个VG的元数据信息。系统重装后新的系统如果也初始化了LVM或者修改了VG名旧逻辑卷就可能找不到了。所以热词里那句“如果云电脑使用了LVM并加入了数据盘用户在重装前需要先从LVM卸”我特别认同。这里的“卸”不是简单地从Linux卸载挂载点而是把数据盘从VG的拓扑里安全解绑让它的LVM元数据不再和系统盘发生关系。5.2 正确解绑流程下面是一套我常用的安全解绑流程前提是数据盘内的数据需要保留且你打算重装后重新挂载或重新初始化LVMumount /数据挂载点 lvchange -an /dev/vg_data/lv_data vgchange -an vg_datalvchange -an停用逻辑卷vgchange -an停用卷组。这一步等于告诉LVM这块盘上所有逻辑卷不再被使用。然后在云控制台或虚拟机平台里把数据盘从实例上解绑再执行重装。重装之后数据盘虽然还留着旧LVM元数据但它已经不属于新系统的任何VG你可以选择重新pvcreate它也可以用vgimport尝试找回原卷组。如果数据不需要保留只是想彻底清理数据盘那就用更彻底的办法umount /数据挂载点 lvremove /dev/vg_data/lv_data vgremove vg_data pvremove /dev/sdb三条命令下来LVM结构彻底消失数据盘变成一块裸盘。这个过程同样要在挂载未使用的情况下操作否则会提示“target is busy”。5.3 云场景下的实操建议在云环境里我一般会多做一个动作把/etc/fstab里的LVM挂载项全部注释掉或删掉。因为重装前解绑只是物理层面的处理但旧系统里的fstab还保留着/dev/vg_data/lv_data /data xfs defaults的记录。如果新系统使用了同一块数据盘却还没建好对应的LV启动时就会卡在“A start job is running for /data”超时然后进入紧急模式。另一个经验是在解绑前先用pvs --segments看一下数据盘上到底承载了哪些PV。很多情况下系统盘和数据盘被拼进了同一个VG数据盘的PV上只存了部分逻辑卷数据直接解绑可能会让剩余的LV数据不完整。正确做法是先用pvmove /dev/sdb把数据盘上的数据迁移到系统盘PV迁移完成后再确认pvs里数据盘已经没有任何已用PE最后才解绑。这个过程很耗时但对保数据来说极其重要。6. 国产系统上的 LVM 扩展实战6.1 麒麟 / 统信环境下的差异近年来国产操作系统用得多起来麒麟Kylin、统信UOS这类系统的底层同样是Linux内核很多命令和RHEL系相差不大。但在LVM操作上有几个细节需要注意。首先是软件包名称麒麟V10、统信UOS默认都会带LVM工具但如果是最小化安装可能缺lvm2要先装yum install -y lvm2其次是系统的默认卷组名。麒麟服务器版安装时通常会把根分区建在LVM上卷组名常见为klas或vgsys逻辑卷叫root、home不同版本可能不同。你可以直接执行vgs确认不需要靠猜。统信UOS桌面版默认可能不会启用LVM但用在服务器场景时手动创建VG的路径和通用流程完全一致没有额外门槛。6.2 手把手扩展根分区这里以一台麒麟V10虚拟机为例系统盘是/dev/sda根分区是LVM逻辑卷。我在虚拟机管理中把磁盘容量从100G调到了200G开机后先确认新空间是否可见fdisk -l /dev/sda如果Disk size已经显示200G但分区还是原来的大小说明需要扩展分区。用growpart最省事growpart /dev/sda 2注意如果系统盘的EFI分区占的是/dev/sda1根分区多半是/dev/sda2具体以lsblk为准。扩完分区让内核重新识别partprobe /dev/sda pvresize /dev/sda2接着查看卷组和逻辑卷实际大小pvs vgs lvs最后扩根分区并自动扩展文件系统。假设逻辑卷路径是/dev/klas/rootlvextend -r -L 100G /dev/klas/root-r参数会在扩展LV后自动执行xfs_growfs一步到位。此时df -h /应该能看到根分区已经变成接近200G。整个过程不需要重启机器适合在业务运行中操作但还是那句老话重大变更前建议打快照。对统信UOS的服务器版如果你手动创建了vg_data扩容路径完全相同只是卷组名和逻辑卷名换成你自己定义的。7. 常见问题与排查技巧7.1 问题速查表现象大概率原因处理思路df -h容量不变LV扩容了但文件系统没扩执行xfs_growfs /挂载点或resize2fs重启后进紧急模式fstab里挂载项失效或设备不可用开机输入root密码注释fstab对应行再修复vgscan能找到VG但vgdisplay看不到卷组未激活vgchange -ay 卷组名激活pvresize提示无法读取分区表内核还没重新读取分区partprobe或重启删除数据盘后系统起不来fstab还引用缺失LV引导到救援模式清理fstablvreduce后文件系统崩溃缩容顺序错误或文件系统不支持逐层检查恢复备份LVM设备挂载时“target is busy”有进程占用挂载点lsof D /挂载点或fuser -km /挂载点云控制台加盘后lsblk看不到设备未热插拔扫描执行echo 1 /sys/class/scsi_disk/0:0:0:0/device/rescan或重启表格之外还有个容易踩的坑新硬盘加进VG后如果LVM元数据损坏或VG UUID冲突系统会拒绝激活卷组。这时先别急着vgremove用vgcfgrestore --list 卷组名看看备份很多时候能找回上一份有效元数据。7.2 一些我踩过的坑说几个我亲身踩过、希望你别再踩的细节。第一千万别在df -h显示“使用率100%”时直接删日志文件。文件被进程占用时删除后空间并不会释放。正确做法是用lsof | grep deleted找到仍打开该文件的进程重启或让进程重开文件句柄。我见过有人把一个12G的日志文件删了但磁盘空间还是满的就是因为服务进程一直没退出。第二lvextend -r在xfs上确实方便但如果你同时使用了LVM thin pool它不一定能自动扩所有子卷。Thin pool的扩容需要先扩池再扩LV顺序错了会报“no space”之类的错误。这类环境建议先把lvs -a看清楚thin pool和thin volume的关系再动手。第三做pvmove的时候如果目标PV容量不够过程会报错并提示空间不足但源卷数据不会损坏。千万别看到进度停在某个百分比就强杀进程耐心等LVM完成迁移。我曾经在一个大VG上做过3TB的pvmove足足跑了40分钟期间就开着pvs观察迁移进度最后才顺利解绑旧盘。磁盘操作不像软件安装失败可以重来一不小心就是数据层面的事故。最后说点个人感受。Linux磁盘管理这门手艺大部分时候考验的不是你背了多少命令而是你有没有一套“先看清、再规划、后动手”的流程。LVM给了我们很大的灵活性但它不是一个万能保险箱快照和备份永远比操作命令更值得依赖。真到了需要缩容、迁移、解绑数据盘的关键时刻慢一点多验证一步才是让自己睡得安稳的秘诀。
返回列表