ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RHCSA结课作业实战:从LVM扩容到SELinux排障的完整指南

RHCSA结课作业实战:从LVM扩容到SELinux排障的完整指南 1. RHCSA结课作业的本质不是期末考而是一次能力验收先说结论RHCSA结课作业这件事很多人从一开始就理解偏了。你以为它是课程结束后的一张考卷用来检验你背了多少命令、记住了多少参数实际上它是红帽认证体系里最典型的一次“行为验收”——考官和老师真正想看的不是你答对了多少题而是你在无人指导下能不能独立把一台干净的系统从安装到配置、再到故障排查完整走下来。RHCSA全称Red Hat Certified System Administrator对应的是EX200考试。它考的不是“你知道什么”而是“你会在现场做什么”。这一点在结课作业里体现得特别明显题目通常不会太偏、太怪基本都是生产环境里管理员天天会碰到的活儿比如创建用户并配置sudo权限、给新磁盘做LVM逻辑卷、调SELinux上下文让服务能跑起来、用systemd写一个开机自启的服务、用Podman跑一个容器并且保证重启后数据还在。但正因为都是“基本操作”反而特别能暴露问题——命令记得不牢会卡壳配置文件写错一处会起不来SELinux拦了服务你连日志都找不到在哪。所以我在做结课作业时给自己定的目标很简单不在于拿多高的分而在于把每一个操作都当成在真实服务器上干活做完一项就验证一项全部做完之后重启系统再做一遍验证。这套思路也贯穿了下面整篇文章。这篇文章写给谁三类人正在学RHCSA、准备做结课作业或考EX200的学员已经工作、但Linux基础不牢想系统补一遍的运维新人以及那些带学生做结课作业的讲师——你也许可以参考我用“20个实验覆盖全部考点”的方式来设计作业。下面所有内容都是我实际跑过、踩过坑之后整理出来的步骤可以直接照着做坑我也尽量提前帮你标出来了。2. 结课作业的考点边界先把“考什么”这件事彻底搞清楚做作业最怕的就是方向错了。有的同学一上来就去研究内核编译、源码安装这种偏门操作结果考试核心的SELinux、LVM扩容却没练熟。RHCSA的考点范围其实是公开且相对固定的以当前主流版本RHEL 9EX200来看覆盖面大致可以分为下面几个模块。2.1 六个必考模块与它们的分量模块典型任务难点程度结课作业中通常怎么考基础命令与文件操作文件查找、重定向、管道、打包压缩、权限修改低单独出题少但所有操作都会用到用户、组与权限创建用户、组、sudo授权、密码策略中必考且常与SELinux上下文结合存储管理LVM、Swap、自动挂载、文件系统扩容高必考xfs与ext4扩容命令不同是经典坑SELinux与安全上下文修改、布尔值、端口标签高必考且常以“服务起不来”的形式出现systemd与定时任务编写service单元、启用开机自启、timer定时器中必考cycletimer替代cron是RHEL 9新趋势网络与容器nmcli配置连接、firewalld规则、Podman容器中高容器是RHCSA 8以后的新重点必须练从我辅导过的学员来看最容易丢分的地方反而不是那些听起来高级的模块而是SELinux的排障思路和LVM扩容时工具选错这两个点。因为它们需要理解机制而不是死记命令。后面我会各用一整节来拆解。2.2 关于版本的几个提醒如果你用的是RHEL 9有几点必须提前知道默认文件系统是XFS扩容逻辑卷后要用xfs_growfs而不是resize2fs。如果你把逻辑卷格式化成了ext4比如专门为了做练习才用resize2fs。这两个命令用反了会直接报错。RHEL 9默认SSH服务叫sshd但很多文档还习惯写sshd.service实际没问题只是命名要写对。yum已经被dnf替代虽然yum命令还能用但考试环境里用dnf更保险。没有订阅的情况下dnf仓库默认是空的。练习时可以用Rocky Linux或AlmaLinux替代它们和RHEL完全二进制兼容考点一个不差。提示如果条件允许建议直接申请红帽开发者订阅Red Hat Developer Subscription个人用途免费能获得正版RHEL 9的ISO和仓库源。用官方系统练习心理踏实也避免考前换系统带来的环境差异。3. 环境搭建与作业设计20个实验覆盖全部核心考点结课作业的承载形式一般是两种一是老师在虚拟化平台上给你一台带IP的干净系统让你SSH上去做配置二是你自己用VMware/VirtualBox搭一台虚拟机按照作业清单逐项完成最后写一份报告并演示。无论哪种一个合理的实验设计会直接决定你的复习效率。我给自己设计的是一套20个实验的清单照着这个清单练基本能覆盖EX200 95%以上的考点。下面是完整清单后面我会挑几块最难、最容易出错的展开讲。3.1 我的20个实验清单直接可抄用ISO镜像安装RHEL 9 minimal磁盘分区使用手动分区并选用LVM配置静态IP、主机名、DNS用nmcli完成并验证重启不丢创建用户tom、jerry并加入附加组配置sudo规则tom免密sudo配置密码策略新用户密码有效期90天提前7天提醒本地仓库配置挂载ISO镜像配置dnf仓库文件安装vim、tcpdump等包使用dnf查询、安装、重装、卸载软件包并查看依赖关系自定义systemd服务写一个简单的shell脚本如记录开机时间做成service并设置开机自启systemd timer定时任务每天凌晨2点执行日志清理脚本新增一块10GB虚拟磁盘创建物理卷、卷组划分5GB逻辑卷挂载到/data格式为ext4在上面这个逻辑卷上扩容2GB用resize2fs在线扩容验证数据不丢再新增一块磁盘创建逻辑卷挂到/data2格式为xfs用xfs_growfs扩容和实验10形成对比添加2GB swap分区并写入fstab使其永久生效修改SELinux上下文把/opt/web目录下的HTTP文件打上httpd_sys_content_t标签selinux开启状态下能正常serve配置SELinux布尔值允许httpd访问网络httpd_can_network_connect对比修改前后行为配置firewalld放行8080端口做富规则只允许某个网段访问用semanage为自定义端口如82添加http_port_t标签让httpd可以监听非标准端口Podman拉取nginx镜像运行容器并映射端口用-v挂载宿主机目录实现数据持久化日志排查模拟一个服务启动失败通过journalctl -xe、systemctl status、/var/log/messages三层手段定位问题tar备份与cron定时备份用tar打包/etc目录排除缓存文件用cron或timer每天执行最终自测全部配置完成后reboot逐项验证每一项配置是否依然生效。3.2 为什么把实验设计成闭环而不是孤立的“命令练习”注意到上面的实验不是零散的。每两到三个实验会构成一个小的闭环实验3和4是“用户与密码策略”闭环实验5和6是“软件管理”闭环实验9、10、11是“LVM”闭环实验13、14、16是“SELinux”闭环。这样做有一个很大的好处——当你练习扩展现有逻辑卷时你同时也要考虑挂载点、fstab、文件系统类型这三个问题这三者恰好就是考试中最容易连环踩坑的地方。我自己见过太多人练LVM的时候是“新建分区→建PV→建VG→建LV→格式化→挂载”每一步都单独执行全程没有失败过特别自信。结果一到结课作业题目一改成“扩容到100%用完的空间”或者“文件系统是xfs”当场就懵了。因为孤立练习练的是“命令语法”闭环练习练的是“决策能力”。4. 核心考点实操拆解一LVM扩容与文件系统工具的选型逻辑这一节可能是整篇文章里最“救命”的一节。因为LVM这部分的坑我在带学员时几乎每批都会遇到。4.1 完整流程从新磁盘到扩容完成假设你加了一块10GB的新盘系统识别为/dev/sdb。标准流程如下# 1. 识别新磁盘 lsblk # 2. 创建物理卷 pvcreate /dev/sdb # 3. 创建卷组名字取vgdata vgcreate vgdata /dev/sdb # 4. 创建8GB逻辑卷取名lvdata格式化为xfs lvcreate -L 8G -n lvdata vgdata mkfs.xfs /dev/vgdata/lvdata # 5. 挂载并写入fstab mkdir -p /data mount /dev/vgdata/lvdata /data echo /dev/mapper/vgdata-lvdata /data xfs defaults 0 0 /etc/fstab这里有一个细节很多人第一次会忽略fstab里不要写/dev/vgdata/lvdata这种容易混淆的路径。虽然可用但更规范的是写/dev/mapper/vgdata-lvdata或者用UUID。考试时两种都能过但生产环境强烈建议用UUID避免设备名漂移导致系统起不来。接下来扩容到10GB# 扩展逻辑卷 lvextend -L 10G /dev/vgdata/lvdata # 关键XFS用xfs_growfs指定挂载点ext4才用resize2fs指定设备 xfs_growfs /data4.2 xfs_growfs 和 resize2fs 的区别为什么用错必挂这是RHCSA考试里最有区分度的一个知识点。这两个命令虽然都是在“让文件系统认到新的空间”但工作对象完全不同xfs_growfs只能在线扩容不能缩容而且它接受的参数是挂载点不是设备名。底层是XFS的在线调整机制。resize2fs针对ext2/ext3/ext4既可以扩容也可以缩容它接受的是设备路径如/dev/vgdata/lvdata。用错了会出现什么情况你在一个XFS文件系统上执行resize2fs /dev/...大概率会报错The file system is already 2621440 blocks long. Nothing to do!或者直接提示Bad magic number in super-block while trying to open。第一次遇到这个报错的人会以为是逻辑卷没扩成功反复lvextend其实逻辑卷早就够大了是工具用错。实操经验考试或者作业里只要看到题目说“将逻辑卷扩展到xxx大小”先别急着敲命令用df -T看一眼文件系统类型。这一步花不了5秒钟能帮你避开最大的一个失分点。4.3 关于fstab的一个隐蔽注意事项如果你在替换原有的挂载配置比如作业要求你重新挂载到一个新目录写入fstab之后千万不要只执行mount一定要执行mount -a或者findmnt -verify检查一下。fstab写错一个字段重启系统会进入emergency mode。我见过很多学员在结课作业演示时栽在这一步当场重启画面直接变成Welcome to emergency mode那个场景真的很难救回来。检查fstab的方法很简单# dry-run方式验证fstab是否可用错误会直接报出来 findmnt --verify --verbose输出Successfully verified才是安全的。5. 核心考点实操拆解二SELinux开启状态下的排障链路如果是RHCSA结课作业那SELinux这块几乎一定会以“某种方式”出现在题目里。因为红帽认证和市面上其他Linux认证的核心区别就在这——SELinux不是可以绕开的功能而是必须理解和利用的安全机制。5.1 一道经典作业题的全过程httpd无论如何都起不来我当年做结课作业时抽到的题目大致是这样的“系统已安装httpdSELinux处于Enforcing模式。将/etc/httpd/conf/httpd.conf中的监听端口改为82启动httpd服务。要求SELinux不被禁用系统重启后服务依然正常。”看题目时觉得很简单改个端口而已。但实际操作时service httpd start之后服务压根起不来systemctl status httpd显示failedjournalctl里的关键内容是Permission denied。如果不了解SELinux八成会去检查httpd.conf的语法但你改的每一项都是对的。正确的排查链路是这样的# 第一步确认SELinux状态 getenforce # 第二步看服务为什么起不来 journalctl -xe | tail -50 # 第三步查SELinux的拒绝日志 ausearch -m avc -ts recent关键在第三步。ausearch -m avc -ts recent的输出里会明确告诉你httpd被拒绝监听tcp端口82因为端口82没有http_port_t的标签。看到这里问题就清楚了SELinux不光管文件的上下文还管端口上下文。非标准端口需要显式告诉SELinux这个端口允许httpd使用。解决方案semanage port -a -t http_port_t -p tcp 82然后重启httpd一切正常。但这里还有一个小坑修改了端口标签之后你需要确认httpd是否监听到了82端口。用ss -tlnp | grep :82能看到就没问题。5.2 文件上下文为什么你明明有权限nginx却说403SELinux另一类高频考题是文件上下文。典型场景你把网站文件放在了/opt/web目录下nginx或httpd配置的DocumentRoot指向这里服务启动正常但访问时返回403 Forbidden。即使你把文件权限改成了777也没用。原因SELinux不是UNIX权限它有自己的一套“标签”体系。/opt目录下的文件默认标签是default_t而httpd只能读取带有httpd_sys_content_t等标签的文件。两个标签不同访问自然被拒。# 查看当前上下文 ls -Z /opt/web/index.html # 输出 typical: unconfined_u:object_r:default_t:s0 # 递归修改上下文件标签 semanage fcontext -a -t httpd_sys_content_t /opt/web(/.*)? restorecon -Rv /opt/web # 再次验证 ls -Z /opt/web/index.html # 此时应为 ...:httpd_sys_content_t:s0这里值得多说一句semanage fcontext是完整的规范做法。它的好处是即使你以后执行了restorecon比如文件被重新标记规则依然保留文件会再次打上正确的标签。而如果你偷懒直接用chcon修改那么一旦文件被re标记改动就丢了这在作业里很容易被老师当场验证出来。5.3 最实用的SELinux自查命令组合做SELinux题目时我最推荐的排查顺序是getenforce——先确定当前的模式journalctl -xe——先看服务的直接报错ausearch -m avc -ts recent——查AVC拒绝日志这是SELinux“亲口告诉你为什么拒绝”的最直接证据sealert -a /var/log/audit/audit.log——如果有图形环境用这个工具能拿到人类可读的修复建议文字环境下也可以装setools工具包辅助分析。提示很多学员一遇到SELinux就想到setenforce 0。这是一条绝对的红线作业题目只要写了“不得禁用SELinux”这么做直接不合格。正确的态度是——把SELinux当成一个戴着手套工作的场景学的是“怎么让它在约束下干活”而不是把整只手套摘掉。6. 核心考点实操拆解三systemd服务单元与timer定时器RHCSA 9的结课作业systemd是必考的而且RHEL 9相比RHEL 7/8对systemd timer定时器的考核权重明显提升了。很多老师上课时还在讲传统crontab但考试风向已经变了——管理定时任务优先用systemd timer。6.1 手写一个标准的service单元附带测试脚本作业里最常见的形式是让你把某个脚本做成服务并设置开机自启。先写测试脚本假设功能是每次启动时把当前时间追加到/var/log/boottime.log#!/bin/bash echo $(date %Y-%m-%d %H:%M:%S) system booted /var/log/boottime.log然后写service单元放在/etc/systemd/system/boottime.service[Unit] DescriptionRecord boot time to log Afternetwork.target [Service] Typeoneshot ExecStart/usr/local/bin/boottime.sh StandardOutputjournal [Install] WantedBymulti-user.target启用并验证chmod x /usr/local/bin/boottime.sh systemctl daemon-reload systemctl enable --now boottime.service systemctl status boottime.service cat /var/log/boottime.log这里有个细节值得展开Typeoneshot和Typesimple的区别。如果你给脚本类型的服务写了simplesystemd会认为服务启动后立即就算“active”不会持续追踪脚本是否执行完毕。对一次性脚本这会导致systemd可能在脚本还没跑完时就报“active (running)”看着别扭但不影响。更规范的是用oneshot它专门针对“做一件事就退出”的服务类型。另外写完任何unit文件后必须执行systemctl daemon-reload这条命令很多人总是忘记。不执行的话systemd用的还是旧配置你改了参数也不会生效而且没有任何报错提示——这种“假成功”状态比直接报错更坑。6.2 systemd timer用日志清理脚本理解定时任务新写法再看timer。假设你要每5分钟检查一次磁盘使用率超过90%就把旧的日志清理掉。传统写法是写个crontab但RHEL 9的推荐姿势是timer先写一个清理脚本/usr/local/bin/cleanlog.sh#!/bin/bash find /var/log -name *.log -mtime 7 -exec truncate -s 0 {} \;再写servicetimer调用的服务不需要有Install段也不需要enable开机自启因为它是被timer拉起来的[Unit] DescriptionClean old log files [Service] Typeoneshot ExecStart/usr/local/bin/cleanlog.sh最后是timer文件/log-clean.timer[Unit] DescriptionRun log cleanup every 5 minutes [Timer] OnCalendar*:0/5 Persistenttrue [Install] WantedBytimers.target启用方式有点不一样你需要enable的是**.timer**不是.servicesystemctl daemon-reload systemctl enable --now log-clean.timer systemctl list-timers --all这里有三个关键点OnCalendar*:0/5表示“从每小时的0分开始每5分钟执行一次”。它的语法体系更复杂但更精确比cron的表达能力强。如果你需要更细致的例子比如“每天凌晨1点30和中午12点各跑一次”可以写成OnCalendar*-*-* 01:30:00,12:00:00Persistenttrue的含义是如果系统在预定时间点恰好是关机状态那么下次开机时立即补执行一次。cron默认不提供这个能力journal里会有明确记录验证timer是否真的触发了别只靠systemctl list-timers最好用journalctl -u log-clean.service看看实际的执行日志。6.3 开机自启的终极验证reboot这一条我每次带学生都要强调但每次总有人偷懒。做完任何与“开机自启”有关的作业唯一有效的验证方式是重启。有的同学不重启就执行一个systemctl is-enabled xxx看到输出enabled就以为完事了。但“enabled”只代表systemd知道“下次开机要启动它”不代表它真的能起来。万一你的unit文件里写错了路径或者脚本依赖的服务比你想象的晚启动reboot之后它照样起不来。我自己的习惯做法是所有配置做完、状态看着都正常之后刻意执行一次reboot然后一项一项验证SSH能连上吗不能连检查网络配置有没有变成开机自启、主机名对不对自定义服务在跑吗不在跑去看journalctl -u找出真实原因LVM挂载点还在吗不在了检查fstab是否写错SELinux服务能对外服务吗访问不了去查AVC日志。在结课作业验收现场这台机器是当着老师的面演示的你一按回车之前先深吸口气——而我的习惯是多练习几轮reboot之后心里就真正有底了。7. Podman容器RHCSA 9新增重点也是作业里最容易被低估的一题RHCSA 9把容器纳入了必考范围主要是Podman。很多学员觉得容器是“docker的东西”应该没那么重要结果作业题直接要求你用Podman运行一个Web服务并挂载持久化数据当场就不淡定了。说实话这一题只要理解了思路反而是整张卷子里最稳定的得分点。7.1 用Podman跑nginx并做到容器删除后数据还在最经典的一道结课作业题用Podman运行一个nginx容器宿主机8080端口映射到容器80端口。将容器内的/usr/share/nginx/html目录挂载到宿主机/var/www/html保证容器删除重建后页面内容不丢失。操作如下# 1. 拉取镜像 podman pull nginx:latest # 2. 运行容器 podman run -d --name web -p 8080:80 -v /var/www/html:/usr/share/nginx/html:Z nginx:latest # 3. 验证 curl http://localhost:8080这里的-v /var/www/html:/usr/share/nginx/html:Z末尾的:Z是点睛之笔。它让Podman自动把宿主机目录的SELinux标签修改成容器可以访问的container_file_t。如果你不加这个选项在SELinux Enforcing模式下容器里的nginx几乎一定会报“Permission denied”。另外一个很实用但容易被忽略的操作是把容器配置成systemd服务保证开机自启。RHEL 9里推荐用podman generate systemd --new --name web -f自动生成unit文件生成的目录通常在当前目录把文件放到/etc/systemd/system/下再执行daemon-reload和enable即可。用--new参数生成的unit每次启动实际上是重新创建一个容器名字保持不变这样重启后不仅容器在挂载的数据也在非常契合“持久化”这个验收要求。7.2 验证持久化别只测curl要测“rm -rf之后”很多学员做到curl能出页面就认为容器这题完成了。但作业题里的考察重点是持久化你得主动做一次“破坏性验证”# 删除容器 podman rm -f web # 重新运行同样的容器 podman run -d --name web -p 8080:80 -v /var/www/html:/usr/share/nginx/html:Z nginx:latest # 再次访问还能看到你之前放入的页面吗 curl http://localhost:8080如果之前没做任何卷挂载这一步就会暴露问题页面恢复到nginx默认首页你写的内容全丢了。作业环境里当场演示rm和重新run老师对你的印象会完全不同——因为你证明了“为什么这样配置”而不只是“怎么配置”。7.3 Podman和Docker的差异顺便说一嘴用Podman完成作业的人心里要清楚它的几个特点Podman默认是无守护进程架构每条命令都是一个独立进程所以不存在“docker daemon没启动就全都不能跑”的情况Podman默认rootless模式普通用户就能跑容器不需要sudo但rootless模式下的端口映射有些限制小于1024的端口可能需要额外配置Podman与Docker命令高度兼容你按照docker的语法写出来的命令在podman里基本都能直接跑。这些差异不用跟老师讲太多但你自己要能说出来因为这能体现你真的理解了这个工具而不是只会照着敲命令。8. 结课作业的验收策略从“做完”到“做对”的自我核查方法最后聊一个很少被提到、但其实非常关键的话题做完一堆实验之后怎么确认自己真的做对了总不能每次都依赖老师来点评吧。我总结了一套自己在结课作业前的“验收清单”每次演示前我都照单走一遍。8.1 按“重启前验证重启后验证”双轨制检查重启前验证看的是“当前配置是否正确”重启后验证看的是“配置是否真正生效”。两者缺一不可。下面这张表是我常用的对照清单可以打印出来一条条勾。配置项重启前验证命令重启后验证命令网络配置nmcli connection showip addr 实际ping网关自定义服务systemctl status boottimecat /var/log/boottime.logLVM挂载df -h /datafindmnt /data或mount -aSELinux上下文ls -Z /opt/web/index.html用curl实际访问防火墙端口firewall-cmd --list-ports用nc或curl从另一台机器访问容器持久化podman pscurl localhost:8080sudo授权sudo -l -U tom用tom实际执行sudo命令8.2 时间分配考试级别的节奏感EX200考试时间一般是2.5小时题量25道左右。结课作业如果也是限时演示节奏控制就很重要。我的建议是把时间大致分为三段前20分钟通读全部题目把每道题里涉及的服务、文件路径、端口先写在一个草稿本上标注出哪些题会相互影响比如改了SELinux配置可能会影响后面容器的运行中间100分钟从简单到复杂逐题完成。我的顺序是先做用户与文件权限最基础最稳定再做软件和服务配置再做LVM和SELinux耗时长但值得投入最后做容器和综合验证最后30分钟集中验证。所有配置完成之后不急着交卷先做一次reboot然后逐个验证关键项目。如果验证中出了问题优先修复“网络、SSH、启动类”这种会影响全局的故障其次才修业务层面问题。8.3 一些零零碎碎但救命的细节命令历史别乱清。结课作业如果要求提交操作记录history里的翻页记录就是你最直接的证据。执行关键操作前先确定自己在正确的服务器上避免把实验系统搞乱。别把root密码搞丢了。如果作业要求设置root密码策略记得顺便在/root目录放一个密码记录的文本文件但注意保管好。忘记root密码进emergency mode救不仅浪费时间也容易在演示现场翻车。每完成一道题就顺手打开一个验证命令。不是所有老师都会接受“我说我配置好了”这种口头汇报他们更愿意看到一分钟内的实证。9. 写在最后做完这套作业你真正收获了什么回头看RHCSA结课作业这件事我觉得最有价值的不是那一份成绩单而是它逼着你把“以为会了”变成“真的会了”。我在做这套20个实验的过程中最深的体会有两条第一故障排查远比配置命令重要SELinux和systemd的报错信息会替你指出90%的问题所在关键是你有没有耐心去读日志而不是凭感觉乱试第二验证是配置的一部分不是配置之后的事一个没有验证过的配置跟没做没有任何区别只有经过重启考验和实际访问验证的东西才算真正落在系统里。如果你正在准备结课作业或者打算考RHCSA我给的建议只有一个不要贪多把每一个实验都做透。LVM扩容就把xfs和ext4都试一遍SELinux就把“文件上下文、端口上下文、布尔值”三个维度都摸一遍systemd就故意写错一个参数然后用journalctl把它查出来。把出错当成练习的一部分你在正式作业或者考场上反而会变得越来越稳。最后再分享一个小技巧在做完所有配置之后产生一个习惯——心里问一句“如果这台机器明天重启了它还是现在这副样子吗”能回答上这个问题你的RHCSA结课作业就已经有把握了。
返回列表