
一台服务器用久了最先见底的不是CPU不是内存而是磁盘。做过几年Linux运维的人都清楚扩容数据盘、重新规划分区、把一个逻辑卷从快满的盘挪到新盘这些场景几乎每周都会遇到。Linux磁盘管理里最硬核也最常用的两件事就是硬盘分区和创建逻辑卷LVM。今天我把这套流程从头到尾捋一遍从分区表选型、分区工具操作到PV、VG、LV三层结构的完整创建再到扩容缩容和故障排查全部用我实际踩过坑之后的验证过的命令来讲给刚接触服务器管理的朋友一条能直接照抄的路径。1. 为什么我不建议拿到裸盘直接格式化1.1 一张表看懂MBR和GPT很多新手拿到一块新硬盘第一反应是mkfs.ext4 /dev/sdb格式化完直接挂载。短期看确实能用但等这块盘满了想扩容或者盘位调整导致设备名变化就会非常被动。所以在动手之前先搞清楚分区表类型。分区表就是硬盘的“目录册”告诉操作系统这块盘上有哪些分区、每个分区从哪里开始到哪里结束。目前主流只有两种MBR和GPT。我用一张表把你最关心的差异列清楚对比项MBRGPT最大识别容量约2TB约9.4ZB基本无上限最多主分区数量4个默认128个引导方式传统BIOSUEFI分区表冗余无备份损坏就全丢头部和尾部各存一份有CRC校验适用场景老旧设备、特殊兼容需求现代服务器、大于2TB的盘、UEFI启动LVM支持支持支持我现在的习惯是只要条件允许一律用GPT。原因很简单一是2024年以后新购入的服务器基本都是UEFI引导GPT是标配二是数据盘单块容量超过2TB太常见了MBR根本认不全到时候还得推倒重来。前几年我在一台老机器上接手过一块3TB的盘前任运维图省事用了MBR结果只认出2TB剩下的空间像蒸发了一样最后重新分区才解决。这里要纠正一个过时观念很多人以为fdisk只支持MBR其实util-linux 2.23版本之后的fdisk已经原生支持GPT了。你输入g就能创建GPT分区表日常分区根本不用额外装工具。1.2 传统分区和LVM的本质差异分区表选完之后接下来要考虑的是分区方案。传统分区的方式就像买房时把墙砌死了客厅多大、卧室多大交房那天就固定了。数据盘用传统分区容量规划错了非常痛苦。举个例子你给/data分了500GB结果三个月后数据库日志把空间吃满了。传统分区下你想扩容只能在同一条物理硬盘上找连续的空闲空间——如果这块盘还有未分配的空间运气好可以用growpart之类的工具扩展如果整块盘都分完了就只能再挂一块新盘把数据迁过去挂到新目录再改应用配置。整个过程涉及停机、拷贝、验证想想就头大。LVMLogical Volume Manager逻辑卷管理器解决的就是这个痛点。它的核心思路是把“物理容量”和“逻辑容量”解耦你可以把多块硬盘的分区物理卷PV合并成一个大的资源池卷组VG再从资源池里划出任意大小的逻辑卷LV给文件系统用。生活化的类比是传统分区像买了固定面积的房子想改格局得砸墙LVM像一个大型共享仓库你今天租5个货架明天想扩到10个仓库管理员直接给你划区域就行。文件系统看到的逻辑卷始终是一个连续设备它根本不知道底层其实有好几块物理硬盘。LVM在扩容时还有个杀手锏在线扩容。逻辑卷变大了文件系统也可以在不卸载、不停服务的前提下同步扩大。对于7x24小时跑着的数据库或业务服务这个能力非常重要。1.3 方案选型的判断逻辑LVM这么好是不是所有场景都无脑上也不是。我给你的选型建议是分场景的场景推荐方案理由系统盘/、/boot传统分区系统盘通常几十GB装完系统很少扩容传统分区足够稳定单块小容量数据盘500GB传统分区或LVM均可看后续规划没有扩展预期可以传统分区数据盘、数据库目录必须LVM数据增长不可控LVM在线扩容价值最大多块硬盘需要合并容量必须LVM传统分区只能“各管各的”LVM可以把3块盘合成一个卷组再切分需要快照备份的场景LVMLVM自带快照功能传统分区没有还有一个实操细节值得说数据盘到底是“整块盘直接做PV”还是“先分区再创建PV”我的做法是先把整块盘分成一个分区再在这个分区上创建物理卷。虽然pvcreate /dev/sdb也可以直接把整块盘做成PV但做成分区有两大好处一是分区表里能明确标记为LVM类型后续用lsblk或查看分区信息时一眼能认出这块盘的用途二是将来如果需要调整盘的使用方式有分区表兜底更灵活。2. 分区实战从识别设备到写入分区表2.1 上手前必会的三条排查命令不管新盘还是旧盘动手之前先把盘认清楚。这一步马虎不得我在生产环境见过太多因为认错盘导致数据被覆盖的惨案。下面这三个命令基本是Linux常用命令里排查磁盘的“三板斧”建议每次操作前都跑一遍lsblk fdisk -l blkidlsblk的输出最直观树状结构能让你看到每个块设备的分区关系、容量和挂载点。比如刚插入一块2TB新盘你会看到类似这样的输出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 500G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 499G 0 part └─centos-root 253:0 0 499G 0 lvm / sdb 8:16 0 2T 0 disk注意sdb这一行TYPE列是disk没有MOUNTPOINT这就说明它是一块全新的、还没分区的盘。如果TYPE列显示part那说明已经有分区了需要进一步确认分区类型和数据情况。fdisk -l能看到更详细的分区表信息包括分区起始扇区、扇区数、分区类型ID。blkid则用来查看已有分区的文件系统类型和UUID这个是后面写/etc/fstab的关键。2.2 fdisk操作全流程从交互命令到分区表类型确认了目标设备之后就可以开始分区了。以/dev/sdb为例我演示一遍fdisk的完整操作流程fdisk /dev/sdb进入交互界面后操作步骤和含义如下# 输入 g创建一个新的GPT分区表 Command (m for help): g # 输入 n新建一个分区 Command (m for help): n Partition number (1-128, default 1): 1 First sector (2048-4294967262, default 2048): 回车 Last sector, /-sectors or /-size{K,M,G,T,P} (2048-4294967262, default 4294967262): 回车 # 输入 t修改分区类型 Command (m for help): t Partition type (1-128, default 1): 1 Partition type or alias (type L to list all): 31 # 31 对应的是 Linux LVM # 输入 p打印当前分区表确认 Command (m for help): p # 输入 w将分区表写入磁盘并退出 Command (m for help): w第一次起始扇区按默认的2048就行。这里补充一个底层知识SSD和4K扇区机械硬盘都有对齐要求起始扇区设为2048后天然满足1MiB对齐性能和寿命都不会出问题。老旧的工具或脚本如果指定了奇怪的起始值反而会踩对齐的坑。t修改分区类型这一步很容易被新手跳过觉得反正pvcreate不检查分区类型也能用。我的建议是别省MBR环境下LVM的类型代码是8eGPT环境下是31。标成LVM类型后lsblk之类的工具可以直观识别万一哪天盘上信息看漏了分区表本身就能提醒你这是块LVM盘。写入分区表后系统内核不一定马上感知到新分区。如果立刻执行pvcreate提示找不到设备就运行一下partprobe /dev/sdb这个命令的作用是让内核重新读取分区表相当于不用重启就让系统认识新分区。有些老教程让你重启分区操作根本不需要重启用partprobe或者partx -a /dev/sdb都能解决。3. LVM完整创建流程PV、VG、LV三层结构3.1 先理解LVM的四个关键名词分区完成之后就进入LVM创建环节。很多人学LVM觉得乱是因为没搞清楚它那套术语体系。先把四个词记住后面的命令立刻变简单术语英文全称作用类比PVPhysical Volume物理卷由分区或整块硬盘构成是LVM的“原材料”一个仓库里的实体货架VGVolume Group卷组由一个或多个PV合并成的大资源池整租下来的仓库空间LVLogical Volume逻辑卷从VG里划出的一块空间用来格式化文件系统仓库里划出的独立区域PEPhysical Extent物理扩展块VG空间分配的最小单位默认4MiB仓库里的标准储物箱PE这个概念容易被忽略但实际有用。你可以把VG空间想象成用PE这个标准箱子码放的货物创建LV时LVM按PE数量分配lvcreate -l 100%FREE这种写法实际上就是按PE比例来。对绝大多数场景默认4MiB的PE大小够用了不需要改动。3.2 从已分区硬盘到物理卷PV现在把刚才分好的/dev/sdb1变成物理卷。注意别再写/dev/sdb那是指整个磁盘我们用的是分区pvcreate /dev/sdb1执行完之后可以用pvs快速查看物理卷的概要信息或者用pvdisplay查看详情pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- 2.00t 2.00t这里PSize是物理卷总大小PFree是还没被卷入卷组的空间。刚创建的PV全部空间都还是Frees下一步把它加入卷组。创建PV前建议再执行一次lsblk核对分区路径尤其是机器上有多块盘或者你刚对分区表做了修改。PV创建是一条“写入元数据”的操作认错盘后患无穷。3.3 创建卷组VG和逻辑卷LV有了PV之后下一步是创建卷组。卷组名自己定我习惯用data_vg这样的命名方式见名知意vgcreate data_vg /dev/sdb1创建完用vgdisplay看一下卷组详情重点看Free PE / Size这一项。如果以后加新盘用vgextend把它扩充进已有卷组即可vgextend data_vg /dev/sdc1卷组就绪后创建逻辑卷。这里有个关键决策把整个卷组的空间都分配给LV还是预留一部分我的建议是预留10%到20%。原因有二一是逻辑卷要扩容时卷组里得有空间可扩如果全分光了扩容前还得先加盘或缩别的卷麻烦二是LVM快照功能需要占用卷组内的剩余空间没有富余空间就没法做快照。假设这块2TB的盘预留200GBLV划1.8TBlvcreate -L 1.8T -n data_lv data_vg参数解释-L指定大小-n指定逻辑卷名字最后一个参数是卷组名。创建成功后逻辑卷设备路径是/dev/data_vg/data_lv同时也会在/dev/mapper/data_vg-data_lv生成一个设备节点。两个路径指向同一个设备日常使用推荐用/dev/mapper/路径语义更清晰。用lvs看一下逻辑卷的概要信息。到这里LVM的存储结构已经搭建完成但还不能直接用还差格式化和挂载。3.4 格式化、挂载与开机自动挂载逻辑卷创建后要和普通分区一样格式化。文件系统选型有两个主流方向文件系统扩容命令缩容支持适用场景ext4resize2fs支持但风险高通用场景、需要缩容的目录xfsxfs_growfs不支持CentOS/RHEL默认大数据量场景如果你用的是CentOS、Rocky、AlmaLinux这类RHEL系发行版默认推荐xfsDebian系习惯ext4。我个人的习惯是除非明确将来可能要缩容否则优先xfs因为xfs在超大文件和并发写入场景下的表现更稳。# 格式化为 xfs mkfs.xfs /dev/data_vg/data_lv # 创建挂载点 mkdir -p /data # 临时挂载 mount /dev/data_vg/data_lv /data挂载后检查一下容量和可用空间然后要把挂载信息写入/etc/fstab否则重启后逻辑卷不会自动挂载。这里有一个我强烈推荐的做法不要写设备名比如/dev/sdb1用UUID。因为Linux的设备名是根据内核枚举顺序决定的加块盘或者换盘位之后sdb可能变成sdc但UUID是固定不变的。先获取UUIDblkid /dev/data_vg/data_lv输出类似于/dev/mapper/data_vg-data_lv: UUIDxxxx-xxxx-xxxx TYPExfs然后把下面这行加入/etc/fstabUUIDxxxx-xxxx-xxxx /data xfs defaults,nofail 0 2注意nofail这个挂载参数。它的作用是开机时如果这个设备因为某些原因没准备好系统不会一直卡在那里报错而是跳过这一项继续启动。对于数据盘来说这个参数能避免很多启动故障。最后验证整个配置是否正确umount /data mount -a df -h /datamount -a会读取/etc/fstab并挂载所有条目如果配置有问题这时就会报错。这个验证动作一定要做别写完fstab直接重启否则真出问题时想救都麻烦。4. 扩容、缩容和数据迁移的完整操作4.1 在线扩容一条龙新盘加入、逻辑卷扩大、文件系统同步LVM最爽的场景就是在线扩容。现在/data又快满了新插入了一块1TB的硬盘/dev/sdc目标把它扩进现有逻辑卷。第一步还是正常分区把整块盘分成一个分区并标记LVM类型fdisk /dev/sdc # g - n - t(31) - w partprobe /dev/sdc第二步把新分区加入卷组然后扩大逻辑卷pvcreate /dev/sdc1 vgextend data_vg /dev/sdc1 lvextend -L 900G /dev/data_vg/data_lv这里-L 900G表示在原有基础上增加900GB注意加号。如果不用加号-L 900G的意思是直接设成900GB两者差别很大写错了可能把卷改小。第三步是关键中的关键扩大文件系统。lvextend只是让逻辑卷变大了文件系统还不知道这件事。此时跑df -h看到的容量还是原来的千万别以为命令没生效。xfs和ext4的命令不同# xfs 文件系统参数是挂载点 xfs_growfs /data # ext4 文件系统参数是设备路径 resize2fs /dev/data_vg/data_lv看到文件系统大小变化后扩容完成。整个过程应用不用停服务不用断数据盘还是同一个挂载点。4.2 缩容的正确姿势顺序和备份缩容是LVM里风险最高的操作我先把丑话说在前面xfs文件系统根本不支持缩小ext4虽然支持但操作不当会整卷报废。建议缩容前做好数据备份最好有LVM快照兜底。ext4缩容的正确顺序方向必须和扩容完全相反先缩文件系统再缩逻辑卷# 1. 卸载挂载点 umount /data # 2. 强制检查文件系统 e2fsck -f /dev/data_vg/data_lv # 3. 缩文件系统到目标大小 resize2fs /dev/data_vg/data_lv 800G # 4. 缩逻辑卷到相同大小 lvreduce -L 800G /dev/data_vg/data_lv # 5. 重新挂载 mount -a为什么顺序不能反因为逻辑卷缩小时LVM直接从尾部回收空间。如果文件系统还认为自己占着1TB而逻辑卷已经被砍到800GB文件系统尾部的数据相当于被“腰斩”了数据损坏率极高。先缩文件系统文件系统自己会把尾部数据挪走并更新自己的容量记录再缩逻辑卷就是安全的。还有一个常见问题是文件系统缩到800G逻辑卷忘了缩或缩成了900G两边容量对不上。建议用df -h和lvs反复确认两个数字一致。4.3 卷组跨盘迁移和回收PV有些场景下你要把一块有问题的盘从卷组里“踢出去”或者腾出一块盘还给厂商。LVM提供了pvmove这个工具。假设/dev/sdb1上有一批数据你发现这块盘SMART信息开始报警想把它替换到新盘/dev/sdc1上先把数据搬过去pvmove /dev/sdb1 /dev/sdc1这个命令把/dev/sdb1上的所有PE逐个搬到/dev/sdc1迁移过程中逻辑卷在线可用。数据量大的时候可能要跑一段时间可以用pvs观察迁移进度。迁移完成后把空PV从卷组里删除vgreduce data_vg /dev/sdb1 pvremove /dev/sdb1现在的状态是物理卷上的分区标记被清除但这块盘的物理数据还在可以做低格或直接拔盘。这套流程非常适合“磁盘故障前兆更换”的运维场景是LVM比传统分区有优势的地方。5. 实操中遇到的高频问题和避坑经验5.1 高频故障与解决速查表这部分内容我直接整理成故障速查表全是Linux运维故障案例里最常见的场景按“症状-原因-解决”三条列出来建议收藏备用。症状可能原因处理方法新分区无法识别内核没有重读分区表执行partprobe /dev/sdb必要时partx -a /dev/sdb重启后逻辑卷不挂载/etc/fstab没写或写错检查fstab条目执行mount -a验证lvextend后df -h没变化文件系统未扩展xfs运行xfs_growfs /dataext4运行resize2fs /dev/...系统启动进入emergency modefstab某行有问题输入root密码注释错误行mount -a排查xfs文件系统无法缩小文件系统本身不支持无解需要备份后重建文件系统vgremove提示设备忙还有LV被使用umount相关挂载点lvremove后再删VG设备名从sdb变成sdc内核枚举顺序变化所有持久引用使用UUID不要用设备名fdisk保存后分区不出现分区表写入成功但未刷新partprobe /dev/sdb或重启确认我之前遇到过一台机器开机起不来最后定位就是fstab里写了/dev/sdb1而不是UUID重启后设备枚举顺序变了系统在挂载数据盘时卡住进入紧急模式。从那以后所有fstab条目一律用blkid获取的UUID。5.2 三个我踩过最深的坑第一个坑是xfs分区执行了resize2fs。有一次我把ext4和xfs的扩容命令搞混了对一块xfs逻辑卷跑resize2fs命令直接报错提示“Filesystem is xfs but resize2fs is for ext”。当时系统没受损但吓出一身冷汗。现在我的习惯是看到文件系统类型后再决定命令xfs用xfs_growfsext4用resize2fs这两个命令的参数形式也不一样一个是挂载点一个是设备路径。第二个坑是在生产环境对正在挂载的盘做了缩小操作。当时为了“节省时间”没有umount就执行了lvreduce结果内核报错逻辑卷状态直接异常好在最终数据没有永久性损坏。从此以后我给自己定了一条规矩缩容必须umount必须备份必须走完整流程。第三个坑是lvextend -L漏写加号。你想增加100G写成了lvextend -L 100G如果逻辑卷原来是500G这条命令会直接把它改成100G。虽然LVM在缩小前会检查文件系统占用但遇到ext4在文件系统未收缩时也可能出现警告这个错误一旦发生恢复过程非常被动。加号是“增量”的意思不是可有可无的修饰务必确认。5.3 给新手的几条磁盘管理建议如果你刚开始管理中大型Linux服务器下面这几条建议能帮你少走弯路。第一上线之前做好规划再动手。数据盘用LVM、逻辑卷预留20%空间、挂载点命名统一比如统一用/data这些决策应该在服务部署之前做。等业务上线再改存储结构扩容虽然容易但涉及目录变更和业务适配就很疼。第二LVM快照是好东西一定要用起来。在做软件升级、数据迁移、或者任何可能出问题的变更前用一行命令做个快照lvcreate -s -L 100G -n data_snap /dev/data_vg/data_lv快照创建后原卷继续正常读写快照记录的是创建时刻的状态。出问题后可以随时回滚。快照也是LVM比传统分区多出来的核心能力不用白不用。第三不要把逻辑卷用到100%。LVM的逻辑卷扩大很容易但卷组空间是有限的。我一般给逻辑卷的使用率设个阈值超过85%就准备扩容或加盘而不是等写满再救火。lvs和vgs这两个命令应该像df -h一样成为日常巡检习惯。第四凡是涉及磁盘的命令执行前先确认自己敲的是不是正确的设备。pvcreate、mkfs、lvreduce这类破坏性操作没有撤销键我在生产环境永远遵循“先备份、再操作、后验证”的流程这是一个老运维最基本的动作规范。写到这里整个流程基本讲透了。我个人有一个坚持了很多年的习惯每次做磁盘操作之前先把lsblk、pvs、lvs、df -h这四行命令的输出截图存到当天的工作日志里。几秒钟的事但当你真的遇到数据灾难级别的问题时回看操作前的状态记录能帮你迅速定位问题边界。磁盘管理看起来就是一堆命令真正值钱的是你对整块存储结构有没有一个精确的心智模型。希望这篇从裸盘到逻辑卷的完整记录能帮你少踩几个我当年踩过的坑。