
1. 存储栈到底在管理什么先把这个概念说透。很多刚接触RH134的人看到“存储堆栈”这个标题都会愣一下觉得是一个很抽象的名词。其实存储堆栈没有多玄乎把它想象成一层一层叠起来的东西就对了。从最底层的物理硬盘到中间的LVM逻辑卷、分区表再到顶层的文件系统和挂载点每一层各干各的活又互相依赖这就是一个典型的存储堆栈。我经常用这样的场景来帮人理解你在服务器上插了一块新硬盘把它格式化、分好区再建逻辑卷、做成文件系统最后挂载到 /data 目录下从此应用程序往 /data 里写数据。这一整条链路从物理硬盘到应用程序看到目录的每一层就是所谓的存储堆栈。日常运维中比较常见的操作比如“磁盘满了怎么办”“想扩容某个目录”“新加了一块盘挂到哪里”本质上都是在跟这个堆栈的不同层次打交道。RH134第八章的定位非常明确就是教你把这条链路完整走一遍。它不会像RHCE阶段那样深入底层内核的IO调度细节而是聚焦在系统管理员日常天天要用的那套操作分区、LVM、格式化、挂载、Swap管理。很多人在这一章容易犯一个错误就是对着命令死记硬背却不理解每条命令作用于堆栈的哪一层。等真到了故障场景就会陷入“命令都知道但不知道该在哪一层下手”的窘境。这一章适合两类人认真读一类是刚入门Linux、准备考RHCSA的初学者需要在脑子里建立完整的存储分层概念另一类是已经干过一阵子运维、但平时只会在网上复制命令解决问题的从业者。尤其是后者我见过不少人在生产环境里因为搞不清楚LVM和分区的关系扩容时把数据搞出问题的例子。这一章就是把这些认知漏洞补齐的关键。2. 磁盘分区和LVM的关系很多人从第一步就没搞明白2.1 分区是“切蛋糕”LVM是“动态拼积木”先聊底层。物理磁盘在Linux里的设备名通常是 /dev/sda、/dev/sdb 这样的形式sda代表第一块SCSI/SATA盘sdb是第二块。系统要在物理盘上存放数据第一步是把它切成“块”也就是我们常说的分区设备会变成 /dev/sda1、/dev/sda2。传统的做法是分好区之后直接在这个分区上格式化、写文件系统然后挂载使用。这种方式简单直接但有一个致命问题一个分区的容量是固定的。比如你在 /dev/sda3 上建了一个200G的分区格式化成了ext4挂到 /home 下某天 /home 不够用了你想扩容难度会非常大因为它前后空间可能都被别的分区占着。这就是裸分区固有的局限性。LVMLogical Volume Manager逻辑卷管理器就是为了解决这个问题出现的。它把物理分区或整块盘先归拢成一个“资源池”也就是卷组VG再从这个池子里切出任意大小的逻辑卷LV给文件系统用。关键点是这个池子是可以动态调整的——你可以在池子里混入新的物理卷把空间变大然后在线调整某个逻辑卷的容量整个过程不需要停机。用生活里的例子来讲分区是固定的蛋糕切块给你切了多大就是多大LVM则是积木你有一个大箱子装了很多积木块随时可以往箱子里加积木也可以从箱子里抽出一些积木拼到另一个模型上去。生产环境里几乎都用LVM就是因为这个灵活性。注意RH134考试里通常要求按给定的规划来命名VG和LV例如卷组名是vg0、逻辑卷名是lv_data。但生产环境里命名建议更加语义化比如vg_app、lv_logs看到名字就知道这个卷是干什么的。这个习惯越早养成越好。2.2 从裸盘到可用的逻辑卷完整路径是怎么走的没有实际搭建过的人很容易把LVM的命令顺序搞反。这里我把完整路径梳理一遍每步都标注了它属于存储堆栈的哪一层第一步物理磁盘识别。新加的硬盘在系统里是 /dev/sdb用 lsblk 可以看到它是独立设备没有任何分区。第二步创建分区PV物理卷的载体。使用 parted 或 fdisk 把整块盘划分出一个分区 /dev/sdb1并把分区类型设为Linux LVM8e。这里的 8e 是分区类型编号fdisk里用 t 命令修改。第三步创建物理卷。用 pvcreate /dev/sdb1 把分区初始化为PV。每个PV都要包含一些LVM元数据用来记录它属于哪个VG以及自身的容量信息。这一步做完PV层就绪。第四步创建卷组。用 vgcreate vg_data /dev/sdb1 把PV收拢成一个VG。VG是把多个PV的空间合并起来形成的大池子。你也可以继续加第二块盘形成更大的VG命令是 vgextend vg_data /dev/sdc1。第五步创建逻辑卷。用 lvcreate -n lv_data -L 500G vg_data 从池子中切出500G的逻辑卷。设备路径就是 /dev/vg_data/lv_data。第六步创建文件系统。mkfs.xfs /dev/vg_data/lv_data 或者 mkfs.ext4这一步是堆栈中最上层让操作系统知道怎么在这个逻辑卷上组织文件、目录和权限信息。第七步挂载。mount /dev/vg_data/lv_data /data再写入 /etc/fstab 实现开机自动挂载。每次遇到存储相关的问题我的第一反应就是先定位这个环节卡在哪一层。物理盘问题看 lsblk 和 dmesgPV层问题看 pvsVG层问题看 vgsLV层问题看 lvs文件系统问题看 df -hT。这个排查思路比死记命令要实用得多。3. 文件系统选择与挂载策略隐藏的坑比你想象的多3.1 ext4和xfs到底选哪个RH134这一章会重点介绍文件系统的基础操作特别是mkfs和挂载。很多初学者在格式化时会问ext4和xfs有什么区别该选哪个先给结论RHEL/CentOS 7及以上的主流选择是xfs。它本身就是RHEL的默认文件系统根分区安装系统时就是xfs格式。xfs的优势在于大数据量和高并发场景下的性能表现元数据操作处理得比较高效并且支持在线扩展。缺点也很明显不支持缩减只能扩不能缩。ext4反过来灵活性更好支持在线扩大和缩小但超大文件系统上的性能不如xfs。这就推导出一个生产环境里很重要的经验原则如果你的目录规划好后几乎只增不减优先选xfs比如数据仓库、日志存储这些场景。如果你需要频繁调整容量甚至要缩容就不能用xfs老老实实选ext4。在RH134的实操环节里大多数题目默认用xfs因为Red Hat官方推荐它。不过这里有个细节得注意mkfs.xfs 和 mkfs.ext4 执行的时候并不会输出太多信息不像Windows格式化那样有进度条可能一两秒就返回了。初次操作的人会以为没有执行成功。验证方法很简单用 blkid 查看设备上是否出现了文件系统类型如果显示 xfs 或 ext4就代表格式化成功了。3.2 /etc/fstab的写法决定你的服务器能不能正常开机挂载本身很简单mount命令一敲就行。但重启之后还能不能挂上才是区分新手和老手的关键。答案就在 /etc/fstab 文件。很多人图省事开机后手动mount结果服务器一重启数据库起不来因为挂载不在了数据目录是空的。所以生产环境里任何重要目录都要写进fstab。fstab每一行有6个字段设备、挂载点、文件系统类型、挂载选项、转储标记、自检顺序。一个典型的写法是这样的/dev/vg_data/lv_data /data xfs defaults 0 0这里最值得展开的是第四列“挂载选项”。defaults并不是什么都不做它隐含了rw、suid、dev、exec、auto、nouser、async这些选项基本适合常规场景。但有些场景你需要显式调整。比如 /home 目录为了防止用户执行自己上传的二进制文件会加 noexec为了降低IO写入频率可以加 noatime省去每次读取文件时更新访问时间的开销。还有一个很多人都会踩的坑UUID和设备的区别。fstab里可以用 /dev/vg_data/lv_data 这种设备路径也可以用UUID。为什么更推荐UUID因为设备路径在某些情况下会发生变化比如内核识别顺序变了或者你调整了磁盘接入顺序/dev/sdb 可能变成 /dev/sdc但UUID不会变。所以更稳妥的写法是从 blkid 命令里复制UUID填进去。特别是对于有多个磁盘的服务器这个习惯能避免很多不必要的故障。注意写完fstab之后务必先执行 mount -a 验证一下配置有没有写错。如果这条命令报错说明fstab里有语法问题或者挂载点不存在一定要在重启前修正。fstab写错导致的服务器无法开机的惨案运维圈几乎人人都经历过提前验证能救命。3.3 挂载点已非空目录时会发生什么再分享一个我在实际运维中踩过的坑技术细节非常隐蔽。假设你的 /data 目录原本只是一个普通目录里面已经有一些测试文件。现在你把新逻辑卷挂载上来ls 查看 /data你会发现原来的文件都“没了”。其实并没有删除它们只是被文件系统挂载点遮住了。卸载之后原文件会重新出现。这个行为本身是Linux的标准机制但容易引发生产事故。比如你打算把某个新盘挂到 /var/lib/mysql却没注意到里面已经有MySQL初始化数据挂载后目录立马变成空盘数据库再启动就会报找不到数据表实际上数据还在磁盘上只是被挡住了。所以在挂载任何新设备之前养成先 ls 一下挂载点目录的习惯。如果目录非空先把内容挪走或者选个新目录挂载。4. LVM动态扩容实操全程记录一次典型的容量调整4.1 场景描述与需求判断运维里最频繁的LVM操作就是扩容没有之一。我拿一个典型的场景来演示整个过程。服务器上有一个卷组 vg_data里面有一个逻辑卷 lv_data挂在 /data 下文件系统是xfs原容量是200G。最近业务增长很快df -h 显示 /data 的使用率已经飙到85%需要扩容到300G。第一步不是急着执行命令而是先确认卷组里还有没有空闲空间。用 vgs 查看卷组的总容量和已分配容量如果Free字段显示还有100G以上空闲那就直接在卷组内切空间给逻辑卷。另一种情况是卷组空间不够了。vgs 显示Free为0这时候需要两块新盘或者一块新盘来补充存储池。把新盘 /dev/sdc 分区后执行 vgextend vg_data /dev/sdc1让卷组拥有新的容量再继续扩逻辑卷。这一步经常被遗漏的是vgextend之前必须确认 /dev/sdc1 已经是PV如果跳过pvcreate直接vgextend会报错。4.2 扩逻辑卷和扩文件系统是两件不同的事这是LVM操作里最容易出问题的地方很多人只知道 lvextend 扩容逻辑卷却忘记文件系统也要跟着扩展。逻辑卷扩容只是让底层块设备变大了文件系统并不会自动感知这个变化。如果只扩LV不扩文件系统df -h 看到的容量还是原来的200G系统没有收益。xfs和ext4的文件系统扩展命令不一样这里特意分开写。xfs文件系统的扩展只能增大不能减小用 xfs_growfs 命令lvextend -L 300G /dev/vg_data/lv_data xfs_growfs /dataxfs_growfs 后面的参数是挂载点也可以写成 xfs_growfs /dev/vg_data/lv_data。它是支持在线扩容的不需要卸载文件系统这对生产环境非常重要意味着扩容期间服务不会中断。ext4文件系统的在线扩容用 resize2fslvextend -L 300G /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data注意区别resize2fs 后面的参数是设备路径不是挂载点。这个区别很容易记混我总是建议大家在命令前先看一眼文件系统类型再选择对应的扩展命令。实际操作中可以用 df -hT 确认类型T列会显示文件系统类型。4.3 缩容为什么不建议做扩容讲完缩容我得重点提醒一句生产环境里LVM逻辑卷的缩容操作风险极高尤其是xfs文件系统官方明确不支持缩容。ext4理论上可以缩但流程很麻烦需要先卸载文件系统然后检查文件系统再用 resize2fs 缩小文件系统最后用 lvreduce 缩小逻辑卷。整个过程要求零写入、零误差一旦文件系统被缩小后逻辑卷再缩小中间有任何一个误差都可能造成数据损坏。我在真实运维中遇到“磁盘空间分配多了”的情况处理方式一般是如果这个逻辑卷对应的目录可以停机重做就重新规划如果目录里有重要数据宁可留着多余空间当预留缓冲也不做缩容。这个决策思路比掌握缩容命令本身更有价值。5. Swap空间管理容易被忽略但经常救命的“内存后援”5.1 Swap是什么在什么场景下会用到Swap大家都不陌生内存不足时把一部分不活跃的内存数据暂时转储到磁盘上把内存腾出来给正在运行的重点进程。这个机制的效果非常直白相当于给内存加了一个慢速但容量巨大的后援。系统物理内存扛不住的时候Swap能兜底避免OOM内存耗尽直接把进程杀掉。不过这里要纠正一种错误认知Swap分区或Swap文件并不能替代物理内存。它只是内存的扩展缓冲磁盘的读写速度和内存差了至少一个数量级。如果进程频繁在Swap和内存之间切换系统会变得异常卡顿这种现象叫“抖动”。所以配置Swap的正确姿势是物理内存不够时用Swap防止系统死掉而不是指望它扛住正常的业务负载。5.2 创建Swap分区与Swap文件RH134会教两种创建Swap的方式。一种是使用独立的Swap分区另一种是创建Swap文件。分区方式需要预先规划磁盘空间如果服务器是虚拟机后期调整还会涉及磁盘扩容的操作。文件方式更灵活想加大Swap只需要创建一个新文件并启用。先说Swap分区。假设你已经有一个分区 /dev/sdb2先要把它格式化成swap格式mkswap /dev/sdb2 swapon /dev/sdb2关键是第二步 swapon 激活它。mkswap 只是写入swap签名和元数据不会自动开启交换功能。如果你只想让某块盘做存储千万别手滑执行mkswap。想确认Swap是否生效用 swapon --show。Swap文件更灵活以满足临时增加Swap空间、不想动分区的场景。创建流程是这样的fallocate -l 2G /swapfile dd if/dev/zero of/swapfile bs1M count2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile这里有个坑一定要分享fallocate 创建出来的文件在某些文件系统上可能不适合做Swap因为它是预分配块的方式可能带有空洞。稳妥的做法是通过dd写入零数据来创建虽然速度慢一点但得到的文件是实实在在占用物理块的。我自己在生产环境里从来只用dd方式省得踩没必要的坑。chmod 600 是为了保证只有root能读写这个文件因为Swap文件里可能存有敏感的内存数据权限设宽了有安全隐患。5.3 Swap的持久化配置和调优经验经常有人问我为什么重启之后Swap又没了原因很简单swapon只是临时开启要持久化同样需要写入 /etc/fstab。Swap分区的写法是/dev/sdb2 swap swap defaults 0 0Swap文件的写法是/swapfile swap swap defaults 0 0这里文件系统类型列写swap挂载点列也写swap这是特殊情况下的固定写法第一次看到的人可能会困惑但这就是规矩。关于Swap大小Red Hat对系统的默认建议大概是物理内存的1到2倍但在大型服务器上这个比例并不现实。比如一台192G内存的数据库服务器你给它配384G的Swap纯属浪费磁盘空间而且根本用不到。我习惯的做法是内存小于4G的小机器Swap给4到8G16G内存的常规通用服务器Swap给4到8G内存32G以上的大内存服务器除非有特殊应用否则甚至可以不开Swap。最重要的是撑住短期内存尖峰而不是追求1:1甚至2:1的比例。6. 常见故障排查实录这些坑我基本都踩过在实际操作存储这一章的内容时新手和老手遇到的问题是截然不同的。新手卡在命令记不住、步骤搞混老手则更多栽在一些平时想不到的细节上。这里把我印象最深的几类故障和排查过程整理出来。第一类是“设备明明存在却无法创建PV”。pvs里看不到新盘lvm的报错是不识别设备。排查的时候优先用 lsblk 和 fdisk -l 看设备是否被系统识别。很多时候是因为新盘在虚拟机里忘了做磁盘扫描需要刷新设备列表。尤其是VMware、KVM环境新加的虚拟磁盘往往不会立即出现在系统里要么重启要么通过命令重新扫描SCSI总线。第二类是“VG卷组空间充足却还是扩容失败”。vgs显示Free还有很大空间但 lvextend 时报错说没有足够空闲空间。这种情况大概率是因为卷组里的物理卷是多个不同的PV而逻辑卷有“条带化”或“连续分配”的属性导致容量分配受物理卷碎片限制。解决办法是放宽分配策略限制或者干脆新建一个逻辑卷做软链接。第三类是“fstab写错导致重启失败”。这是我前面反复强调的坑。别以为这是低级的错误生产环境中很多人因为赶时间写完fstab就直接把服务器重启了结果开机进紧急模式。这里分享一个有效习惯每次改完fstab先跑 systemctl daemon-reload 和 mount -a再重启。mount -a 会按照fstab的内容尝试挂载所有未挂载的文件系统如果语法有问题会立刻报错正是提前暴露问题的机会。第四类是“xfs_growfs 报错设备忙”。这个现象一般出现在你想对被某进程持续占用的目录做在线扩容时。虽然 xfs_growfs 支持在线扩容但有些版本的实现和特殊环境里会有限制。通常不用慌检查一下是不是有进程把挂载点完全独占常用的排查工具是 lsof 和 fuser。必要的时候需要协调业务窗口短暂停服再操作。故障现象可能原因优先排查方向pvcreate 不识别设备新盘未扫描/未分区lsblk、dmesg、fdisk -lvgextend 报错找不到PV/dev/sdc1 未执行 pvcreatepvs 查看PV状态lvextend 提示空间不足VG有空间但分配策略受限vgs、lvdisplay 查看PE分配fstab 改完开机失败字段写错、挂载点不存在mount -a 提前验证xfs_growfs 报设备忙文件系统被进程占用lsof、fuser 定位占用进程Swap重启后失效未写入fstabcat /etc/fstab 检查第五类是“扩容后df容量没变”。这个问题前文已经点破只扩了逻辑卷没扩文件系统。但还有一种情况容易被忽略就是对文件系统类型判断错误。你是xfs但是用了resize2fs虽然有可能不报错但实际没有任何效果还浪费了执行时间。所以我每一次做扩容操作执行命令前都强制自己跑一次 df -hT 确认类型再决定用哪条命令。7. 从实战角度给这一章做个收尾RH134第八章这套存储栈管理的知识说到底是所有Linux服务器运维的地基。这一章学得扎实与否直接决定了以后排查问题时的思路是否清晰。我以前带过不少新人教命令的时候大家都能跟得上但一到现场就手足无措根本原因就是不知道当前问题出在堆栈的哪一层。分享一条我自己的操作习惯。每次接到跟存储相关的工单第一步永远是先跑三个命令df -hT、lsblk、vgs。df看文件系统层lsblk看物理设备和分区层vgs看LVM卷组层。三个命令看下来基本就能定位问题在哪个层面了。千万别一开始就盯着某个命令反复试先把问题范围缩小再深入具体层。这个排查思路用到任何一台机器上都成立。另外这一章学完也可以顺手把家里的虚拟机练起来——找一台测试机加两块虚拟磁盘自己动手把LVM从建PV到做逻辑卷再扩容整个流程走一遍。练到你闭着眼睛都能知道每一条命令的作用和顺序RH134考试里这部分的分数就稳了真实运维中这类操作也就不会再慌了。