1. 作业整体设计与考点拆解
1.1 这次作业到底考什么
RHCE 培训课程的进度往往很“赶”。第一次作业还在熟悉 RHEL 的基础命令、文件权限和管理员操作,第二次作业就开始上“服务配置”了。我这次拿到的第二次作业,题目虽然不算复杂,但覆盖的考点非常典型,几乎可以说是 RHCE 考试(尤其是 EX200 和 EX294 的实操部分)里最高频的几个模块的集中演练。
我拿到的作业要求原文大概是这样的:
- 在 RHEL 9 环境中配置一台服务器,主机名为 server,要求配置静态 IP 和 yum 本地仓库;
- 创建用户 alice 和 bob,分别加入不同的附属组,alice 需要对某个目录有完全控制权,bob 只能读取;
- 搭建 NFS 服务,将 /data/share 目录共享给 192.168.122.0/24 网段,要求客户端可以读写;
- 搭建 Samba 服务,共享 /srv/samba 目录,要求 alice 可读写,bob 只读;
- 全部服务配置完成后,重启系统仍能生效;
- 最后在客户端完成挂载验证,并确认 SELinux 和防火墙状态。
说实话,第一次看到这份作业我是有点“头大”的。因为它等于一次把用户权限、网络服务、文件系统、SELinux、防火墙全串起来了。任何一个环节出错,结果就是“客户端访问不了”“重启失效”“SELinux 拦截”,而且这几个问题之间还会互相干扰,排查起来特别费劲。但也正因为这样,做完这一遍,我对 RHCE 考试的实操套路基本心里有底了。
1.2 为什么第二次作业就上“综合配置”
很多自学或者刚接触 RHCE 的同学会有一个疑问:为什么不先把命令练熟,再接触服务配置?我的理解是,RHCE 这个认证本身考的不是“你会敲多少命令”,而是“你能不能作为一个 Linux 运维工程师,把一台机器按需求配置好,并且保证重启后依然可用”。所以从第二次作业开始,老师就按真实项目的思路来设计题目——需求是零散的、不友好的,你需要自己去拆解、去判断,而不是照着文档一步步点。
这个作业里最值得琢磨的一点是:它没有告诉你“用什么方式实现”。比如共享目录,你可以选 NFS,可以选 Samba,也可以选 FTP。但题目是固定的,你就得知道 NFS 和 Samba 各自的适用场景,才能在考试或实际工作中快速做出选择。这就是 RHCE 和普通“背题考证”最大的区别——它逼着你理解原理。
1.3 实验环境规划
在动手之前,我先规划了实验环境。环境规划这事看着简单,实际很关键。我见过不少同学一上来就开两台虚拟机,结果 IP 网段不一致,服务配好了也连不通,白白浪费时间排查。我这次用的环境如下:
| 角色 | 主机名 | IP 地址 | 系统版本 | 用途 |
|---|---|---|---|---|
| 服务器 | server | 192.168.122.100 | RHEL 9.2 | 部署 NFS、Samba、用户管理 |
| 客户端 | client | 192.168.122.101 | RHEL 9.2 | 验证挂载与访问 |
两台机器都用的同一网段,DNS 和网关我暂时没配,因为作业场景里用不到。这里多说一句:做实验时尽量模拟真实环境,但也不要给自己挖坑。比如你如果对网络配置不熟,就老老实实先把静态 IP 配置好,再考虑 DHCP 的事情。我见过有人非要在实验环境里搞 DHCP 动态下发,结果客户端获取的 IP 和服务器不在一个网段,服务端防火墙规则全白写了。这种问题纯粹是给自己添堵。
2. 核心考点原理与配置思路
2.1 用户与权限:理解 UID 和附属组的联动关系
很多同学做用户权限题时,习惯性用 chmod 直接改目录权限,能实现就完事了。但作业里有个隐藏考点:alice 和 bob 分别加入不同附属组,要求 alice 对某个目录有完全控制权。这意味着权限设计要从“组”的维度去考虑,而不是只针对单用户。
我的理解是,在 Linux 里,文件权限是围绕“属主、属组、其他用户”三个维度展开的。你把 alice 放进一个辅助组(比如 devops),然后把这个组设为目录的属组,再给组权限,这样比直接 chown alice:alice 更灵活。后期如果要加新成员,只要把他拉进 devops 组,权限自动就有了,不用一条条改目录权限。这也是真实生产环境中比较推荐的思路。
这里有个细节特别容易踩坑:用户加组之后,如果这个用户当前已经登录,他的会话并不会立即获得新的组权限。必须重新登录或者用 newgrp 命令切换到新组才能生效。我在做验证的时候就是这样,明明已经用 usermod -aG devops alice 把用户加进组了,但 alice 在已登录的终端里依然没有权限,折腾了半天才发现是这个原因。后来养成了习惯:凡是改了用户组,就顺手把测试会话重新登录一遍,省得后面“灵异事件”。
2.2 SELinux:不是用来关掉的
RHCE 作业里出现 SELinux 是常态,而且明摆着是在告诉你“别把 SELinux 关了”。我见过不少人在本地虚拟机里练习时,第一件事就是 setenforce 0 加 /etc/selinux/config 里改成 disabled。这样确实省事,但考试不会让你这么干,生产环境更不能这么干。
我这次作业里,NFS 共享目录的默认 SELinux 标签需要确认,Samba 服务更需要关注 SELinux boolean。比如Samba 共享要允许用户写入家目录,你得知道 setsebool -P samba_enable_home_dirs on 这类布尔值开关。Samba 共享自定义目录的话,还需要把目录的 SELinux 类型设置为 samba_share_t。这条命令看起来简单,不理解原理的话很容易漏:
semanage fcontext -a -t samba_share_t "/srv/samba(/.*)?" restorecon -Rv /srv/samba第一次看到 fcontext 规则,我以为是“给目录打个标签”而已。后来才想明白,它的本质是告诉 SELinux 策略:“将来这个路径下的文件,创建时默认使用哪个安全上下文”。你只改当前目录的标签还不够,新创建的文件还会按默认规则走,所以必须加 fcontext 规则配合 restorecon 使用。这个机制和生产环境里“为什么我改了权限重启后又变回去了”的问题是一个道理。
2.3 NFS 与 Samba:选型不是随便挑的
NFS 和 Samba 都能做文件共享,但它们的定位完全不同。NFS 是 Linux/Unix 系统之间的网络文件系统,性能好、配置简洁,适合 Linux 服务器之间的共享;Samba 是实现了 SMB/CIFS 协议的服务,核心场景是跟 Windows 客户端互通,或者需要用户认证、权限分级管理的场景。
作业里两个共享分别用到了这两种服务,其实就是逼着你把两种服务的配置方法都过一遍。NFS 的特点是“基于 IP/网段的访问控制”,你 exportfs 里写哪几个客户端能访问,就哪几个能访问,跟用户密码没关系;Samba 的特点是“基于用户的认证”,即使客户端 IP 在允许范围,还是得输入用户名密码才能访问。
这两个服务还有个容易搞混的地方:NFS 的权限是“文件系统权限 + exportfs 选项”两层叠加,Samba 是“Samba 用户密码 + 文件系统权限 + SELinux”三层叠加。排错时如果只盯着其中一层,往往会被表象迷惑。比如 Samba 访问被拒绝,可能不是配置文件写错了,而是 SELinux boolean 没开,或者系统用户的密码没设置(Samba 使用独立于系统的 SMB 密码,需要用 smbpasswd 单独设置)。
3. 实操过程与关键步骤回放
3.1 环境初始化与软件安装
我先把两台机器的系统装好,然后开始配置服务器。安装软件这一步,我直接用了 dnf 命令,把要用到的包一次装齐:
dnf install -y nfs-utils samba samba-client policycoreutils-python-utils setools这里有句经验之谈:搞 RHCE 作业和实际运维工作,尽量用最小化安装的系统,然后按需装包。因为你在“装包”的过程里会自然学会一个技能:搞清楚某个服务到底由哪个软件包提供。这个能力在考试里很吃香,因为你不可能把红帽官方文档里所有包名都背下来。比如你不知道 samba 客户端工具(smbclient、mount.cifs)在哪个包里,就可以用 dnf provides 命令反查。
3.2 配置静态 IP 与主机名
RHEL 9 默认用 NetworkManager 管理网络,nmtui 这个交互式工具对新手很友好,但我个人更推荐直接写 keyfile 配置文件或者用 nmcli。考试里 nmcli 是高频考点,命令行操作也不依赖图形界面,所以我这次全程用 nmcli。
服务器端配置命令如下:
nmcli con mod eth0 ipv4.addresses 192.168.122.100/24 nmcli con mod eth0 ipv4.gateway 192.168.122.1 nmcli con mod eth0 ipv4.method manual nmcli con mod eth0 ipv4.dns "8.8.8.8" nmcli con up eth0主机名配置我单独做了,从长远看建议直接改 /etc/hostname 并配合 /etc/hosts。如果你只在命令行临时执行 hostnamectl set-hostname,不会自动写进 /etc/hosts,有些服务解析本机名时可能出问题。所以我的习惯是两条都做:
hostnamectl set-hostname server.example.com echo "192.168.122.100 server.example.com" >> /etc/hosts客户端也做了同样的配置,只是 IP 换成了 192.168.122.101,主机名换成 client.example.com。配置完网络后,务必 ping 一下对端,确认互通。这一步别省,省了后面全在怀疑服务配置。
3.3 配置 yum 本地仓库
作业里要求配置 yum 本地仓库。这个操作在真实工作中不常用,因为生产环境一般用内部镜像源或者订阅源。但作为作业和考试,它的意义在于考察你对仓库配置文件的语法和优先级理解。
我把 RHEL 9 的安装 ISO 挂载到了 /mnt/iso:
mount -o loop /path/to/rhel-9.2-x86_64-dvd.iso /mnt/iso然后在 /etc/yum.repos.d/local.repo 里写入:
[local-base] name=Local Repository baseurl=file:///mnt/iso/BaseOS enabled=1 gpgcheck=0 [local-appstream] name=Local Repository AppStream baseurl=file:///mnt/iso/AppStream enabled=1 gpgcheck=0这里注意:RHEL 9 的 ISO 里有两个主要仓库路径——BaseOS 和 AppStream。如果你只配了 BaseOS,很多软件包(包括 samba)可能装不上,因为它们在 AppStream 里。这是一个非常容易忽略的点,也是我第一次做这个作业时卡住的地方。
3.4 用户、组与目录权限配置
按作业要求,我在服务器上创建了用户和使用组:
groupadd -g 4000 devops groupadd -g 4001 ops useradd -u 3001 -G devops alice useradd -u 3002 -G ops bob echo "alice:password" | chpasswd echo "bob:password" | chpasswd创建完用户后,我准备了一个共享目录 /data/share,并把它的属组设为 devops:
mkdir -p /data/share chown root:devops /data/share chmod 2775 /data/share这里我特意用了 2775 而不是 775,原因是有 setgid 位。设置了 setgid 之后,在这个目录下新建的文件会自动继承目录的属组,而不是创建者自己的基本组。这个技巧在实际团队协作中很常见,否则每次有新人往共享目录丢文件,你都得手动 chgrp 调整属组,文件一多就乱了。
3.5 配置 NFS 服务
NFS 配置的核心是 /etc/exports 文件。我写的是:
/data/share 192.168.122.0/24(rw,sync,no_root_squash)关于选项,r 和 sync 大家都懂,rw 是读写,sync 是同步写。no_root_squash 这个选项我需要专门解释一下:它允许来自客户端的 root 用户保留 root 权限。如果不开这个选项,客户端的 root 会被映射为匿名用户,写文件时会出现权限不足的情况。
但这里有个安全权衡:生产环境下 no_root_squash 一般不建议开启,因为客户端 root 拿到服务器文件系统的 root 权限后,可以做任何事,风险太高。作业环境里为了验证方便可以开,但你要理解它意味着什么。
配置完 exports 后,启动服务:
systemctl start nfs-server systemctl enable nfs-server exportfs -r然后验证导出列表:
exportfs -v showmount -e localhost客户端挂载时用:
mkdir -p /mnt/nfs mount -t nfs4 192.168.122.100:/data/share /mnt/nfs这里有个坑我后面细说,就是 mount 报错“No such file or directory”时,很多人第一反应是目录不存在,其实往往是 NFS 版本不匹配或者导出路径有问题。
3.6 配置 Samba 服务
Samba 的配置文件是 /etc/samba/smb.conf。我先把系统用户 alice 和 bob 加到 Samba 用户里:
smbpasswd -a alice smbpasswd -a bob然后编辑 smb.conf,增加共享段:
[shared] path = /srv/samba browseable = yes writable = yes valid users = alice, bob write list = alice read only = no这里 write list 是核心:指定只有 alice 有写权限。把 read only 设为 no 但通过 write list 来限制,比直接给共享目录设置系统权限更灵活,也更直观。
然后创建目录并设置 SELinux 标签:
mkdir -p /srv/samba chown root:devops /srv/samba chmod 2775 /srv/samba semanage fcontext -a -t samba_share_t "/srv/samba(/.*)?" restorecon -Rv /srv/samba启动 Samba 服务:
systemctl start smb nmb systemctl enable smb nmb客户端验证时,用 smbclient 测试连接:
smbclient //192.168.122.100/shared -U alice3.7 防火墙与 SELinux 放行
RHEL 9 默认防火墙是 firewalld。默认情况下,NFS 相关服务在防火墙里是放行的吗?不一定。你需要显式放行。我用的是:
firewall-cmd --permanent --add-service=nfs firewall-cmd --permanent --add-service=mountd firewall-cmd --permanent --add-service=rpc-bind firewall-cmd --permanent --add-service=samba firewall-cmd --reload这里有个关键细节:NFS 涉及的端口除了 2049 之外,还有 mountd 和 rpcbind。很多人只放行了 2049,导致客户端 mount 时“卡死”或者报“RPC: Timed out”。我用 firewalld 的 service 名字而不是端口,就是为了防止漏端口。
SELinux 这边,除了上面提到的 samba_share_t 标签,我还检查了布尔值:
getsebool -a | grep samba输出里看到 samba_export_all_rw 是 off,但因为我给共享目录打了正确的标签,并不需要全局开放。这里要记住一个原则:能用标签解决就不要开全局布尔值,能用布尔值解决就不要直接关 SELinux。
4. 排错实录:四个经典问题
4.1 NFS 挂载报 “No such file or directory”
这是我做完 NFS 配置后第一个遇到的大坑。客户端执行 mount 时,系统提示:
mount.nfs: mount point /mnt/nfs does not exist我第一反应是 /mnt/nfs 目录没创建。检查了一下,目录是存在的。然后我又检查了服务器端 /etc/exports 文件,路径也是对的。郁闷了半天之后,我想起了 NFSv4 的一个特性——它在导出路径里会包含一个“伪根”概念。
问题在于,我在 /etc/exports 里写的是 /data/share,但 RHEL 9 默认 NFSv4 把导出路径映射到根目录下的 fs 目录里。如果服务器端没有开启 NFSv4 的伪根支持,或者导出配置里路径没生效,客户端用 192.168.122.100:/data/share 去挂载可能失败。
真正的排查方法是:
showmount -e 192.168.122.100如果这个命令能列出导出,说明 NFS 服务正常,问题大概率出在客户端挂载参数上。如果 list 里是空的,那就是服务器端 exports 配置或防火墙问题。我当时的情况是 showmount 能列出来,但客户端还是挂不上。后来发现是服务器端 nfs-server 服务没完全启动,rpcbind 通讯异常。
处理办法是重启服务,并确认三个服务都活着:
systemctl restart rpcbind nfs-server systemctl status nfs-server开机自启也别忘了:
systemctl enable --now rpcbind nfs-server4.2 Samba 可以认证但看不到目录内容
后来 Samba 服务起来了,alice 也能通过认证登录,但登录后发现目录是空的,而服务器端明明有测试文件。这个问题的原因在 SELinux 标签,而不是 Samba 配置。
我用 ls -Z 查看 /srv/samba 的上下文时发现它还是默认的 default_t,而不是 samba_share_t。明明之前执行过 semanage fcontext 和 restorecon,为什么没生效?
后来发现,问题出在我执行 restorecon 之前就创建了共享目录和测试文件,但 fcontext 规则的路径写法和实际路径没对上。我写的是 /srv/samba(/.*)?,这个正则表达式实际上覆盖了目录本身和目录下的所有文件。但 restorecon 是在我创建测试文件之前执行的,新文件创建时如果没有使用正确的规则,就会继承父目录的当前标签。
正确的顺序是:先配置 fcontext 规则,然后 restorecon 刷新,最后再往目录里放文件。如果一开始顺序错了,就重新跑一遍 restorecon:
restorecon -Rv /srv/samba然后在客户端重新访问,测试文件就出现了。这说明 SELinux 标签对 Samba 服务可见性有直接影响,不是“改了配置重启就好”那么简单的。
4.3 防火墙放行了还是连接被拒绝
在配置 Samba 客户端访问时,我一开始就放行了 samba 服务,但客户端用 smbclient 连接时始终报 “Connection refused” 或 “NT_STATUS_CONNECTION_REFUSED”。
我检查了 smb.conf,确认服务监听的是 445 和 139 端口;检查了 firewalld,samba 服务确实在放行列表里。最后用 ss -tlnp 查看了端口监听情况,发现问题根本不在防火墙,而在服务本身——nmb 服务没有起来。
nmb 服务主要负责 NetBIOS 名称解析,在 Windows 风格的 SMB 协议中很重要。如果你只启动了 smb 而没有启动 nmb,客户端虽然可以用 IP 直连,但某些环境中解析会出问题。启动 nmb 之后问题就解决了。
经验总结:遇到连接失败时,先判断是哪一层的问题。客户端到服务器的网络通不通,服务端口监听是否正常,防火墙是否放行,服务是否注册到 rpcbind 或 NetBIOS。按这个顺序排查,比盲目调整配置高效太多。
4.4 重启后服务全部失效
作业要求“重启系统后仍能生效”,这基本是在检测 systemctl enable 有没有做全。我一开始在服务器上手动启动了 NFS 和 Samba,也做了 enable,但重启后 NFS 还是有问题。排查后发现,rpcbind 服务没有设置开机自启。
很多人以为 nfs-server enable 就万事大吉了,但 NFS 依赖 rpcbind,如果 rpcbind 没起来,nfs-server 虽然启动了但功能不完整。正确做法是:
systemctl enable --now rpcbind nfs-server systemctl enable --now smb nmb重启后再验证:
systemctl status rpcbind nfs-server smb nmb showmount -e localhost这个环节在考试里几乎必考,平时做作业时养成“重启系统验证一次”的习惯,比临考突击有用得多。
5. 常见问题速查表与避坑技巧
5.1 快速定位故障层
做一个简单的速查表,方便日后复习:
| 现象 | 可能原因 | 排查命令 | 解决方法 |
|---|---|---|---|
| NFS mount 超时 | rpcbind / nfs-server 未启动 | systemctl status nfs-server | 确认依赖服务启动 |
| NFS 挂载成功但无法读写 | 权限或 exportfs no_root_squash 缺失 | exportfs -v / ls -Z | 检查目录权限与参数 |
| Samba 认证失败 | SMB 密码未设置 | smbpasswd -a alice | 设置 SMB 密码 |
| Samba 看不到文件 | SELinux 标签不对 | ls -Z /srv/samba | restorecon 和 fcontext |
| Samba 连接被拒 | nmb 服务未启动 | systemctl status nmb | 启动 nmb 并 enable |
| 重启后服务失效 | 依赖服务未 enable | systemctl list-unit-files | 确认所有相关服务 enable |
5.2 几个值得养成的习惯
做完这次作业,我最大的感受就是:RHCE 考的不只是“会不会配置某个服务”,而是“在限定时间内,能不能自己定位和解决未知问题”。有几个习惯我从这次作业开始一直保持到现在:
一是改完配置必跑验证。NFS 改完 exports 后要 exportfs -r 并 showmount -e,Samba 改完 smb.conf 后要 testparm 检查语法,防火墙改完要 firewall-cmd --reload。验证这步不是形式主义,它能在问题扩大前把错误暴露出来。
二是关键服务全部 systemctl enable。不要等重启之后再救火,开机自启配置是 RHCE 作业的基本盘,不 enable 等于白配。
三是永远不要关 SELinux。做作业时把 SELinux 调成 disabled 一时爽,考试时这题直接零分。正确姿势是学习怎么跟 SELinux 打交道,学会看 AVC 日志,学会用 seinfo、sesearch 这些工具定位问题。RHEL 9 默认 enforcing 模式的 SELinux,在实际工作中也是默认开启的,早学会早受益。
四是准备一份“命令速查卡”。把这次作业里用到的核心命令整理成一页笔记,比如 useradd、chmod、setsebool、semanage、firewall-cmd、systemctl、exportfs、smbpasswd 这些,按场景分类。考场上没有搜索引擎,一旦卡住,能被速查卡救命的。
6. 作业复盘:与 RHCE 考试要求的对标
6.1 这道作业在考试里是怎么考法
RHCE 考试分两大部分。第一部分是 RHCSA(EX200),考的是系统管理基础,比如用户管理、权限、存储、SELinux、防火墙这些;第二部分是 RHCE(EX294),考的是 Ansible 自动化运维。不同版本考试内容略有差异,但无论怎么变,这次作业里涉及的知识点都是地基中的地基。
举例来说,EX200 里很可能给你这么一道场景题:创建一个用户,要求他属于某个指定的组,能对某个目录有读写权限,且能执行 sudo 命令。这种做法本质就是作业里的“alice 和 bob”任务。EX294 里则可能要求你用 Ansible 来批量实现这些配置,写一个 playbook 去创建用户、配置 NFS 共享、设置防火墙规则。
所以这个第二次作业,本质上是在为“手工配置”打基础。你只有亲手把每个服务配一遍,理解每一步的作用,才能写好自动化脚本,因为自动化脚本无非就是把你手敲的命令变成可重复执行的代码。
6.2 从手工配置到 Ansible 自动化的自然过渡
写 playbook 的时候,你会发现一个很直接的关系:每个 task 块就是在执行一条命令或者一组命令。比如:
- name: Configure NFS share ansible.builtin.copy: content: | /data/share 192.168.122.0/24(rw,sync,no_root_squash) dest: /etc/exports owner: root group: root mode: '0644' notify: restart nfs-server这就是把手工的 exports 配置过程变成代码。同样,创建用户、设置权限、添加防火墙规则,都可以用 user、file、firewalld 模块来实现。这个思路在你做完纯手工配置之后再去理解,会顺畅很多。
我的建议是:不要一上来就追求用 Ansible 完成所有作业任务。先手工做一遍,记录下每一步做了什么,然后再对照这些操作去写 playbook。这样既练了手工技能,也练了自动化技能,一举两得。
6.3 复盘核心:时间管理和排错优先级
最后想说说时间管理。RHCE 考试是限时实操,时间压力是真实存在的。这次作业虽然是课后练习,但我给自己限定了 2 小时完成,过程中发现最大时间消耗不是“配置”,而是“排错”。
我统计了一下,大约 60% 的时间花在了排查问题上。所以如果你也在准备 RHCE,我的建议是平时就要刻意练习“快速排错”,不要想着配置一次就成功。每遇到一个 bug,把原因和排查过程记录下来,下次同类问题直接查笔记,效率会成倍提升。
做完这次作业后的个人体会是:RHCE 学习不是拼知识量,而是拼“解决问题的能力”。题目永远在变,服务的配置方法也可能升级,但只要你能理解系统工作的原理,能顺着报错信息一步步定位问题,考试也好、真实工作也好,都不会慌。这套方法论,比记住任何一条具体命令都值钱。