
目录先放一边这次聊的是RH134备考里很容易被低估的一章——第8章“管理存储堆栈”。我当年准备RH134的时候最头疼的就是存储这块内容杂、命令多而且实验一错就是整个逻辑卷系统崩掉排查起来特别费劲。但是考完回头再看这一章恰恰是最“值钱”的因为不管你是不是要考证Linux服务器上迟早要打交道的就是磁盘、分区、文件系统这一堆东西。RH134把这块单独拎出来讲不只是为了考试而是工作中你一定会用到。这篇文章不打算把教材重复一遍我用自己的思路拆一遍存储堆栈到底是由什么组成的、LVM各层的概念和流向是什么、命令怎么敲最不容易出错、出了问题怎么快速定位。你要是正在准备RH134或者刚入职运维、想系统学一下Linux存储管理这篇应该能帮你省不少走弯路的时间。1. 存储堆栈的完整结构从磁盘到文件系统的层级逻辑1.1 先理解“堆栈”这个词到底在说什么很多人一听到“存储堆栈”就懵觉得是个很高深的东西。其实类比一下就很好理解——你往桌子上叠盘子最底下是物理磁盘中间是各种管理层最上面是文件系统一层叠一层。Linux里的存储就是这样一层层搭起来的每一层有它自己的职责多了哪一层少了哪一层都不行。我之前带过几个刚开始学Linux的同事他们最常犯的错就是拿到一块新盘直接去分区、格式化、挂载然后用着用着发现空间不够这时候没法在线扩容只能停机加盘再迁移数据。这就是因为他们不了解存储堆栈把所有步骤压缩成一条路走忽略了中间LVM这一层带来的灵活性。在RH134第8章里存储堆栈最典型的形态是这样的物理卷PV→ 卷组VG→ 逻辑卷LV→ 文件系统 → 挂载点。从左到右一层叠一层每一层都管着下面那层的资源。比如逻辑卷LV需要空间的时候是从卷组VG里“借”的VG的空间则来源于物理卷PV而PV的本质就是一块块真实的磁盘或者分区。1.2 RH134为什么特别强调“管理”而不是“创建”注意章节名字叫“管理存储堆栈”不是“创建存储堆栈”。这意味着考试和实际工作更看重你后续怎么维护这套东西——扩展、收缩、迁移、删除、故障恢复。RH134的考试环境里你可能拿到一块已经划分好的磁盘或者一个已经存在的卷组这时候你的任务是去调整它而不是从零开始。我记得教材里有个很典型的场景系统装好了根目录空间不够用了你需要在运行中的系统上去给根文件系统扩容。这考验的不是你会敲几条命令而是你清楚整个堆栈里哪层该动、哪层不该动以及动完之后文件系统层要不要跟着扩大。这些都属于“管理”的范畴。另外还有一点RH134里会同时用命令行工具和system-config-lvm这类图形工具来说明操作思路但我建议备考时以命令行为主。原因很简单考试环境大概率没有图形界面而且命令行下的每一步都能看到反馈你对概念的理解会更扎实。1.3 设备命名和后端存储的真实形态聊LVM之前得先搞清楚底层设备是怎么命名的。RH134这一章会用到的收录方式包括/dev/sda这种传统命名也会提到新内核的/dev/nvme0n1、/dev/vda这类命名规则——这根据你实验环境不同有差异但归根结底它们都是块设备文件LVM把它们纳入管理之后就统一叫“物理卷”。这里有个非常实用的排查技巧用lsblk看设备结构永远比用fdisk -l直观。lsblk会以树状结构显示设备之间的依赖关系特别是当你有多块盘、多个分区的时候一眼就能看出谁在谁上面。我自己的习惯永远是先lsblk再决定下一步要不要用pvdisplay、vgdisplay这些LVM专用命令。2. LVM三层结构逐个拆解PV、VG、LV别再混淆2.1 物理卷PVLVM的“砖块”物理卷是整个LVM架构最底层的“砖块”。一块硬盘可以直接做成PV也可以先分区再把这个分区做成PV。两种做法都可以但实际场景中我更喜欢用整块磁盘直接做PV因为省掉了分区这一步后续扩展空间也更灵活。创建PV的命令是pvcreate /dev/sdb。执行完之后这块盘上会写入LVM的元数据用来标识这个设备已经被LVM接管了。你可以用pvs快速查看所有PV的信息也可以pvdisplay /dev/sdb查看详细内容包括它的总容量、剩余空间、PE大小等。有个细节需要留意PV的大小并不是固定死的。如果后端磁盘本身变大了比如虚拟机里把虚拟磁盘扩容了你可以用pvresize /dev/sdb让PV识别新的大小。这个操作在考试里不一定直接考但它是工作中用得相当频繁的一步尤其在虚拟化环境里。还有一点在一台机器上你完全可以用好几个PV它们并不要求是同一块磁盘。比如我实验环境里有三块10GB的盘我可以把其中两块做成PV放进同一个卷组这样就拥有了一个横跨两块物理磁盘的20GB卷组。2.2 卷组VGLVM的“资源池”卷组就是把若干PV组合在一起形成的“资源池”。这是LVM设计里最精华的部分——你对逻辑卷不再直接面对物理磁盘的容量限制而是面对一个虚拟出来的池子。池子有多大逻辑卷最多就有多大当然还要扣除一些开销。创建卷组的命令是vgcreate myvg /dev/sdb如果要把多块盘同时放进这个卷组就可以写成vgcreate myvg /dev/sdb /dev/sdc。命令敲完之后你可以用vgs查看所有卷组vgdisplay myvg则能显示这个卷组的详细信息其中最重要的两个字段是Free PE和Alloc PE——前者是还能分出去的空间后者是已经被逻辑卷占用的空间两者加起来才是卷组总容量。这里有个很多人忽略的点卷组名一旦创建后面所有关于它的操作都依赖这个名字所以命名要起得有意义。我看到过有人用vg0、vg1这种名字短期用还行一旦机器上有多个卷组、跑着不同业务过一个月你自己都分不清哪个是哪个。我的建议是带点语义比如vg_data、vg_app这样的规格方便一眼识别。2.3 逻辑卷LV真正被格式化挂载的那一层逻辑卷是从卷组里划出来的一块空间它才是最终被格式化成文件系统、挂载进目录使用的实体。在系统里面逻辑卷的设备路径看起来类似/dev/myvg/mylv或者/dev/mapper/myvg-mylv。创建逻辑卷的命令是lvcreate -L 2G -n mylv myvg。-L 2G代表指定大小-n mylv代表逻辑卷的名字最后一个参数是卷组名。逻辑卷创建好后设备文件会自动出现在/dev下你不需要手动去mknod。创建完LV之后还得在上面做文件系统否则它只是一块空白的块设备。比如mkfs.xfs /dev/myvg/mylv然后mount /dev/myvg/mylv /mnt/data到这一步整条存储链路才算打通。如果你在虚拟化平台或者公有云上玩过块存储你会发现这就是一套很典型的“建存储、格式化、挂载”流程只是这套流程在Linux本地也能做。2.4 PELVM里最容易被忽略的计量单位PEPhysical Extent是LVM里的最小分配单位。你创建LV时如果不指定单位LVM会自动按PE来切分空间。PE默认大小是4MB不过这个值在创建VG时是可以调整的——vgcreate -s 16M myvg /dev/sdb就把PE设置成了16MB。PE的影响在哪最直接的就是逻辑卷的大小必须是PE大小的整数倍。比如PE是4MB你创建LV时指定了1GB实际分配出来的一定是1GB对齐后的整数个PE不会出现半块PE这种状态。这个概念对日常操作来说不需要时刻记着但一旦你发现LV容量跟预期差了一点点就得往PE对齐上想。3. 实操从裸盘到可用的文件系统全流程3.1 动手前的准备检查现状与确定设备名做LVM实验之前第一件事不是敲pvcreate而是先看清楚机器上当前的存储状况。打开终端执行lsblk你会看到类似这样的输出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 10G 0 disk上面这个例子里面sda是系统盘上面已经有LVM结构了sdb是一块全新的10GB空白盘正好拿来做实验。我通常还会再执行blkid或者fdisk -l /dev/sdb确认一下sdb是不是真的没有分区表、没有文件系统避免不小心把有数据的盘给初始化了。这一步虽然不起眼但能救回不少误操作。3.2 建PV、建VG、建LV的完整命令序列确认清楚了就开始正式搭建。一段典型的命令序列长这样# 1. 把 /dev/sdb 做成物理卷 pvcreate /dev/sdb # 2. 创建一个名为 myvg 的卷组包含上面这个PV vgcreate myvg /dev/sdb # 3. 在 myvg 里创建一个 2GB 的逻辑卷取名 mylv lvcreate -L 2G -n mylv myvg # 4. 检查一下逻辑卷是否生成 lvs /dev/myvg/mylv # 5. 做文件系统 mkfs.xfs /dev/myvg/mylv # 6. 创建挂载点并挂载 mkdir /mnt/data mount /dev/myvg/mylv /mnt/data # 7. 确认挂载成功 df -h /mnt/data这串命令如果一切顺利df -h /mnt/data里就会出现一个2GB的文件系统。到这一步你已经从一块裸盘走完了整条存储堆栈的创建流程裸盘→PV→VG→LV→文件系统→挂载点前后不到一分钟。但如果你希望在重启之后系统还能自动挂载不要漏掉写/etc/fstab。我实验时习惯用UUID而不是设备名来写fstab因为设备名可能因为插入新盘或者其他原因发生变化UUID却稳定得多。获取UUID很简单blkid /dev/myvg/mylv就能看到。3.3 为什么新环境推荐XFS而不是ext4RH134的默认文件系统是XFS这一点和RHEL 8/9的系统标准是一致的。XFS和ext4都能用于LVM但在现代RHEL系统里XFS是默认选型。XFS对大文件、大数据量的处理能力更强在存储扩展方面配合xfs_growfs也顺畅。不过XFS有个硬限制它只支持扩大不支持缩小。如果考试或者工作里遇到“把逻辑卷调小”的需求你得明白XFS根本做不到只能改用ext系列ext4支持在线缩小但也要小心操作。这个区别我会在后面“常见问题”里详细展开。选择哪个文件系统往往不是看谁新而是看你有没有收缩需求。3.4 查看验证工具pvs、vgs、lvs、df -h我自己的习惯是在每一步操作之后立刻用对应的查看命令确认状态创建完PV用pvs创建完VG用vgs创建完LV用lvs最后挂载完用df -h。四条命令刚好对应四个层次每一步都能验证上一步是否成功。这四个命令都有各自的详细版本pvdisplay、vgdisplay、lvdisplay、df -h。详细版会显示更丰富的信息比如PV的PE总数、VG的已分配/未分配空间、LV的逻辑卷路径等等。排查问题时详细版很有用平时快速确认状态时简版就够。4. 扩容与缩容工作中最常用的两个场景4.1 在线扩展逻辑卷的完整过程与背后原理磁盘空间快用满的时候最着急的操作就是扩容。LVM在线扩容的整体思路是先给逻辑卷“加容量”再让文件系统感知到这个新容量。这两步缺一不可而且顺序不能反。最常见的操作如下# 1. 把 mylv 扩大 1GB lvextend -L 1G /dev/myvg/mylv # 2. 让文件系统跟着扩大 xfs_growfs /mnt/data第一行命令执行后LV本身已经变大了但如果你立刻执行df -h会发现文件系统还是原来的大小。原因很简单文件系统的超级块里记录了自己的容量它并不知道底层LV变了。xfs_growfs的作用就是让它去重新读取并扩展。如果你用的是ext4第二行命令需要换成resize2fs /dev/myvg/mylv。lvextend还有一种写法是直接把LV指定到某个确切大小比如lvextend -L 5G /dev/myvg/mylv这会把LV的大小设成5GB。相对而言我推荐-L 1G这种增量写法因为它更直观也不容易因为目标大小算错导致覆盖掉已有文件系统数据。如果你不确定VG里还有没有足够空间先执行vgdisplay myvg查看Free PE。这一点我在实际工作里踩过坑——想当然地给LV扩容结果VG空间不足命令报错还得去增加新PV。所以扩容之前先看VG余量是个特别好的习惯。4.2 在虚拟化环境里给LV扩容的特殊路径虚拟化环境比如KVM、VMware、公有云虚拟机里扩容经常不是只敲LVM命令就完事。你得先在宿主机/云控制台把虚拟磁盘的容量变大然后让操作系统感知到新容量——这一步通常是pvresize /dev/sdb把PV的新空间识别出来。之后VG的空间变大了LV才能继续扩展。有件事我特别想提醒虚拟机磁盘扩容后要执行pvresize否则LVM根本看不到新增的空间。我遇到过不少朋友在云控制台把磁盘从10GB调到20GB然后直接去执行lvextend结果提示VG没有足够空间折腾半天才发现是漏了pvresize这步。整个链路是虚拟磁盘变大 → PV变大 → VG变大 → LV变大 → 文件系统变大一环扣一环。4.3 收缩逻辑卷xfs不行ext4有一堆注意事项收缩逻辑卷是个更危险的操作。先说结论XFS文件系统不支持缩小所以如果某个LV上建的是XFS你只能通过备份数据、重建LV、恢复数据的方式来“缩小”不存在像扩容那样一条命令搞定的事情。RHEL默认用的XFS意味着“LVM在线缩小”这个操作在RHEL里基本做不了。如果你用的确实是ext4那么缩小逻辑卷的顺序和扩容完全相反而且每一步都有不可逆的风险。核心步骤大概是这样# 1. 先卸载文件系统必须 umount /dev/myvg/mylv # 2. 检查文件系统确保没有损坏 e2fsck -f /dev/myvg/mylv # 3. 先缩小文件系统到目标大小比如3GB resize2fs /dev/myvg/mylv 3G # 4. 再缩小逻辑卷 lvreduce -L 3G /dev/myvg/mylv # 5. 重新挂载 mount /dev/myvg/mylv /mnt/data注意顺序必须先缩小文件系统再缩小LV反了的话LV比文件系统还小数据必定损坏。而且永远不要在挂载状态下缩小ext4必须先卸载。Resize2fs之前还要先跑一遍e2fsck做检查这些都是RH134考试里容易挖坑的地方。4.4 卷组层面的空间管理加盘与移除PV有时候卷组空间不够单纯靠扩容无法满足需求就得往VG里加一整块新盘。创建完PV之后把它vgextend myvg /dev/sdc到卷组里VG的容量就变大了。反过来如果你想从VG里拿掉一块PV比如要把某块盘撤下来换更大的盘C操作就不是直接把盘拔了那么简单。你需要先pvmove /dev/sdc把这块盘上的数据迁移到卷组里其他PV上然后再vgreduce myvg /dev/sdc最后才能安全地卸下这块盘。pvmove这个命令在RH134的文字题里出现过好几次它能实现在线迁移数据而不是让你停机拷数据实用性很强。5. 常见问题与故障排查实测中踩过的坑5.1 误删卷组导致所有逻辑卷“消失”有一次我在实验环境里敲vgremove myvg本来只想清理一个废弃的卷组结果没注意里面还有挂载中的逻辑卷命令执行后我的/dev/myvg/mylv设备路径瞬间消失挂载点还在但数据已经访问不到了。这个操作看似只是删除了卷组实际上是把整个LVM结构的上层都清了属于比较危险的动作。经验教训任何删除操作之前先umount挂载点再lvremove移走或删掉逻辑卷最后才vgremove卷组。顺序反了轻则配置丢失重则数据损坏。LVM的删除顺序其实就是创建顺序的倒放挂载点→LV→VG→PV这个逻辑一定要记牢。5.2 LV有空间但df显示没变化这个问题特别常见也很容易让新手慌神。你执行了lvextend -L 1G /dev/myvg/mylv然后df -h一看文件系统大小还是老样子你会以为扩容没生效。其实在绝大多数情况下扩容是生效了的只是文件系统还没“知道”这个变化。XFS需要执行xfs_growfs /mnt/dataext4需要resize2fs /dev/myvg/mylv。忘记这一步等于只扩了LV没扩文件系统。这里有个小坑xfs_growfs后面接的是挂载点或者文件系统路径而resize2fs后面接的是逻辑卷设备路径。两个命令的用法不太一样容易记混。我自己的记忆方式是XFS的Growfs干的是“扩展文件系统”需要知道挂载点ext4的resize2fs直接对块设备操作所以给它设备路径。5.3 无法缩小XFS的替代思路如果你手头只有XFS却非得把一个逻辑卷变小我能给你的最稳妥方案就是数据搬家式重建先把数据备份或者rsync到其他地方删除逻辑卷重新创建一个小一点的LV建好文件系统后再把数据拷回来。这个方案看起来笨但它是最不容易损坏数据的路径。有些工具支持直接对XFS做缩减吗目前官方没有安全的空间收缩方案。因此规划容量的时候就要考虑到这一点如果业务一时半会儿不明确要大要小建议先用ext4或预留大一点的空间别用XFS硬扛“可能变小”的场景。5.4 系统启动时报错找不到LVM设备如果把/etc/fstab写错了或者物理磁盘顺序发生了变化重启后系统可能找不到对应逻辑卷会掉入emergency mode。面对这种情况不要急着重装系统。先进入救援模式或emergency shell执行vgscan、vgchange -ay让内核重新识别卷组然后再看/dev/mapper/里设备有没有回来。还可以用blkid查看真实UUID把fstab里写错的UUID或设备路径修正过来。我在自己机器上模拟过几次这种故障核心排查顺序就是vgscan确认VG是否存在 → vgchange -ay激活VG → 检查设备节点 → 修复fstab → reboot。一步步来大多数启动故障都能救回来。6. 备考RH134第8章的一点个人心得6.1 我推荐大家做实验的3个要点第一一定不要只看不敲。存储这块命令多、输出也多光靠眼睛看是记不住的。我建议你在虚拟机里准备两三块盘反复做“创建-扩容-缩容-删除”的循环直到不看文档也能条件反射地敲出完整命令。第二要把每一步的输出都看明白。比如pvcreate成功后会写“Physical volume successfully created”lvextend成功后会告诉你新旧大小。这些输出看似啰嗦实际上是你判断操作是否成功的直接依据。闭上眼睛不看输出就等于开车不看仪表盘。第三尝试用命令行复原一场“故障”。比如手动卸载逻辑卷、破坏fstab然后重新挂载并修改fstab让它恢复正常工作。多玩几次这种“故障恢复”考试碰到类似操作完全不会慌。6.2 常见命令速查表下面这张表是我根据RH134第8章范围整理的常用命令速查按功能分好了类算是我自己的压箱底笔记。功能命令典型示例创建物理卷pvcreatepvcreate /dev/sdb查看物理卷pvs / pvdisplaypvs创建卷组vgcreatevgcreate myvg /dev/sdb查看卷组vgs / vgdisplayvgs扩展卷组vgextendvgextend myvg /dev/sdc创建逻辑卷lvcreatelvcreate -L 2G -n mylv myvg查看逻辑卷lvs / lvdisplaylvs扩展逻辑卷lvextendlvextend -L 1G /dev/myvg/mylv扩大XFS文件系统xfs_growfsxfs_growfs /mnt/data扩大ext4文件系统resize2fsresize2fs /dev/myvg/mylv激活卷组vgchange -ayvgchange -ay删除逻辑卷lvremovelvremove /dev/myvg/mylv删除卷组vgremovevgremove myvg这张表建议你贴到终端旁边边操作边对照。时间久了这些命令会慢慢变成肌肉记忆。6.3 最后分享一个小经验RH134第8章真正考你的不是“会不会敲lvextend”而是“在什么场景下用哪个命令、操作顺序有没有问题”。我自己考完试之后日常去服务器上处理存储问题最先想的永远是“当前这个文件系统是XFS还是ext4能不能缩、能不能扩扩容之后要不要跑growfs”。把这些问题在动手之前想清楚远比记住一大堆命令参数重要。如果你准备RH134我强烈建议你花一个下午的时间拿三块虚拟磁盘把整章内容完整过一遍。从创建到挂载、从扩容到删除全程不看资料出了错就试着排查并修复而不是换台虚拟机重新来。这样练过一遍之后无论是考试还是实际工作你都会特别有底气。