资讯动态

RHCE存储管理实战:LVM逻辑卷、swap交换空间与dd命令全解析

发布时间:2026/10/21 21:46:59 来源:尧图企业网站定制
RHCE 第六天按课程节奏该轮到存储管理这块硬骨头了。LVM逻辑卷、swap交换空间、dd命令初始化这三个知识点在实际运维里属于“天天用得上但很多人一知半解”的类型。尤其是LVM几乎成了生产环境服务器分区方案的默认选择swap虽然平时低调但内存跑满那一刻它就是系统的最后一道保险dd更是让人又爱又恨——参数不复杂功能很强大可一旦方向搞反瞬间就能让你体验到“数据全没”的酸爽。这篇文章我会把这三个主题串起来讲从设计思路到实操命令再到排障经验和坑点记录完全是按我实际维护服务器时的套路来梳理的。不管你是正在备考RHCE还是刚转运维岗需要快速上手服务器存储配置这篇文章都能给你一套可以直接照搬的办法。1. 整体设计与思路拆解先说LVM。很多人第一次接触LVM都会有个疑问服务器装系统的时候直接用分区不就好了吗为什么非得加上这一层这个问题的答案得从实际运维痛点说起。传统的MBR分区分好了之后分区大小就固定死了。比如你给某系统分了一个100G的/data分区用着用着发现不够了这时候怎么办三种选择一是找业务停机窗口把数据备份出来重新分区再把数据拷回去——过程繁琐且停机时间长二是想办法做个软链接把数据引流到别的分区——但这对应用来说是治标不治本而且数据路径变了对后续维护都是隐患三是加新硬盘挂载到新目录让应用改路径——如果应用支持还好不支持就只能干瞪眼。LVM的逻辑就是把这层“分区大小固定”的物理限制给解耦了。它的核心架构分三层你是老板手里的钱物理硬盘放进了公司账户卷组然后按项目需求从公司账户里划出预算逻辑卷。当某个项目预算不够了可以从公司账户里直接追加也可以往公司账户里再注资加新硬盘更可以砍掉别的项目的预算缩减逻辑卷全程不影响项目本身的运作。换到系统层面LVM的管理对象就是物理卷PVPhysical Volume、卷组VGVolume Group、逻辑卷LVLogical Volume。PV就是打上LVM标签的物理分区或整块磁盘VG是多个PV聚合出来的“存储池”LV是最终从VG里划出来给系统直接使用的逻辑分区。再说swap。swap的作用理解起来其实不复杂内存不够用的时候内核会把暂时不活跃的内存页暂时挪到swap区域里腾出物理内存给更需要的进程。这个机制对于稳定性来说非常关键尤其是生产环境中跑数据库、Java应用这类内存大户如果swap完全没有一遇到内存波动就可能触发OOM内存溢出直接把进程杀掉。但swap不是越大越好这个后面实操里会细说。分配swap的方式有两种传统的swap分区和更灵活的swap文件。两种方式各有适用场景我也会把配置方法都走一遍。最后是dd命令。dd本质上是一个底层的数据拷贝工具从输入文件读出数据写入输出文件。因为它直接操作的是数据流和存储设备所以它既能用来创建指定大小的大文件又能在设备层面进行初始化操作——比如磁盘清零、写入引导数据、做备份镜像。在RHCE课程里dd经常和LVM、swap甚至文件系统创建配合起来使用比如用dd快速生成一个固定大小的文件作为swap文件源或者把整个PV区域清空重新开始。这三个知识点放在同一天不是巧合LVM做的是空间的动态规划swap管的是内存的底层兜底dd是存储操作中的底层工具。理解了设计意图再去敲命令每一步就都知道自己在做什么了。2. 核心细节解析与实操要点2.1 LVM三层结构PV/VG/LV到底怎么协作我要不厌其烦地强调一遍这三层结构因为考试、面试、实际排障全都在跟这三个概念打交道。PV物理卷块设备的分区或者整块裸盘被pvcreate标记为PV。PV是LVM的最小存储单元记录着该设备的基本元数据。VG卷组由一个或多个PV组成VG把多个物理磁盘的存储空间汇聚成一个统一的大池子LV从这个池子里划空间。LV逻辑卷从VG里按需分配出来的逻辑存储空间格式化后挂载使用。LV在系统中的设备路径是/dev/卷组名/逻辑卷名。打个比方VG是整个硬盘池LV是池子里捞出来的那些小桶。小桶不够了就再从池子里捞池子不够了就再往池子里丢新硬盘。这个设计的核心价值是“动态调整”。在线扩容LV是在生产环境里最常用的操作在线缩容虽然可以做但前提是文件系统支持ext4先收缩文件系统xfs不支持缩小而且要非常小心。这个前面已经提醒过了后面还会再提。PV、VG、LV对应的创建命令也非常直接pvcreate /dev/sdb1 /dev/sdcvgcreate vg_data /dev/sdb1 /dev/sdclvcreate -L 10G -n lv_web vg_data查看状态的命令pvs、vgs、lvs这三个命令输出简洁信息一目了然是日常巡检和排障的第一排查工具。2.2 确认PE大小与VG容量上限PEPhysical Extent是LVM分配空间的最小单位类似于文件系统里的block。默认PE大小是4MiB创建VG时用-s参数可以调整。PE大小决定了VG能管理的总容量上限VG大小 PE大小 × PE数量上限数量上限是65534。默认4MiB的PE最多管理256GiB的VG如果你有一块超过256GiB的盘要加入VG就得用更大的PE比如vgcreate -s 8M或16M。实操中我建议一步到位容量不确定会不会超过256G的机器直接-s 16M反正PE大一点对空间利用率几乎没有影响。PE大小也可以通过vgdisplay查看PE Size字段确认。2.3 swap分区的设置原则与容量评估swap空间设置多少合适网上各种说法都有我给出一个生产环境中经过验证的参考原则物理内存小于2Gswap设为物理内存的2倍物理内存在2G到8Gswap设为物理内存大小即可物理内存超过8Gswap设为物理内存的一半但不需要超过16G如果服务器上跑的是Oracle数据库、MySQL这类对内存非常饥渴的服务并且分配的buffer pool/内存指标本身就很大swap可以适当多给一些比如按数据库SGA或InnoDB Buffer Pool的大小再加几个G目的就是防止内存抖动期间OOM杀进程。swap分区方式适合磁盘上还有空余分区的场景swap文件方式则不需要额外分区灵活性更高尤其适合在云主机上临时扩展swap空间。两种我都会在实操里演示你以后实际遇到现场情况能直接对应上。2.4 dd处理初始化设备的正确姿势dd命令的基本格式dd if输入文件 of输出文件 bs块大小 count块数量常用的几个参数if输入文件可以是普通文件、设备文件、/dev/zero等特殊设备of输出文件同样可以是普通文件或设备文件bs一次读写多少字节块大小默认512字节一般我们设成1M或4Mcount读入的块数量与bs配合计算总大小statusprogress显示进度条大文件必用convfsync强制写入磁盘防止写到缓存就结束导致数据未完全落盘dd在初始化场景中最典型的使用方式有两个方向第一个方向是创建指定大小的文件。比如我要生成一个1G的测试文件dd if/dev/zero of/tmp/testfile bs1M count1024 statusprogress/dev/zero是Linux里一个特殊的“零数据源”一读就是一连串的0字节。用1M的块大小读1024次就得到了1G大小的文件。这比fallocate更通用尤其适合用来生成swapfile源文件。第二个方向是磁盘初始化。交接的旧硬盘需要清空数据、或者磁盘分区表损坏要重新做盘操作就是dd if/dev/zero of/dev/sdb bs4M statusprogress这样会把整个磁盘填满0分区表、文件系统标记全部被抹掉这块盘就回到了“一张白纸”状态。这个操作很危险也有点耗时后面会专门写避坑注意事项。3. 实操过程与核心环节实现接下来按实际生产环境的标准流程来走一遍。我建议你手头准备一台虚拟机分配三块磁盘/dev/sda跑系统/dev/sdb用来做LVM实验/dev/sdc用来划分swap分区。下面的所有命令我都会给出完整流程和预期输出方便你核对。3.1 LVM逻辑卷的完整创建与扩容第一步先对/dev/sdb整个磁盘直接创建PV。不需要先建分区LVM允许直接把整块裸盘作为PV前提是这个盘你不需要做分区操作pvcreate /dev/sdb创建好后用pvs确认[rootserver ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb lvm2 --- 20.00g 20.00g第二步创建卷组vgcreate vg_data /dev/sdbvg_data是卷组名可以随便起但建议用有意义的名字比如vg_it、vg_log别叫什么vg1、vg2这种无意义的。第三步在卷组里划分逻辑卷。这个场景模拟一台Web服务器一个逻辑卷挂载网站数据一个逻辑卷收集日志lvcreate -L 10G -n lv_web vg_data lvcreate -l 100%FREE -n lv_log vg_data第一条命令指定10G大小给lv_web第二条用-l 100%FREE把剩下的空间全部分给lv_log。用vgs和lvs确认结果[rootserver ~]# vgs VG #PV #LV #SN Attr VSize VFree vg_data 1 2 0 wz--n- 20.00g 0 [rootserver ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_log vg_data -wi-a----- 10.00g lv_web vg_data -wi-a----- 10.00g第四步格式化并挂载。这里有个重要决策用ext4还是xfsRHCE考试场景里两种都会出现我的建议是通用业务选xfsCentOS/RHEL 7及以上默认就是xfs性能好工具链成熟需要在线缩容的场景只能用ext4xfs不能缩所以我这里两个LV分别演示两种文件系统mkfs.xfs /dev/vg_data/lv_web mkfs.ext4 /dev/vg_data/lv_log然后挂载mkdir -p /data/web /data/log mount /dev/vg_data/lv_web /data/web mount /dev/vg_data/lv_log /data/log把挂载信息写入/etc/fstab保证重启后自动挂载。xfs用defaults参数ext4可以用defaults或者加上relatime、noatime/dev/vg_data/lv_web /data/web xfs defaults 0 0 /dev/vg_data/lv_log /data/log ext4 defaults 0 0保存后别急着结束测试一定要执行mount -a验证一下fstab语法有没有写错。这段实操我强调一下fstab写错重启后系统会进入emergency模式很多人在这里翻车。第五步动态扩容。业务系统上线后/data/web空间吃紧现在要从卷组里再划5G给lv_web。这个操作可以完全在线执行不需要卸载分区lvextend -L 5G /dev/vg_data/lv_web注意是5G表示增加5G不加号就是扩容到5G。扩容之后文件系统不会自动感知空间变化需要手动同步。xfs和ext4的命令完全不同特别容易搞混# xfs文件系统用这个 xfs_growfs /data/web # ext4文件系统用这个 resize2fs /dev/vg_data/lv_log敲完之后用df -hT核实一下看到/data/web变大扩容就完成了。3.2 手动创建swap分区分区方式传统分区型swap的前提是磁盘上还有空闲分区我这里拿/dev/sdc演示。第一步用fdisk给/dev/sdc创建分区。输入fdisk /dev/sdc交互命令如下n # 新建分区 p # 主分区 1 # 分区号 回车 # 默认起始扇区 2G # 指定分区大小为2G t # 修改分区类型 82 # Linux swap类型 w # 保存并退出用fdisk -l或partprobe让内核重新读取分区表partprobe /dev/sdc第二步把分区格式化成swap并启用mkswap /dev/sdc1 swapon /dev/sdc1用free -h确认swap容量已经增加了。第三步写入fstab实现开机自启/dev/sdc1 swap swap defaults 0 0依然是那句老话写完mount -a验证防止重启后发现起不来。swap分区方式的优点管理方便一个分区就是一个独立元数据区缺点分区方案调整起来不灵活比如想缩减swap分区容量就比较麻烦要先用swapoff关闭再用fdisk调整。3.3 创建swap文件的备选方案swap文件方式其实更适合现代运维环境尤其是云服务器上原有swap分区大小不够临时加量不需要动磁盘分区表。第一步生成指定大小的swapfile。这里就用标题里说的dddd if/dev/zero of/swapfile bs1M count2048 statusprogress这样就生成了2G的/swapfile。为什么用dd而不用fallocate虽然fallocate更快但某些文件系统老版本的xfs上fallocate方式生成的swapfile会导致swapon报错。dd写出来的文件更稳妥。另外注意/swapfile建议放在根分区或一个空间充足的分区上别放在需要特殊挂载参数的分区里。第二步修改权限并格式化chmod 600 /swapfile mkswap /swapfile权限必须设置成600否则swapon会提示“insecure permissions”这是安全策略强制要求的。第三步启用并写入fstabswapon /swapfile echo /swapfile swap swap defaults 0 0 /etc/fstab验证方式一样用free -h。如果后续想卸载swap文件按顺序操作swapoff /swapfile rm -f /swapfile # 同时删除fstab里对应的一行逻辑很清晰不会破坏其他数据。3.4 dd创建指定大小文件与磁盘初始化dd创建指定大小文件的功能前面生成swapfile已经用过了。我再补充一个更技术的场景在一个刚接手的服务器上需要快速校验某块盘是否存在坏块或确认盘是否可写可以用dd往该盘写一个定长文件测试dd if/dev/zero of/data/testfile bs1M count512 oflagdirect statusprogressoflagdirect跳过缓存直接写磁盘这样测出来的磁盘性能真实可靠。写完后记得删掉测试文件别留在线上环境占空间。初始化场景再强调一下单块磁盘整体清空dd if/dev/zero of/dev/sdb bs4M statusprogress convfsync清空PV元数据不需要全盘清零pvremove /dev/sdb完全抹掉卷组信息vgremove vg_data其中pvremove和vgremove是更精确的撤销LVM的操作dd属于“物理清零物理删除”级别的重操作。生产环境不建议动不动就dd整块盘除非数据确实不需要了而且要彻底销毁。4. 常见问题与排查技巧实录4.1 VG剩余空间为0扩容LV时报“Insufficient free space”这是最常遇到的错误。排查思路vgs lvs vgdisplayvgs查看VG剩余空间VFree列。如果确实是0就需要加新盘或者从别的LV里回收空间。加新盘流程pvcreate /dev/sdd vgextend vg_data /dev/sdd lvextend -L 10G /dev/vg_data/lv_web xfs_growfs /data/web这个流程熟练之后可以一气呵成而且整个扩容过程不宕机、不影响业务生产环境非常管用。回收空间时必须小心xfs不支持在线缩容ext4可以缩但会涉及磁盘整理。生产环境我几乎不缩LV宁可用工具分析出磁盘占用率不高的目录引导业务方清理也不去缩减文件系统。这个原则一定要守住。4.2 swap无法启用文件系统类型不对或权限问题用swapfile方式时swapon /swapfile报错绝大多数情况是文件权限不对或者文件所在文件系统不支持交换文件类型。先执行ls -lh /swapfile chmod 600 /swapfile再执行swapon。如果还是不行查看file /swapfile确认输出是“Linux swap file”如果不是说明mkswap之前文件有问题重新用dd生成再试。注意别把swap文件放到LVM的xfs逻辑卷里还带nouuid挂载选项这种情况内核不允许加载。用普通挂载选项就没问题。4.3 dd误操作写到整块磁盘导致数据丢失怎么办一定要明确dd没有撤销选项没有回收站。if和of写反或者of直接指向了系统盘数据就是真的没了。如果确实发生了第一步就是停止写入操作立刻只读挂载该盘尝试抢救数据如果盘已经覆盖了大量数据基本上只能找备份了。所以我的实操习惯是在敲dd命令前反复确认of目标的设备名绝对不裸敲大范围写设备前先lsblk看清楚盘符再干生产环境写磁盘前先umount目标分区如果卸载不了就强制不上sync谨慎再谨慎4.4 开机后LVM卷组不激活有种情况是LVM元数据正常但重启后VG没有自动激活导致挂载失败。排查命令vgscan vgchange -ay vg_data然后执行mount -a。这个现象多见于多路径存储环境或某些初始化模块加载顺序问题。如果每次开机都要手动激活可以在rc.local或systemd服务里加入vgchange -ay。但正常单机环境遇到的不多遇到时先检查/etc/fstab是否引用了UUID还是设备路径——用UUID更靠谱。5. 边界场景与经验心得5.1 LVM与云平台快照备份的组合使用很多人以为有了LVM动态扩容就不需要备份了这是很危险的想法。LVM本身不提供数据冗余它只是一个空间管理机制。生产环境中的数据安全我觉得必须依赖备份。在云环境中对云磁盘做快照之前如果该盘上挂的是xfs逻辑卷建议先执行一次xfs_freeze或者直接对LV打LVM快照再备份确保文件系统处于一致状态。LVM快照的用法是lvcreate -L 2G -s -n lv_web_snap /dev/vg_data/lv_web创建后立刻挂载快照备份用完删除快照umount /dev/vg_data/lv_web_snap lvremove /dev/vg_data/lv_web_snap这个操作对在线业务影响极小是我个人很推荐的一种低扰动备份手段。5.2 手动创建swap时的一个小坑UUID重复如果你用分区方式创建swap并且在复制分区或云主机克隆的时候没重新设置UUID两个swap分区拥有相同的UUID会发生开机时系统错误地启用多个swap分区。我在实际环境里就碰到过一次克隆了一台虚拟机后swap总是挂载异常最后发现是fstab里用UUID指定的swap分区和另一块盘上的分区UUID重复了。解决方案也简单swapoff -a mkswap -U random /dev/sdc1 blkid然后更新fstab里的UUID。做完这个操作swap就稳定了。别嫌麻烦克隆虚拟机之后这个排查一定要做。5.3 一台机器到底需要几个swap很多人默认系统装好自带一个swap分区就够了实际上不太够。高并发Web服务器或数据库服务器建议swap容量保持在一个比较充足的水平并且考虑做两个swap比如一个在系统盘分区一个在数据盘目录里作为swapfile。这样即使系统盘故障另一个swap还能顶住。当然这只是我的建议实际情况要评估业务压力。5.4 别把swap当成内存的救世主我见过有人把swap设成64G甚至更大理由是防止内存OOM。说实话swap只能缓解内存压力不能替代内存。当系统频繁使用swap时说明内存已经严重不足这时候往往服务器已经出现性能断崖——swap读写性能比内存差几个数量级。正确做法是先监控内存使用率发现swap使用率持续升高立刻评估扩容物理内存或优化应用的缓存策略而不是无脑堆swap。生产环境里swap多用于兜底和应对短时尖峰靠它长期运行就是一个灾难了。5.5 dd、LVM和swap结合的综合场景讲个真实操作过的场景某台服务器突然内存告警检查后发现swap分区只有一个很古老的2G分区几乎写满了。当时磁盘还有空闲我直接用dd生成了一个4G的swapfiledd if/dev/zero of/swapfile_extra bs1M count4096 statusprogress chmod 600 /swapfile_extra mkswap /swapfile_extra swapon /swapfile_extra临时顶住压力然后加了物理内存。这类临时手段在自己的服务器上演练一遍真到生产环境遇到突发情况不会手足无措。如果你是正在备考RHCE我建议一个完整的自测实验加一块20G新盘创建PV、VG分别划分一个xfs LV和一个ext4 LV把两个LV挂载到目录并写入测试数据其中xfs LV在线扩容后再growfs确认数据不丢用dd创建一个2G文件mkswap后启用重启用swap分区方式配置swap清理所有LVM卷组、PV和swap这一套走完RHCE存储部分的实操基本就稳了。还有个小建议考试和工作中敲LVM相关命令时养成先pvs、vgs、lvs再操作的习惯先看清楚状态永远错不了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑