ARTICLE DETAIL

资讯详情

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

RHCSA第三次作业复盘:LVM、SELinux与systemd实战排错指南

RHCSA第三次作业复盘:LVM、SELinux与systemd实战排错指南 拿到RHCSA第三次作业的时候我心里其实有点不以为然。前两次作业无非是建用户、改权限、处理文本文件多敲几遍命令就能应付过去。直到把题目从头到尾看完我才意识到这次和之前完全不是一回事。考察范围一下从“会用命令”跳到了“会管系统”LVM逻辑卷、SELinux、systemd自定义服务、计划任务与日志轮转几乎每个模块之间都有联动错一处往往不是直接报错而是“看起来完全正常但结果就是不对”。这篇文章就专门来复盘这次作业包括我拿到手的题目、每一步操作、卡住的排查过程以及最后对照RHCSA考试总结的检查清单。如果你也在备考RHCSA或者正卡在培训机构的第三次作业附近这篇内容应该能帮你少走不少弯路。1. 第三次作业的分水岭这次练的不再是“打字速度”1.1 前两次作业和前两次作业的区别我所在的培训班前两次作业侧重的是“知道有这个东西并且能把它敲出来”。比如创建用户并设置密码、修改文件权限、用grep和awk处理文本、配置网卡IP这类任务老实说就是熟练度问题命令背下来了手速够快分基本能拿全。但第三次作业从题目设计上就有明显变化——它不再考单个命令而是考一条链路。举一个最直观的例子前两次作业里让你“创建一个用户”就是useradd加passwd。第三次作业里同样一个需求会变成“创建一个用户让他能通过SSH登录登录后只能访问指定目录同时这个目录还能被web服务读取而且所有配置重启后依然生效”。这就把用户管理、权限、SSH、SELinux、服务管理全串在了一起。任何一个环节理解不到位这道题就做不完整。1.2 我这次拿到的作业题目概览不同培训机构的第三次作业内容肯定不完全一样但核心模块基本绕不开存储、权限、服务管理这三块。我这边的作业一共五道题我先把题目和对应考点列出来后面每一章会专门展开讲题号题目要求核心考点我实际踩的坑1新加一块10G磁盘建立LVM逻辑卷并挂载到 /opt/data要求开机自动挂载分区、PV/VG/LV、fstab、SELinux上下文想当然以为xfs也能像ext4一样随意缩小2创建 /opt/webcontent 目录让user1可读写、user2可读同时保证httpd能正常读取该目录文件权限、ACL、SELinux、web服务普通权限全对了却完全忽略了SELinux上下文3部署一个简单的Python Flask应用要求用systemd托管开机自启进程崩溃后能自动拉起systemd unit文件、服务管理、防火墙unit文件里没写绝对路径服务起不来4为user3配置计划任务每天14:30执行备份脚本将 /etc 目录打包到 /backup并配置日志轮转cron、tar归档、logrotate脚本能手动跑cron就是不执行5配置防火墙允许外部访问Flask应用的5000端口并保证重启后规则依然存在firewalld、permanent规则、reload只加了permanent却忘了reload测试时一脸懵1.3 为什么第三次作业最容易拉开差距我个人体会是前两次作业的训练目标是“肌肉记忆”哪怕你不理解原理只要练的次数够多也能拿个不错的分数。第三次作业开始考“系统思维”要求你在脑子里把整个Linux系统的各个子系统串成一张图磁盘要经过分区、PV、VG、LV才到文件系统一个服务能不能被外部访问要同时看进程、监听端口、防火墙、SELinux、文件权限这五层一个配置能不能持久化要分别确认fstab、systemd enable、semanage、firewall-cmd permanent这些机制。这也是为什么很多平时基础不错的人到了第三次作业突然开始丢分。不是命令不会敲而是排错思路没有建立起来。下面几章我就用这次作业的完整过程把这几个典型场景再过一遍。2. LVM扩展一道题把存储链路串到了底2.1 第一版解法我知道所有命令但顺序错了题目其实并不复杂一块新加的10G磁盘要求创建LVM逻辑卷挂载到 /opt/data并且重启后自动挂载。我当时脑子里蹦出来的命令是 pvcreate、vgcreate、lvcreate、mkfs、mount自认为背得很熟结果操作到一半发现不对——我在没有创建分区的情况下直接 pvcreate /dev/sdb虽然也能成功但这种做法在考试和实际生产环境里都不规范。更关键的问题是我后来想在这个VG里再扩展一个逻辑卷时发现没留出扩展空间整块磁盘已经全部分配给了第一个LV。RHEL环境里最佳实践是如果一块磁盘后续可能要分配给多个LV分区阶段就应该做好规划比如10G分成两个5G分区分别建PV并加入不同VG或者用PE数量来控制LV大小。2.2 完整操作链路每一层都有必须守住的规矩规范做法从分区开始。用fdisk /dev/sdb进入交互界面依次做这些事# 创建分区类型选Linux LVM8e或输入lvm fdisk /dev/sdb # n - p - 默认起始扇区 - 指定大小或默认全部 - t - 8e - w分区做完用partprobe让内核重新读取分区表再用lsblk确认/dev/sdb1出现。接下来建立逻辑卷链路pvcreate /dev/sdb1 vgcreate vg_data /dev/sdb1 lvcreate -n lv_data -L 5G vg_data mkfs.xfs /dev/vg_data/lv_data挂载这一步有两个细节第一次做作业的人很容易忽略。第一挂载目录要先建好mkdir -p /opt/data第二为了开机自动挂载必须写入 /etc/fstab而且强烈建议用UUID而不是设备路径因为设备名在系统启动顺序变化时可能不稳定blkid /dev/vg_data/lv_data # 拿到UUID后编辑 /etc/fstab # 格式: UUIDxxxx-xxxx /opt/data xfs defaults 0 0 mount -a写完fstab后一定要执行mount -a验证语法是否正常。这个习惯救过我太多次因为fstab写错轻则恢复模式重则系统起不来。考试里挂着起不来的系统心态基本就崩了。2.3 复盘为什么我一开始把xfs当ext4用我在这道题上真正卡住的是后续一个扩展操作。作业加了一个小问如果LV空间不足应该怎么扩展。我习惯性地卸载文件系统然后想用resize2fs调整大小结果命令直接报错说“xfs不支持”。这才意识到RHEL默认的xfs文件系统只能扩容不能缩容而且扩容用的也不是resize2fs而是xfs_growfs。正确扩展链路是这样的# 假设又加了一块新盘 /dev/sdc fdisk /dev/sdc pvcreate /dev/sdc1 vgextend vg_data /dev/sdc1 lvextend -L 3G /dev/vg_data/lv_data xfs_growfs /opt/data # 验证 df -h /opt/data如果文件系统是ext4最后一步就要换成resize2fs /dev/vg_data/lv_data如果是xfs想缩小对不起没这个功能只能备份数据后重建LV恢复。这个知识点RHCSA考试里很爱用“判断题”的方式出现比如给你一个xfs逻辑卷让你缩小很多人直接上手resize2fs结果丢分。2.4 这道题在考试里的常见变体RHCSA考试不会考得那么“聊天式”但LVM是绝对的重点区域。常见考法包括把一块新磁盘加入已有卷组并扩展逻辑卷、给某个LV创建快照、修改LV大小后让文件系统自动适应。我这次作业之后自己又额外练了一遍“创建快照再挂载读取”因为考试很有可能用“备份一致性”这种场景包裹LVM知识点。顺便提一个排错心得如果你发现pvdisplay显示的PV大小和磁盘真实大小不一致多半是分区表没重新读取先执行partprobe再说别急着怀疑命令输错了。3. SELinux与文件权限的联合排查最值得复盘的一场实战3.1 题目场景权限全对httpd依然403第二题的题目描述很日常创建一个 /opt/webcontent 目录里面放一个 index.html要求web服务能正常展示这个页面同时user1对目录有读写权限user2只能读。我拿到题之后按部就班地做mkdir、chown、chmod、setfacl所有文件权限用ls -l检查都是对的用浏览器访问却始终403。当时我第一反应是httpd服务没起来systemctl status httpd一看服务是active的。第二反应是IP和端口问题curl http://127.0.0.1/也是403。服务没毛病、端口没毛病、文件权限没毛病那问题到底在哪折磨了快四十分钟才想起去看SELinux。3.2 完整排错链路从现象倒推到根因后来我把这套排错顺序固定了下来现在分享给你遇到web目录无法访问类问题基本都能覆盖# 第一步看服务状态和端口 systemctl status httpd ss -tlnp | grep 80 # 第二步看进程能不能读到文件用实际运行身份测试 sudo -u apache curl http://127.0.0.1/ sudo -u apache ls -l /opt/webcontent/index.html # 第三步查SELinux上下文 ls -Zd /opt/webcontent # unconfined_u:object_r:default_t:s0 -- 问题就在这里第三步一下子就暴露了根因/opt/webcontent 这个目录的SELinux类型是 default_t而 httpd 进程只被允许访问 httpd_sys_content_t 或 httpd_sys_rw_content_t 类型的目录。我的文件权限做得再对SELinux在更底层直接把访问拦掉了。正确的修复方式是给目录打上正确的SELinux上下文而且要打得“持久化”不能用chcon一改了之semanage fcontext -a -t httpd_sys_content_t /opt/webcontent(/.*)? restorecon -Rv /opt/webcontent ls -Zd /opt/webcontent # system_u:object_r:httpd_sys_content_t:s0如果系统提示 semset 相关的命令不存在需要先装policycoreutils-python-utils这个包。这一步在RHCSA考试里很容易被忽略因为你用的是最小化安装的RHEL镜像很多SELinux管理工具默认不装。3.3 chcon和semanage fcontext考试必须选后者很多教程会告诉你用chcon -R -t httpd_sys_content_t /opt/webcontent改上下文这个命令确实“看起来生效了”但它是直接修改文件系统上的SELinux属性并没有写入策略数据库。一旦之后执行了restorecon或者文件被relabel上下文会被重置回原来的default_t问题复发。考试和实际运维都推荐用 s常见流程semanage fcontext -a -t httpd_sys_content_t /opt/webcontent(/.*)? restorecon -Rv /opt/webcontent注意(/.*)?这个正则写法它能匹配目录本身和目录下的所有子孙文件和目录。这是RHCE/RHCSA题目里最常见的写法建议直接背下来。另外如果web应用需要往目录里写文件比如上传功能那类型要设成httpd_sys_rw_content_t只给只读类型是写不进去的。3.4 ACL、mask和SELinux三层叠加的隐蔽坑这道题还要求user1可写、user2可读所以除了SELinux还要配置ACL。我当时配完 getfacl 发现user1写的权限生效了但user2的读权限始终不起作用。排查之后发现是ACL的mask值在作怪setfacl设置命名用户权限时mask会自动调整但它会限制所有命名用户和组的最大权限。如果mask是 r-x那即使ACL里写了user2:rwx实际有效权限也只有r-x。正确做法是设置完ACL后用setfacl -m mask::rwx显式调整mask同时如果想新建文件自动继承ACL还要加默认ACLsetfacl -m u:user1:rwx /opt/webcontent setfacl -m u:user2:r-x /opt/webcontent setfacl -m mask::rwx /opt/webcontent setfacl -m d:u:user1:rwx /opt/webcontent setfacl -m d:u:user2:r-x /opt/webcontent getfacl /opt/webcontent再叠加SELinux这一层这道题的完整答案其实是Linux普通权限 ACL SELinux上下文三者全部正确缺一不可。这也是RHCSA考试中SELinux题最常见的形态——它不是单独考你一个命令而是藏在web服务、samba、NFS这类“应用层”题目里症状表现为功能不可用但直接看配置又看不出毛病。4. systemd服务单元与开机自启从能跑通到能自动拉起4.1 背景为什么需要自定义systemd服务第三题要求把一个写好的Python Flask应用托管给systemd端口5000要求开机自启、崩溃自动重启。说实话如果只要求“把应用跑起来”我直接在终端里python3 app.py就够了但这显然不是这道题的目的。生产环境里你不可能指望每次重启后都有人手动去敲一遍启动命令也不可能让一个进程在崩溃后就一直睡死过去。systemd解决的正是这两件事开机自启和进程守护。这道题对我们这些初学者最大的门槛是unit文件不是一个只写三行的东西它内部有三个区块每个区块都有自己的职责。当初我把整个unit文件写成了“只有ExecStart的一行僵尸”结果服务起得来但行为完全不对。4.2 unit文件的关键字段每一个都有存在的理由我最终定稿的unit文件长这样路径在/etc/systemd/system/myflask.service[Unit] DescriptionMy Flask App Service Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userappuser Groupappuser WorkingDirectory/opt/myapp ExecStart/usr/bin/python3 /opt/myapp/app.py Restarton-failure RestartSec3 [Install] WantedBymulti-user.target字段拆开逐个说。Afternetwork-online.target是告诉systemd这个服务要等网络真正就绪之后再启动。如果不写服务可能在内网IP还没配好时就被拉起来Flask监听的地址是0.0.0.0还好如果绑定特定IP就直接起不来。Wants是弱依赖建议再加一个。Userappuser这个字段我第一次完全没写导致服务以root身份运行。这不是不能用而是非常不规范考试里如果题目明确要求“以指定用户运行服务”你漏掉这个字段就直接丢分。更隐蔽的是没写User时systemd默认用root的PATH一旦切到普通用户你用which python3找到的路径可能完全不存在。ExecStart必须写绝对路径。这是初学者踩得最惨的坑你在终端里敲python3没问题但systemd环境里PATH被精简得非常小它根本不知道python3在哪。所以写unit文件之前先执行which python3把真实路径查出来再填进去。Restarton-failure表示进程以非0状态退出时自动拉起RestartSec3是重启间隔。如果你的服务是被kill -9杀掉也一样会触发重启。如果题目要的是“无论什么情况都重启”那就用Restartalways这个区别考试经常会出选择题或命令行验证。4.3 daemon-reload的意义和enable的时机unit文件写完后必须执行systemctl daemon-reload让systemd重新读取磁盘上的unit文件。很多新手改完文件后直接systemctl start myflask如果unit文件语法有错或者你新增的文件之前没被加载过systemd会提示找不到unit。reload完毕后再启动systemctl daemon-reload systemctl enable --now myflask systemctl status myflask journalctl -u myflask -fenable --now是把“设置开机自启”和“立即启动”合并成一步。如果你分开做先enable后start也行但千万不要只enable不start然后就以为服务已经跑起来了。验证开机自启的命令是systemctl is-enabled myflask # enabled ls -l /etc/systemd/system/multi-user.target.wants/myflask.service能看到软链接指向你创建的unit文件说明enable真实生效了。这一步是我每次做完作业都必查的因为有时候你明明执行了enable但由于文件路径写错或者WantedBy写错软链接根本没建出来。4.4 防火墙放行permanent和reload的关系最后Flask监听5000端口外部机器要访问必须在firewalld里放行。这道题我一开始的配置是这样的firewall-cmd --permanent --add-port5000/tcp加完--permanent后满心以为已经生效结果curl外部IP就是不通查firewall-cmd --list-ports也是空的。后来才反应过来permanent只是把规则写入配置文件要让它加载到运行时还必须执行firewall-cmd --reloadfirewall-cmd --permanent --add-port5000/tcp firewall-cmd --reload firewall-cmd --list-ports # 5000/tcp这道题还让我记住了另一个细节firewall-cmd --reload和firewall-cmd --runtime-to-permanent是两个经常被混淆的命令。reload是把磁盘上持久化配置重新加载到运行时runtime-to-permanent则是反向操作把当前运行时规则写回磁盘。考试时看到“要求重启后依然有效”这种描述基本就是让你用permanent加reload的组合。5. 容易被忽略的送分题计划任务、归档与日志轮转5.1 为什么这些小知识点反而最值得练RHCSA考试里真正的大头是存储、网络、服务管理、SELinux这些但每次考试总会有几道“小分题”比如配置cron、用tar打包、设置日志轮转。这类题难度不大可是丢分率很高原因是备考时容易被大知识点挤占时间练得不够熟。第三次作业的第四题恰好把这三个小点全部装进了同一道题备份脚本、cron执行、logrotate轮转。我自己就在cron上翻过车而且翻得很典型。5.2 cron不执行脚本本身会跑但cron就是不理你题目要求user3每天14:30执行 /usr/local/bin/backup_etc.sh把 /etc 目录打包到 /backup。我手动执行脚本一切正常tar包生成得好好的然后我编辑user3的crontabcrontab -e -u user3 30 14 * * * /usr/local/bin/backup_etc.sh保存退出等了几分钟发现 /backup 目录里压根没有新的tar包。当时第一个念头是cron服务没开systemctl status crond一看是active的。第二个念头是用户crontab没生效crontab -l -u user3看规则也在。最后排查到脚本本身才发现问题脚本里写了tar czf /backup/etc-$(date %F).tar.gz /etc但用到的date、tar都是绝对路径吗不是。cron环境里的PATH非常小往往只有/usr/bin:/bin如果脚本里引用了/usr/local/bin下的某个工具可能直接找不到。更隐蔽的问题是脚本权限。cron执行脚本不需要脚本有执行权限它是用sh来跑的吗其实取决于脚本首行是否有shebang以及crontab里是直接写脚本路径还是写sh /path/script.sh。稳妥做法是给脚本加执行权限并在脚本内部使用绝对路径同时把可能的PATH也export出来#!/bin/bash export PATH/usr/local/bin:/usr/bin:/bin tar czf /backup/etc-$(date %F).tar.gz /etc find /backup -name *.tar.gz -mtime 7 -delete脚本里顺手加了一条find保留七天内的备份这也算一种最朴素的备份轮转。考试如果要求“超过N天的日志自动删除”思路类似。5.3 日志轮转为什么配置文件里最好加copytruncate日志轮转的考点集中在 /etc/logrotate.d/ 下新建配置文件。题目要求 /var/log/myapp/ 下以 .log 结尾的日志每天轮转保留7份压缩保存。标准配置如下/var/log/myapp/*.log { daily rotate 7 compress missingok notifempty copytruncate }copytruncate这个参数值得单独讲一下。默认的logrotate做法是先rename日志文件再让程序创建新的日志文件但很多应用在启动时打开日志文件句柄后就不再重新打开rename之后它还会继续往旧文件里写导致新文件拿不到日志。copytruncate的思路是先复制一份当前内容到目标文件然后把原文件截断应用不需要重建句柄日志也能继续写。像nginx、tomcat这类生产环境如果没有特殊配置copytruncate是最省心的选择。日志轮转配好之后可以用logrotate -d /etc/logrotate.conf做一次调试不会真执行但会告诉你每一步会怎么做。实际强制执行用logrotate -f /etc/logrotate.d/myapp执行完去对应目录看看有没有生成带日期和.gz结尾的文件验证配置是否生效。5.4 journald和rsyslog的分工这道题里虽然没有大量考察日志查看但复盘时我还是把journald和rsyslog的关系理了一遍。简单说journald负责收集和管理系统日志rsyslog负责把日志写入传统文本文件或者转发到远程。日常排错时journalctl -u myflask查看服务日志最直接而考试里如果题目要求“把某类日志写入指定文件”一般就要配置rsyslog。比如要把包含“myapp”字样的日志写到 /var/log/myapp.log可以在 /etc/rsyslog.d/ 下建一个规则文件:msg, contains, myapp /var/log/myapp.log stop然后systemctl restart rsyslog。 stop表示这条规则匹配后不再走后续规则避免同样日志被重复写多次。这类题在RHCSA考的不算特别深但一旦考到很多人因为没实操过rsyslog语法而直接懵掉。6. 对照考纲复盘第三次作业到底给考试攒了哪些分6.1 考纲模块与作业覆盖度对照作业全部做完后我拿RHCSA考纲Red Hat EX200RHEL 9环境做了一次对照把这次作业覆盖到的模块整理成了表格考纲模块本次作业覆盖情况我的掌握程度理解并使用基本工具少部分tar、文本处理基本熟练创建简单shell脚本备份脚本涉及变量、date、条件判断仍需加强操作运行中的系统systemd启停、journalctl查日志熟练配置本地存储LVM、分区、格式化、fstab熟练xfs缩容是知识盲区创建和配置文件系统xfs/ext4挂载、ACL熟练部署、配置和维护系统cron、logrotate、时间同步作业里没测时间同步cron和logrotate已复训管理用户和组user、ACL、sudo熟练管理安全firewalld、SELinux、semanage已建立排错链仍需提速容器管理作业未涉及但RHCSA 9会考podman基础需要额外补充从这个表能看出来第三次作业已经把考纲里的“重头戏”覆盖了大半剩下的容器管理和更细节的网络配置基本是后面几次作业和考前冲刺要补的。6.2 做题节奏给每次作业都计时我做第三次作业之前其实没有完整计时过。后来发现自己做一道LVM题用了快40分钟其中有一半时间在排错。但RHCSA考试是限时2小时30分钟的而且题目数量不少每道题平均下来可能只有10分钟出头。所以从第三次作业开始我给自己定了一条规矩每道题单独计时目标是压到15分钟以内超过20分钟就标记为知识薄弱点回头单独练。这个训练方式在考试里帮了我大忙。正式考试时遇到SELinux题我直接在脑子里走“服务状态→端口→文件权限→SELinux上下文→布尔值→AVC日志”这条链路不到十分钟就定位到了问题这就是平时计时训练练出来的肌肉记忆。6.3 我总结的作业检查清单第三次作业做完之后我整理了一份“交作业前必查清单”后来直接变成了考试前的速查手册这里同样分享出来所有“要求永久生效”的配置是否都使用了持久化机制fstab写了UUID、systemd执行了enable、firewall用了permanent、SELinux用了semanage而不是chcon。是否用目标用户实际验证过权限光看你自己的账号没问题不代表user1没有问题至少要用sudo -u user1 ls /path实测。是否验证了重启后的状态不是嘴上说而是真的reboot一次看服务是否自动拉起、挂载是否自动生效。是否确认过服务监听地址ss -tlnp看端口到底监听在0.0.0.0还是127.0.0.1很多外部访问不通的根源在这里。是否检查了ACL的mask值setfacl配置完用getfacl确认有效权限而不是只看文件名旁边的权限位。是否用日志验证而不是只靠猜测服务异常先journalctl -u 服务名SELinux问题先ausearch -m avc -ts recent不要一上来就chmod 777。做完第三次作业之后最大的体会是知识从“会背命令”变成“会用命令”中间必须隔着一堆故障排错。fstab写错导致系统起不来、systemd unit文件少写一个字段导致服务启动失败、SELinux拦截导致web目录403这些坑我在作业里全都踩了一遍。正是因为踩过后来在考场上遇到类似故障我反而会有点高兴因为知道下一步该查什么。最后再分享一个延续至今的习惯每次做完实验都习惯性地重启一次虚拟机确认所有配置在冷启动后依然生效。这个习惯在RHCSA备考阶段帮我提前排掉了很多“假成功”——比如服务当时启动了但根本没enable或者目录权限靠手动命令改好了但没过restorecon验证。如果你现在也在做RHCSA相关的作业或模拟题强烈建议把这步加到自己的流程里它花不了多少时间但能帮你躲过考试里最扎心的“重启后失效”陷阱。
返回列表