
磁盘管理这事儿我入行那会儿就天天跟它打交道。服务器从裸机到虚拟化从十来块盘的小集群到几百TB的存储阵列绕来绕去始终绕不开一个叫LVM的配置。新手看到这四个字母容易慌觉得高深老手呢又常常在扩容、重装、迁移这些环节里磕磕绊绊。今天这篇攻略我不打算给你照搬man手册而是把磁盘管理和LVM配置从头捋一遍它解决什么问题、怎么一步步落地、扩容和缩减怎么操作、重装系统前又该怎么全身而退。这篇文章适合刚接触Linux服务器的运维新人也适合那些一直用LVM但没空深究原理的开发者读完你就能把这一整套玩法接回自己机器上。1. 为什么LVM能成为磁盘管理的主流方案1.1 传统分区的三个硬伤在聊LVM之前得先把传统分区方式的痛点摆出来。传统的磁盘管理要么用MBR分区表要么用GPT分区表用fdisk或者parted把一块物理硬盘划分成若干固定大小的分区每个分区对应一个挂载点。听起来挺顺理成章但实际用起来有三个硬伤。第一个硬伤是扩容困难。假设你有一块200GB的硬盘装系统的时候给/home分60GB跑了一两年用户文件把空间吃满了可旁边根分区还剩下几十GB闲着。你要是想把/home扩容传统方式只能用GParted这类工具在线调整或者备好另一块硬盘做dd拷贝步骤很繁琐在成长型的线上环境里几乎没有操作空间。第二个硬伤是大小无法灵活组合。一块物理盘的空间就那么大两块盘又不能直接把分区合并成一个目录跨盘存文件只能靠软RAID或者别的技术绑定关系很死。第三个硬伤是缺乏快照能力。在做数据库升级、系统补丁这类有风险的操作前如果能给文件系统拍个“快照”出问题一秒钟回滚这能力传统分区天生就没有。说白了传统分区是一种“物理边界优先”的模型可日常运维需要的是“逻辑边界优先”我只关心某个目录要用多少空间至于底层是哪块盘的哪个扇区最好别让我操心。LVM就是这个需求催生出来的。1.2 LVM核心概念和光速理解法LVM全称Logical Volume Manager逻辑卷管理。它的设计思路特别像公司租办公室——你不需要直接去管具体是哪一层楼、哪间房只需要告诉行政“我要一个能坐30人的会议室”行政再根据手里已有的房源去分配。对应到系统层面LVM有三个核心概念物理卷PVPhysical Volume就是把一块硬盘或分区初始化成LVM可用的底层单元相当于“可供出租的办公楼”。PV大小不必等于整块盘可以把一块盘分成多个PV也可以把多块盘各建一个PV。卷组VGVolume Group一个或多个PV集合在一起构成一个统一空间池相当于把所有办公楼合并成一个“房源总池”。VG的空间可以跨物理硬盘LVM在这层的核心价值就是把多块盘的容量打成一个整体。逻辑卷LVLogical Volume从VG这个池子里划出来的具体分区就是最终格式化、挂载、装数据的那个东西相当于“分给你的那间会议室”。LV可以随时扩大或缩小只要VG里有剩余空间。还有一个隐藏概念叫物理扩展块PEPhysical Extent。VG的空间并不是用字节直接切分的而是切成固定大小的块默认是4MB。LV占用的空间必须是PE的整数倍这就好比你租办公室只能按“整间”租不能租半间。PE大小可以改但我建议默认4MB就好除非你有非常特殊的性能或对齐需求一般没必要动。这三层结构一出来前面三个硬伤基本全解决了要给/home扩容只要VG里有闲着的空间lvextend一条命令搞定要跨盘合并把新硬盘做成PVvgextend进同一个VG即可要快照lvcreate -s直接把整个LV当下的状态冻结一份。这也是LVM成为目前主流Linux发行版默认安装选项的根本原因。1.3 LVM优缺点全景不吹不黑概括一下LVM的优缺点方便你做技术选型时心里有数。优点说明扩容/缩容灵活LV可在线扩大部分文件系统如ext4还支持缩小无需停机跨盘整合多块硬盘的空间可以合并成一个VG统一分配在线迁移挡不住热点的lvconvert、pvmove允许在系统运行时搬移数据快照与克隆秒级创建只读或读写快照适合测试环境回滚便于重装迁移VG层有独立元数据数据盘可跨机器挂载、恢复上下文缺点说明多一层抽象分区→PV→VG→LV→文件系统多一层地址映射出问题排查链路变长单点依赖一旦PV损坏或元数据丢失恢复难度比传统分区高不少性能有少量损耗理论上比直通块设备多一点逻辑开销实际在多数场景断层可忽略精简配置需额外配置默认LVM是厚置备想用thin pool还要单独学习我自己的使用经验是LVM对90%的应用和数据库场景性能损耗基本感知不到。真正需要注意的风险是元数据管理和备份后面我会专门讲。2. 从零搭建一套完整LVM环境的实操记录2.1 环境准备与工具选型动手之前先确认环境。我测试用的是一台CentOS 7.9服务器两块100GB的SCSI盘系统盘装在sda上sdb和sdc是两块纯数据盘准备拿来做LVM实验。不同发行版之间命令差异不大Ubuntu/Debian用apt装lvm2包即可CentOS/RHEL/Fedora默认就带。先确认LVM工具是否存在which pvcreate vgcreate lvcreate如果提示找不到就安装# CentOS/RHEL/Fedora yum install -y lvm2 # Ubuntu/Debian apt update apt install -y lvm2装好后建议顺手确认一下内核模块是否加载虽然现在主流内核几乎都内置了lsmod | grep dm_mod只要看到dm_mod输出说明设备映射机制可用。LVM底层依赖Linux的device mapper框架这名字只要记住就行不用深入重点是它的作用是让LVM能建立一个从“物理块”到“逻辑块”的映射层。再来说说磁盘初始化用什么工具。传统的fdisk支持MBR和GPT可以用它把整块盘标记为LVM分区分区类型8e或者GPT下的分区type代码E6D6D379-F507-44C2-A23C-238F2A3DF928。但我的建议是——如果整块盘都是给LVM用的直接跳过分区pvcreate /dev/sdb直接建PV这最省事。因为LVM本身就是一种分区管理工具不需要底下再叠一层传统分区表。唯一要考虑兼容性的是老系统启动引导但数据盘完全不受影响。当然如果你的习惯是给盘先分一个区列出来更直观fdisk也完全没问题fdisk /dev/sdb进入交互后按n新建分区全部默认值最后按t改分区类型为8eLinux LVMw写入。两种方式都行我在生产环境更倾向于直接整盘PV少一层分区就少一个故障点。2.2 创建PV、VG、LV的完整命令序列环境就绪后按顺序执行。第一步把sdb和sdc分别初始化为物理卷pvcreate /dev/sdb pvcreate /dev/sdc注意执行前务必三思这个命令会往磁盘头部写入LVM元数据如果盘上有旧数据且没备份这一步就是数据毁灭的开始。所以行业惯例是初始化前用blkid、lsblk确认这块盘是空的或确认不需要旧数据。检查结果用pvs或pvdisplaypvs输出类似PV VG Fmt Attr PSize PFree /dev/sdb lvm2 --- 100.00g 100.00g /dev/sdc lvm2 --- 100.00g 100.00g第二步建卷组。把两块盘放进一个叫vgdata的卷组vgcreate vgdata /dev/sdb /dev/sdc建立后用vgs看看容量vgs vgdata显示VG size应该是199.99GB左右两百减去一点点元数据开销。这里建VG时就自动把两块盘的PE统一了默认PE大小4MB整体空间约51200个PE。以后不管往VG里加多少块盘空间分配都基于这个PE粒度。第三步创建逻辑卷。我要建一个数据卷lvdata容量先给150GBlvcreate -L 150G -n lvdata vgdata参数含义-L指定大小-n指定LV名字后面紧跟VG名。创建成功后设备路径会自动出现在 /dev/vgdata/lvdata同时也会有一个对应的 /dev/mapper/vgdata-lvdata路径两个路径指向同一个设备随便用哪个都行我习惯用 /dev/mapper/vgdata-lvdata因为脚本里好拼字符串。第四步格式化。如果打算长期存放数据库或大量小文件建议用ext4或xfs我这次先用ext4做演示因为它支持在线缩小XFS的缩减后面再单讲mkfs.ext4 /dev/mapper/vgdata-lvdata第五步挂载并把根上的属主改好mkdir -p /data mount /dev/mapper/vgdata-lvdata /data chown -R nobody:nobody /data到这里一个基础LVM环境已经跑起来了。拿df一看/data已经有150GB可用空间你要说这块空间到底来自哪块物理盘不用管LVM把底层都消化了。2.3 开机自动挂载别用设备名这一步看起来不起眼但坑特别多。很多人习惯把下面这行写进/etc/fstab/dev/vgdata/lvdata /data ext4 defaults 0 0如果机器里只有一块VG大概率没事。但一旦系统启动顺序变了、设备名漂移或者你做了LV改名这个条目就可能直接导致开机卡在emergency mode。更稳的写法是用UUID。用blkid拿到逻辑卷的UUIDblkid /dev/mapper/vgdata-lvdata然后把下面内容写进/etc/fstabUUIDxxxx-xxxx /data ext4 defaults 0 0xfs文件系统会用另一串UUID格式照抄blkid就行。写完之后务必执行mount -a验证没报错再重启别把fstab搞挂了那才是血泪教训。还有一个细节建完LV后如果想保留挂载点不变但又觉得名字不好可以通过lvrename改LV名。改名后记得同步fstab或把LV从VG导出再导入很多人的“莫名其妙挂不上”就是这里出事的。3. 扩容、缩减与文件系统适配的实战逻辑3.1 数据盘接进来的扩容流程LVM最大的爽点就在扩容。说一个最常见的场景你的VG空间用完了现在新加了一块300GB的数据盘想要把它整合进vgdata池然后扩大lvdata。第一步新盘建PVpvcreate /dev/sdd第二步扩展VGvgextend vgdata /dev/sdd执行完pvs应该能看到/dev/sdd已经从“裸PV”变成“vgdata的一员”。第三步LV和文件系统一起扩容。假设你总共想扩到400GBlvextend -L 400G /dev/mapper/vgdata-lvdata resize2fs /dev/mapper/vgdata-lvdata如果LV是XFS文件系统最后一步要换成xfs_growfs这个区别非常重要。扩展完df确认文件系统确实是原地变大没有卸载、没有停机、数据无缝过渡。还有种情况是只增加VG而不扩已有LV比如你暂时不打算让任何目录变大只是想给VG留出余地。那做前两步就够了后面的lvextend什么时候用什么时候跑完全不影响现有业务。3.2 从VG里抽走一块物理盘有时候你要从VG里移除一块磁盘可能是盘坏了也可能是要把那块盘挪去别的机器。直接把pvremove挂载中的盘是不行的你的LV数据还在那上面呢得先把数据搬到VG里的其他PV上。这个操作就是pvmove一个比较冷门但关键时刻救命的命令。假设要抽出/dev/sddpvmove /dev/sddLVM会把/dev/sdd上的所有物理扩展块平移到同VG的其他空闲PV上。数据量大的话这个操作耗时可能很久dd概念类比就是“内存里的数据搬运工”期间业务应该尽可能停止写入或做好快照避免数据不一致。搬完之后确认vgdisplay输出里/dev/sdd的剩余空间为0然后vgreduce vgdata /dev/sdd pvremove /dev/sdd这样那块盘就彻底脱离VG了之后可以拿去干别的甚至物理拔盘都没问题。整个过程在线完成这是传统分区无法想象的。3.3 缩减LV的适用场景和XFS的坑聊完扩容肯定有人问缩小怎么搞。我的总体建议是能扩尽量不缩尤其是XFS文件系统它天生不支持缩小。如果你用mkfs.xfs格式化了LV那就彻底放弃缩容念头只能通过迁移数据重新建文件系统来“间接缩”。所以很不幸现在的Linux新装系统默认都用XFS根分区这导致很多人在想缩容的时候才发现为时已晚。如果你的LV是ext4缩减是可行的流程是反着来umount /data e2fsck -f /dev/mapper/vgdata-lvdata resize2fs /dev/mapper/vgdata-lvdata 300G lvreduce -L 300G /dev/mapper/vgdata-lvdata mount /dev/mapper/vgdata-lvdata /data这里顺序不能错必须先缩文件系统再缩LV。如果先缩LV再缩文件系统文件系统元数据就被截断了基本等于数据全废。而且缩减前必须做文件系统一致性检查e2fsck -f这一步强制执行的别为了省时间跳过去真出问题哭都来不及。说句实话在虚拟化和云存储高度普及的今天LVM缩减已经不那么重要了空间不够加盘、迁移数据重建都比在线缩容安全得多。XFS不支持缩容这件事先在方案设计阶段想清楚省得后面被动。3.4 快照功能的用法与注意点LVM快照是我最舍不得换掉LVM的理由之一。它的原理不是整盘拷贝而是建立一种“写时复制”机制创建快照那一刻原始LV的数据不复制快照空间初始是空的只有当原始LV上有数据块要被修改时系统才把那块旧数据先复制到快照区域。因此快照创建是秒级完成且占用的空间是增量增长的。创建命令# 给lvdata创建一个1GB空间的只读快照 lvcreate -L 1G -s -n lvdata-snap /dev/mapper/vgdata-lvdata之后你可以把这个快照挂载到一个临时目录检查数据一致性、导出备份、跑测试脚本原始LV该怎么用还怎么用。脚本验证完直接删除快照lvremove /dev/vgdata/lvdata-snap注意快照空间如果撑满快照会自动失效数据一致性在那一刻没法保证。所以快照的大小要估算好在备份窗口期间预计会有多少数据块被修改乘以余量系数就是合适的快照大小。如果保留分钟级的临时快照给1-2GB一般够用如果要挂一晚上建议给LV全量大小的10%以上。4. 重装系统前后LVM数据盘的处理策略4.1 重装前为什么必须“先从LVM卸下来”这个话题说多了都是泪。我见过太多人重装系统结果把LVM数据盘搞丢或者挂载乱的。为什么会这样因为重装系统时安装器通常只会重新初始化系统盘的分区表但你原本在数据盘上创建的VG元数据、LV配置并不会被新系统自动识别除非新系统里正好有相同名字的VG或LV。更麻烦的是如果系统在重装过程中把数据盘的PV纳入到了新的安装流程里比如安装程序发现“这里有一个未分配的LVM PV是否加入系统卷组”一些没经验的用户点了个确定数据盘就会被摧毁。所以重装前处理好LVM关联关系比任何备份方案都重要。标准的安全流程是三步走卸载所有LVM逻辑卷、停用卷组、备份卷组元数据。对应命令如下umount /data vgchange -an vgdata vgcfgbackup vgdatavgchange -an的含义是让整个vgdata里的逻辑卷都变成“非活动”状态这样系统重启或换系统时不会再尝试自动激活挂载它们。vgcfgbackup则会把VG的完整元数据备份到一个文本文件里默认路径是/etc/lvm/backup/vgdata这个文件是重装后恢复VG配置的关键一定要把它拷贝到U盘、另一块盘或者打印记录。注意vgcfgbackup只是备份了VG的配置元数据不是数据本身。你要是想连数据一起备份得另找备份工具但做重装操作有元数据备份就足够你在新系统里把VG重新激活、完整看到原来的LV结构了。4.2 重装完成后的卷组恢复系统重装完成后数据盘插着开机后大概率系统不会自动激活你已经存在的VG。这是正常的因为新系统的/etc/lvm/配置里没有记录这些VG信息。恢复步骤很简单# 先看系统能否发现PV pvscan # 如果PV的状态显示为not found或unknown device需要先处理 # 如果只是显示VG inactive直接激活 vgchange -ay vgdata执行完vgchange -ay/dev/vgdata下的逻辑卷设备就会重新出现。然后检查vgscan lvscan lsblk看到lvdata回来了接着挂载、检查数据完整性mount /dev/mapper/vgdata-lvdata /data ls -la /data如果你的VG元数据因为某些原因丢失了但有vgcfgbackup的备份文件可以这样恢复vgcfgrestore vgdata --force前提是构成VG的PV设备名必须还在原位置比如还是/dev/sdb和/dev/sdc。如果PV顺序变了比如原先的/dev/sdc现在系统识别成/dev/sdd恢复就会困难很多。这就是为什么我强烈建议你重装前记录下pvs的原始输出包括每个PV对应的设备路径和VG名称这能在关键时刻救你一命。4.3 云环境与虚拟机的特别提醒现在的云服务器和云电脑又多了一层复杂度。比如一台云电脑用了LVM还挂了数据盘重装前如果不能先umount很多云平台的“重装系统”功能会把数据盘一并格式化或者把系统盘和数据盘重新初始化导致你要先手动卸载和隔离。我的建议是在云平台操作重装前先SSH进系统里执行vgchange -an vgdata然后到存储卷管理界面把数据盘从实例上解绑。重装完成后再重新挂载回来。这样系统重装流程就碰不到数据盘的PV了。有些云平台的数据盘可以“挂到原来的实例”重启后自动激活有些需要手动执行vgchange -ay。这两步熟练了重装系统就不会再让人紧张了。虚拟化环境里还有一个坑就是PV设备号漂移。你在VM里看到的是/dev/vdb1、/dev/vdc1一旦VM的磁盘顺序变了PV的UUID不变但设备路径变了LVM的/dev/mapper路径可能仍然可用。所以恢复VG时优先用/dev/mapper路径其次是pvscan扫出来的真实设备路径别傻傻按旧路径去mount。4.4 常见问题速查表与排查思路根据我自己的运维经历整理一张高频问题的排查表。故障现象可能原因排查办法pvscan提示“Device /dev/sdb not found”盘没接好、驱动没加载或PV元数据损坏检查dmesg、lsblk用pvscan --majorminor扫描开机进入emergency mode/etc/fstab引用了不存在的设备或UUID单用户模式注释fstab对应行blkid核对UUIDlvcreate后/dev/mapper下没有设备没执行partprobe或vgchange -ay执行vgscan vgchange -ayLV挂载时提示“wrong fs type”文件系统类型写错或未格式化blkid确认file -s /dev/mapper/vg-lv重装系统后数据盘找不到VG新系统未启用LVM、或VG元数据没被扫描vgscanvgimport用vgcfgrestore恢复备份lvextend后df没变大文件系统层没执行resize命令xfs用xfs_growfsext4用resize2fspvmove卡住不动并发IO高、或目标PV空间不足用lvs -a查看迁移进度确认目标空闲PE数量快照失效快照空间被写满lvs查看快照使用率删除重建更大快照排查思路说到底就是“分层定位”先从硬件层看盘在不在lsblk、fdisk -l再到LVM层看PV/VG/LV状态pvscan/vgscan/lvscan最后去文件系统层看挂载和容量。严格沿着物理→逻辑→文件系统的路径走大部分LVM问题都能在两三轮命令内定位到。5. 配置源之外一块数据盘从入门到精通的进阶心得如果你已经熟练掌握了上面的全部内容那我再补充几个进阶维度。首先是LVM与软RAID的叠加。你可以先组mdadm RAID1或RAID10再把RAID卷做成PV获得“软RAID的高可用 LVM的灵活扩容”的双重能力。这个方案在物理服务器时代是主流做法现在用在虚拟化环境也一样适用。唯一的代价是性能开销和配置复杂度都上去了小型项目没必要上。其次是thin pool精简配置。传统LVM一创建LV就是厚置备100GB的LV不管里面写了多少数据VG中那100GB就不能给别的LV用了。thin pool的思路是先划一个大池子比如200GB然后在这个池子里动态创建“薄”LV真正落盘多少数据才占多少空间超配的空间先记账。适合KVM虚拟机镜像批量创建和开发测试环境。但thin pool有一个要命的特性池子满了之后如果系统继续写数据会直接触发io error甚至文件系统损坏。所以用thin池必须配监控告警阈值到80%就要赶紧加容量新手别轻易在生产环境玩。第三就是前文反复强调的备份意识。LVM元数据很小但很致命养成好习惯vgcfgbackup vgdata建议每次重装、扩容、迁移前都跑一次并把/etc/lvm/backup目录定时同步走。这些文件只有几KB但关键时刻是数据盘的“户口本”。我个人在经历了多次扩容和重装事故之后现在的习惯是每块数据盘都单独做一个VG而不要所有盘塞进一个巨型VG里。这样某个VG损坏不会波及其他数据盘隔离性更好。谨慎一点总没坏处磁盘管理这种事出一次事故够你吃很久的教训。