🐧 RHCSA 9.0 知识库
基于模拟题整理,按题号编排,每道题向外扩散关键知识点。 考试在 servera.lab.example.com 和 serverb.lab.example.com 上操作。
考试环境概览
| 主机 | IP | 说明 |
|---|---|---|
| servera.lab.example.com | 172.25.0.10 | 主要操作节点 |
| serverb.lab.example.com | 172.25.0.11 | 第二操作节点 |
| classroom.example.com | 172.25.250.254 | 网关/DNS/NTP/内容源 |
| content.example.com | — | 软件仓库和资源地址 |
关键信息:
| 项目 | 值 |
|---|---|
| root 密码 | redhat |
| DNS 域 | lab.example.com |
| 子网 | 172.25.0.0/255.255.255.0 |
| 注册服务器 | registry.lab.example.com (admin / redhat321) |
| 软件仓库 | http://content.example.com/rhel9.0/x86_64/dvd/BaseOS / AppStream |
| 评分方式 | 系统重启后评测,所有配置和服务必须在重启后保留 |
1. 配置网络地址 (servera)
题目要求
配置 servera 的网络参数:主机名、IP、子网掩码、网关、DNS。
实际操作
# 设置主机名
hostnamectl set-hostname servera.lab.example.com
# 查看现有网络连接
nmcli connection show
# 删除默认连接
nmcli connection delete "Wired connection 1"
# 创建新连接
nmcli connection add type ethernet ifname eth0 con-name eth0 \
ipv4.method manual ipv4.addresses 172.25.250.10/24 \
ipv4.gateway 172.25.250.254 ipv4.dns 172.25.250.254 \
autoconnect yes
# 激活连接
nmcli connection up eth0扩展开的知识点
hostnamectl 命令
| 命令 | 作用 |
|---|---|
hostnamectl set-hostname NAME | 设置主机名(永久) |
hostnamectl status | 查看当前主机名信息 |
nmcli 网络管理
| 命令 | 作用 |
|---|---|
nmcli connection show | 列出所有连接 |
nmcli connection delete NAME | 删除连接 |
nmcli connection add ... | 创建连接 |
nmcli connection up NAME | 激活连接 |
nmcli connection modify NAME KEY VALUE | 修改连接属性 |
nmcli add 关键参数
| 参数 | 含义 | 示例 |
|---|---|---|
type | 连接类型 | ethernet |
ifname | 网络接口名 | eth0 |
con-name | 连接名称 | eth0 |
ipv4.method | IP 获取方式 | manual / auto |
ipv4.addresses | IP/子网掩码 | 172.25.250.10/24 |
ipv4.gateway | 默认网关 | 172.25.250.254 |
ipv4.dns | DNS 服务器 | 172.25.250.254 |
autoconnect | 开机自动连接 | yes / no |
验证
ping classroom.example.com2. 配置软件仓库 (servera)
题目要求
配置 servera 的 YUM 软件仓库。
实际操作
# 创建仓库文件
cat > /etc/yum.repos.d/rhel_dvd.repo << 'EOF'
[BaseOS]
name=RHEL9_BaseOS
baseurl=http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
enabled=1
gpgcheck=0
[AppStream]
name=RHEL9_AppStream
baseurl=http://content.example.com/rhel9.0/x86_64/dvd/AppStream
enabled=1
gpgcheck=0
EOF
# 清理并重建缓存
dnf clean all
dnf makecache扩展开的知识点
YUM 仓库配置文件
- 文件位于
/etc/yum.repos.d/,必须以.repo结尾 - 每个
[section]定义一个仓库 - 考试对文件名和仓库名不作要求,可自主命名
仓库配置项
| 配置项 | 含义 |
|---|---|
name | 仓库描述名称 |
baseurl | 仓库地址 |
enabled | 1=启用,0=禁用 |
gpgcheck | 1=检查签名,0=不检查 |
验证
dnf repolist all3. 调试 SELinux(Web 非标准端口)
题目要求
Web 服务器在端口 82 上运行失败,修复以确保:
- 能访问
/var/www/html中的文件 - 通过 82 端口访问
- 系统启动时自动启动 httpd
- SELinux 保持 Enforcing 模式
实际操作
# 1. 确认端口
grep Listen /etc/httpd/conf/httpd.conf
# 2. 放行 SELinux 82 端口
semanage port -a -t http_port_t -p tcp 82
# 3. 修复文件上下文
chcon -t httpd_sys_content_t /var/www/html/*
# 4. 启动服务并设置开机自启
systemctl enable --now httpd.service扩展开的知识点
SELinux 端口管理
| 命令 | 作用 |
|---|---|
semanage port -l | 列出所有端口标签 |
semanage port -a -t TYPE -p PROTO PORT | 添加端口标签 |
semanage port -d -t TYPE -p PROTO PORT | 删除端口标签 |
SELinux 文件上下文
| 命令 | 作用 |
|---|---|
chcon -t TYPE FILE | 临时修改文件类型标签(重启后 restorecon 会恢复) |
semanage fcontext -a -t TYPE "PATH(/.*)?" | 永久定义默认上下文 |
restorecon -Rv PATH | 恢复/应用默认上下文 |
ls -lZ | 查看 SELinux 上下文 |
常用 SELinux 类型
| 类型 | 用途 |
|---|---|
http_port_t | HTTP/HTTPS 端口标签 |
httpd_sys_content_t | Web 静态内容标签 |
tmp_t | 临时文件标签(httpd 无法读取) |
验证
curl http://servera:82/file1
# Hello RHEL9 for file14. 创建用户账户
题目要求
创建组 admins,创建用户 harry、natasha(属于 admins 组)、alice(无登录 Shell,不属于 admins),密码均为 redhat。
实际操作
groupadd admins
useradd -G admins harry
useradd -G admins natasha
useradd -s /sbin/nologin alice
echo redhat | passwd --stdin harry
echo redhat | passwd --stdin natasha
echo redhat | passwd --stdin alice扩展开的知识点
useradd 参数
| 参数 | 含义 |
|---|---|
-G GROUP | 指定附加组 |
-s SHELL | 指定登录 Shell |
-u UID | 指定用户 ID |
-d DIR | 指定家目录 |
-M | 不创建家目录 |
-r | 创建系统用户 |
passwd 命令
| 命令 | 作用 |
|---|---|
echo PWD | passwd --stdin USER | 非交互式设密码 |
passwd -l USER | 锁定用户 |
passwd -u USER | 解锁用户 |
组管理
| 命令 | 作用 |
|---|---|
groupadd GROUP | 创建组 |
groupmod | 修改组 |
groupdel | 删除组 |
usermod -aG GROUP USER | 添加用户到附加组 |
验证
id harry5. 配置周期性计划任务
题目要求
以 natasha 用户身份,每周三 15:30 执行 logger "This is a rhcsa exam"。
实际操作
crontab -u natasha -e
# 添加:
# 30 15 * * 3 logger 'This is a rhcsa exam'扩展开的知识点
crontab 时间格式
分 时 日 月 周
30 15 * * 3 # 每周三 15:30| 字段 | 范围 | 特殊写法 |
|---|---|---|
| 分钟 | 0-59 | */5 每5分钟 |
| 小时 | 0-23 | 9-17 9点到17点 |
| 日 | 1-31 | 1,15 1号和15号 |
| 月 | 1-12 | * 每月 |
| 周 | 0-7 (0和7=周日) | 3 周三 |
crontab 命令
| 命令 | 作用 |
|---|---|
crontab -u USER -e | 编辑用户计划任务 |
crontab -u USER -l | 列出计划任务 |
crontab -u USER -r | 删除计划任务 |
验证
crontab -u natasha -l6. 创建共享目录
题目要求
创建 /home/tools,拥有组 admins,组成员可读写访问,新文件自动继承 admins 组。
实际操作
mkdir /home/tools
chgrp admins /home/tools
chmod g+rwx,o=--- /home/tools
chmod g+s /home/tools扩展开的知识点
SGID(Set Group ID)
chmod g+s DIR或chmod 2775 DIR- 在目录上设置 SGID 后,该目录下新建的文件/目录自动继承目录的组
ls -l显示为drwxrws---(组执行位显示s而非x)
chmod 权限
| 命令 | 含义 |
|---|---|
chmod g+rwx | 组添加读写执行权限 |
chmod o=--- | 其他人无任何权限 |
chmod g+s | 设置 SGID |
chmod 2775 | SGID + rwxrwxr-x |
chgrp
chgrp GROUP PATH— 更改文件/目录的拥有组
验证
ls -ld /home/tools
# drwxrws---. 2 root admins 6 Nov 10 13:19 /home/tools7. 配置网络时间同步
题目要求
配置 chrony 向 classroom.example.com 同步时间。
实际操作
vim /etc/chrony.conf
# 添加:
# server classroom.example.com iburst
systemctl restart chronyd.service扩展开的知识点
chrony.conf 配置
| 配置行 | 含义 |
|---|---|
server HOST iburst | 指定 NTP 服务器,iburst 快速同步 |
pool POOL iburst | 使用 NTP 服务器池 |
iburst 参数
- 前 4 个请求以 2 秒间隔发送(而非默认的 16-64 秒)
- 网络连接正常时可在 10 秒内完成首次同步
验证
chronyc sources
# ^* 表示正在同步
# 只要能看到配置的地址即可8. 配置文件系统自动挂载
题目要求
配置 autofs,自动挂载 serverb 的 NFS 共享 /rhome/remoteuser0 到本地 /rhome/remoteuser0。
实际操作
# 安装
yum install autofs -y
# 查看共享
showmount -e serverb.lab.example.com
# 配置主映射文件
echo '/rhome /etc/nfs.auto' >> /etc/auto.master
# 创建映射文件
cat > /etc/nfs.auto << 'EOF'
remoteuser0 -rw serverb.lab.example.com:/rhome/remoteuser0
EOF
# 启动服务
systemctl enable --now autofs.service扩展开的知识点
autofs 架构
/etc/auto.master (主映射)
↓
/rhome /etc/nfs.auto # /rhome 目录由 /etc/nfs.auto 管理
↓
remoteuser0 -rw serverb:/rhome/remoteuser0 # 具体挂载规则映射文件格式
挂载点 选项 源位置
key -rw server:/path| 选项 | 含义 |
|---|---|
-rw | 读写挂载 |
-ro | 只读挂载 |
-rw,soft | 软挂载(超时后返回错误) |
NFS 相关命令
| 命令 | 作用 |
|---|---|
showmount -e HOST | 查看 NFS 共享列表 |
exportfs -v | 查看本机 NFS 导出 |
systemctl restart nfs-server | 重启 NFS 服务 |
验证
su - remoteuser0
df -Th | grep rhome
touch /rhome/remoteuser0/test.txt # 能写入9. 配置用户账户
题目要求
创建用户 john,UID 为 2023,密码 redhat。
实际操作
useradd -u 2023 john
echo redhat | passwd --stdin john10. 查找文件
题目要求
查找属于用户 john 的文件,复制到 /root/findfiles。
实际操作
mkdir -p /root/findfiles
find / -user john -exec cp {} /root/findfiles/ \;扩展开的知识点
find 常用选项
| 选项 | 含义 |
|---|---|
-user USER | 按文件所有者查找 |
-group GROUP | 按文件所属组查找 |
-name PATTERN | 按文件名查找 |
-type f/d/l | 按类型(文件/目录/链接)查找 |
-size +100M | 按大小查找 |
-mtime -7 | 最近 7 天修改的文件 |
-perm MODE | 按权限查找 |
-exec CMD {} \; | 对找到的文件执行命令 |
exec 语法
find ... -exec COMMAND {} \;
# {} 代表找到的文件
# \; 表示 exec 结束验证
ls /root/findfiles/11. 查找字符串
题目要求
从 /etc/man_db.conf 中找所有含 sbin 的行,导入 /root/out.txt(不含空行)。
实际操作
grep sbin /etc/man_db.conf > /root/out.txt扩展开的知识点
grep 常用选项
| 选项 | 含义 |
|---|---|
-i | 忽略大小写 |
-v | 反向匹配(排除) |
-n | 显示行号 |
-r | 递归搜索目录 |
-c | 只显示匹配行数 |
-E | 扩展正则表达式 |
-w | 匹配整个单词 |
验证
cat /root/out.txt12. 创建归档
题目要求
创建 /root/backup-YYYY-MM-DD.tar.bz2 归档 /usr/local。
实际操作
tar -cjf /root/backup-$(date +%F).tar.bz2 /usr/local/扩展开的知识点
tar 压缩选项
| 选项 | 压缩格式 |
|---|---|
-z | gzip(.tar.gz) |
-j | bzip2(.tar.bz2) |
-J | xz(.tar.xz) |
tar 操作选项
| 选项 | 作用 |
|---|---|
-c | 创建归档 |
-x | 解压归档 |
-t | 列出归档内容 |
-f | 指定文件名 |
-v | 显示详细信息 |
date 命令
| 格式 | 输出 |
|---|---|
date +%F | 2023-11-10 |
date +%Y%m%d | 20231110 |
date +%H:%M | 14:30 |
验证
file /root/backup-*.tar.bz213. 创建容器镜像
题目要求
以 sashat 用户,使用 http://content.example.com/Containerfile 创建 modify_file:latest 镜像。
实际操作
# 以 sashat 身份
ssh sashat@servera
# 下载 Containerfile
wget http://content.example.com/Containerfile
# 登录镜像仓库
podman login registry.lab.example.com
# admin / redhat321
# 构建镜像
podman build -t modify_file:latest .扩展开的知识点
podman build
| 参数 | 含义 |
|---|---|
-t NAME:TAG | 指定镜像名和标签 |
. | 构建上下文(当前目录) |
镜像仓库配置
# /etc/containers/registries.conf
unqualified-search-registries = ['registry.lab.example.com']
[[registry]]
location = "registry.lab.example.com"
insecure = true
blocked = false验证
podman images14. 配置容器开机自启
题目要求
创建 rootless 容器 txt2pdf,使用 modify_file 镜像,配置为 systemd 服务自动启动。
实际操作
# 创建映射目录
mkdir /opt/{txt,pdf}
chown sashat:sashat /opt/{txt,pdf}
# 以 sashat 身份运行容器
ssh sashat@servera
podman run -d --name txt2pdf \
-v /opt/txt/:/opt/txt:Z \
-v /opt/pdf:/opt/pdf:Z \
localhost/modify_file:latest
# 生成 systemd 服务文件
mkdir -p ~/.config/systemd/user
cd ~/.config/systemd/user
podman generate systemd txt2pdf --files --name --new
# 启用服务
systemctl --user daemon-reload
systemctl --user enable container-txt2pdf.service扩展开的知识点
Rootless 容器
- 普通用户(非 root)运行的容器
- systemd 服务文件在
~/.config/systemd/user/ - 使用
systemctl --user管理
podman run 参数
→ 完整参数详解见 第 18 题 podman run 参数详解
| 参数 | 含义 |
|---|---|
-d | 后台运行 |
--name NAME | 容器名称 |
-v HOST:CONTAINER:Z | 挂载卷(:Z 为 SELinux 标签) |
podman generate systemd
| 参数 | 含义 |
|---|---|
--files | 生成 .service 文件 |
--name | 使用容器名命名 |
--new | 每次启动创建新容器 |
lingering(持久化)
loginctl enable-linger sashat确保用户退出后服务仍在运行。
验证
# 测试
podman rm -f txt2pdf
systemctl --user restart container-txt2pdf.service
podman ps
echo "hello rhcsa" > /opt/txt/rhcsa.txt
ls /opt/pdf/15. 配置 sudo 提权
题目要求
允许 admins 组成员以 root 身份执行任何命令,无需密码。
实际操作
echo '%admins ALL=(root) NOPASSWD:ALL' > /etc/sudoers.d/admins
chmod 440 /etc/sudoers.d/admins扩展开的知识点
sudoers 格式
谁 在哪台机器=(以谁的身份) 命令
%admins ALL=(root) NOPASSWD:ALL| 字段 | 含义 |
|---|---|
%admins | % 表示组 |
ALL | 所有主机 |
(root) | 以 root 身份 |
NOPASSWD: | 不需要密码 |
ALL | 所有命令 |
验证安全配置
visudo -c # 检查 sudoers 语法验证
su - harry
sudo id
# uid=0(root)16. 设置默认密码策略
题目要求
新创建用户密码默认 20 天后过期。
实际操作
vim /etc/login.defs
# PASS_MAX_DAYS 20扩展开的知识点
/etc/login.defs 密码策略
| 参数 | 含义 |
|---|---|
PASS_MAX_DAYS | 密码最长使用天数 |
PASS_MIN_DAYS | 密码最短使用天数 |
PASS_MIN_LEN | 密码最小长度 |
PASS_WARN_AGE | 过期前警告天数 |
chage 命令
| 命令 | 作用 |
|---|---|
chage -l USER | 查看密码过期信息 |
chage -M DAYS USER | 设置密码最大天数 |
chage -E DATE USER | 设置账户过期日期 |
验证
useradd testuser
chage -l testuser
# Maximum number of days between password change: 20
userdel -r testuser17. 创建系统监控脚本
题目要求
创建 /usr/local/bin/exam_sysinfo 脚本,按 CPU 百分比排序输出进程信息。
实际操作
cat > /usr/local/bin/exam_sysinfo << 'EOF'
#!/bin/bash
ps -xao user,pid,vsz,rss,%cpu --sort=%cpu
EOF
chmod +x /usr/local/bin/exam_sysinfo扩展开的知识点
ps 输出参数
| 参数 | 含义 |
|---|---|
user | 进程所有者 |
pid | 进程 ID |
vsz | 虚拟内存大小 |
rss | 实际内存大小 |
%cpu | CPU 使用率 |
ps 选项
| 选项 | 含义 |
|---|---|
-x | 包含无终端的进程 |
-a | 所有用户的进程 |
-o | 自定义输出格式 |
--sort=%cpu | 按 CPU 排序 |
18. 运行一个容器(rsyslog)
题目要求
从 tar 包导入 rsyslog 镜像,推送到仓库,运行容器,用 logger 发送日志。
实际操作
# 下载并导入
wget http://content.example.com/rsyslog.tar
podman load < rsyslog.tar
# 标记并推送
podman image tag localhost/rsyslog:latest registry.lab.example.com/library/rsyslog:latest
podman login registry.lab.example.com
podman push registry.lab.example.com/library/rsyslog:latest
# 运行容器
mkdir /home/sashat/syslog
podman run -d --privileged --name logserver \
-v /home/sashat/syslog:/var/log:Z \
registry.lab.example.com/library/rsyslog:latest
# 进入容器写日志
podman exec -it logserver /bin/bash
logger "This is a rhcsa exam"podman run 参数详解
| 参数 | 含义 | 详细说明 |
|---|---|---|
-d | 后台运行(detach) | 容器在后台执行,不占用当前终端 |
--privileged | 特权模式 | 赋予容器几乎等同于宿主机 root 的权限,可访问设备、内核参数等。题目需要挂载卷并写入日志,必须加此参数 |
-v HOST:CONTAINER:Z | 挂载卷 | 将宿主机目录映射到容器内;:Z 为 SELinux 私有标签(仅本容器可访问),:z 为共享标签 |
--name NAME | 容器命名 | 方便后续 podman exec/restart/rm 操作 |
镜像来源说明
本地 (localhost/rsyslog:latest) 和远程仓库 (registry.lab.example.com/library/rsyslog:latest) 都能运行,本质是同一个镜像。
考试建议:用远程仓库地址运行,因为题目要求推送到仓库,用远程地址能验证推送是否成功。
扩展开的知识点
podman 镜像操作
| 命令 | 作用 |
|---|---|
podman load < FILE | 从 tar 文件导入镜像 |
podman save IMAGE > FILE | 导出镜像到 tar |
podman image tag SRC DEST | 给镜像打标签 |
podman push IMAGE | 推送镜像到仓库 |
podman pull IMAGE | 拉取镜像 |
podman exec -it CMD | 在运行容器中执行命令 |
验证
grep rhcsa /home/sashat/syslog/messages19. 重置 root 密码 (serverb)
题目要求
将 serverb 的 root 密码重置为 Young。
实际操作
1. 重启系统
2. 在 GRUB 菜单,选择要启动的内核,按 e 编辑
3. 找到 linux 开头的行,删除到 ro 后面,添加 rd.break
4. 按 Ctrl+X 启动
5. 进入紧急模式后:
switch_root:/# mount -o remount,rw /sysroot
switch_root:/# chroot /sysroot
sh-4.4# echo Young | passwd --stdin root
sh-4.4# touch /.autorelabel
sh-4.4# exit
switch_root:/# exit扩展开的知识点
mount 命令详解
mount -o remount,rw /sysroot
│ │ │ │
│ │ │ └─ 挂载点:真实的系统根目录
│ │ └─ 选项:remount(重新挂载,不卸载直接改选项)+ rw(读写模式)
│ └─ -o:指定挂载选项
└─ mount:挂载命令| 参数 | 含义 |
|---|---|
-o remount | 重新挂载,不卸载直接修改挂载选项 |
rw | 读写模式(默认 /sysroot 是只读的) |
/sysroot | 真实系统根目录(chroot 环境下的根) |
为什么需要这步? 安全启动后 /sysroot 以只读方式挂载,改密码需要写权限,所以必须 remount 为 rw。
rd.break 流程
reboot → GRUB 菜单 → 按 e 编辑内核行 → 添加 rd.break → Ctrl+X 启动
→ mount -o remount,rw /sysroot → chroot /sysroot → 改密码 → touch /.autorelabel关键步骤
| 步骤 | 命令 | 含义 |
|---|---|---|
| 1 | mount -o remount,rw /sysroot | 以读写方式挂载系统根 |
| 2 | chroot /sysroot | 切换到真实系统根目录 |
| 3 | passwd | 修改密码 |
| 4 | touch /.autorelabel | 创建标签重打标记(SELinux) |
20. 配置软件仓库 (serverb)
题目要求
在 serverb 上配置 YUM 仓库,操作与 第 2 题 完全相同。
实际操作
# 与第 2 题操作一致,详见 [第 2 题](#2-配置软件仓库-servera)
cat > /etc/yum.repos.d/rhel_dvd.repo << 'EOF'
[BaseOS]
name=RHEL9_BaseOS
baseurl=http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
enabled=1
gpgcheck=0
[AppStream]
name=RHEL9_AppStream
baseurl=http://content.example.com/rhel9.0/x86_64/dvd/AppStream
enabled=1
gpgcheck=0
EOF
dnf clean all && dnf makecache💡 同一套操作,只是换了个服务器。 仓库配置项含义详见 第 2 题扩展知识点。
21. 调整逻辑卷大小
题目要求
将 exam 卷组中 rhel 逻辑卷扩容到 512M,保留文件系统内容。
实际操作
# 如果逻辑卷不存在,先创建 LVM 环境
# 1. 创建分区
parted /dev/vdb mklabel gpt
parted /dev/vdb mkpart primary 0% 100%
# 2. 创建 PV/VG/LV
pvcreate /dev/vdb1
vgcreate exam /dev/vdb1
lvcreate -L 480M -n rhel exam
# 3. 格式化并挂载
mkfs.xfs /dev/exam/rhel
mkdir /mnt/rhel
echo '/dev/exam/rhel /mnt/rhel xfs defaults 0 0' >> /etc/fstab
mount -a
# 扩容(题目核心操作)
lvextend -r -L 512M /dev/exam/rhel扩展开的知识点
lvextend / lvreduce
| 参数 | 含义 |
|---|---|
-r | 同时调整文件系统大小(resize2fs/xfs_growfs) |
-L SIZE | 指定新大小(绝对) |
-L +SIZE | 增加多少(相对) |
验证命令详解
| 命令 | 用途 | 显示内容 |
|---|---|---|
df -Th | 查看已挂载文件系统 | 文件系统类型(xfs/ext4)+ 使用率 + 挂载点 |
lsblk | 查看块设备树 | 所有块设备层级关系(含未挂载的分区/LV) |
lvs | 查看逻辑卷 | 逻辑卷名、大小、所属 VG |
df -Th vs lsblk 区别
df -Th:显示已挂载文件系统的实际使用情况,看不到未挂载的分区lsblk:显示所有块设备的层级关系(磁盘→分区→VG→LV),不管有没有挂载
其他相关命令
lvs # 查看逻辑卷信息
vgs # 查看卷组信息
pvs # 查看物理卷信息
blkid # 查看设备 UUID 和文件系统类型LVM 常用命令
| 命令 | 作用 |
|---|---|
lvs / lvdisplay | 查看逻辑卷 |
vgs / vgdisplay | 查看卷组 |
pvs / pvdisplay | 查看物理卷 |
lvcreate | 创建逻辑卷 |
lvextend | 扩容逻辑卷 |
lvreduce | 缩减逻辑卷 |
lvremove | 删除逻辑卷 |
验证
df -Th /mnt/rhel
# Size 在 507M 左右正常
# 确认 fstab 中有自动挂载项22. 配置 swap 交换分区
题目要求
向 serverb 添加一个 512MiB 交换分区,开机自动挂载。
实际操作
# 1. 创建分区
fdisk /dev/vdb
# n → 直接回车 → 分区号默认 → 起始扇区默认 → +512M → t → 分区号默认 → 82 → w
# 2. 格式化 swap
mkswap /dev/vdb2
# 3. 配置开机自动挂载
echo '/dev/vdb2 swap swap defaults 0 0' >> /etc/fstab
# 4. 启用所有 swap
swapon -a扩展开的知识点
fdisk 操作
| 键 | 作用 |
|---|---|
n | 新建分区 |
d | 删除分区 |
p | 打印分区表 |
t | 更改分区类型 |
w | 保存并退出 |
q | 不保存退出 |
分区类型代码
| 代码 | 类型 |
|---|---|
82 | Linux swap |
83 | Linux 标准 |
8e | Linux LVM |
fstab 格式
设备 挂载点 类型 选项 dump fsck
/dev/vdb2 swap swap defaults 0 0验证
free -m # 查看 swap 大小23. 创建逻辑卷
题目要求
创建逻辑卷 myvg/mylv:50 个 PE(每个 PE 16MiB),ext3 格式化,挂载到 /mnt/mydata。
实际操作
# 1. 创建分区
fdisk /dev/vdb
# n → 分区号默认 → +1G → t → 分区号默认 → 8e → w
# 2. 创建卷组(指定 PE 大小)
vgcreate -s 16M myvg /dev/vdb3
# 3. 创建逻辑卷(50 个 PE)
lvcreate -l 50 -n mylv myvg
# 4. 格式化
mkfs.ext3 /dev/myvg/mylv
# 5. 挂载
mkdir /mnt/mydata
echo '/dev/myvg/mylv /mnt/mydata ext3 defaults 0 0' >> /etc/fstab
mount -a扩展开的知识点
PE(Physical Extent)概念
- PE 是 LVM 的最小分配单元
-s 16M设置 PE 大小为 16MiB- 逻辑卷大小 = PE 数量 × PE 大小
- 50 × 16MiB = 800MiB
lvcreate 参数
| 参数 | 含义 |
|---|---|
-L SIZE | 按绝对大小创建 |
-l NUM | 按 PE 数量创建 |
-n NAME | 逻辑卷名称 |
验证
df -Th /mnt/mydata24. 配置系统调优
题目要求
将系统调优配置设置为 tuned 推荐的配置。
实际操作
# 查看推荐配置
tuned-adm recommend
# 设置为推荐配置
tuned-adm profile virtual-guest扩展开的知识点
tuned 命令
| 命令 | 作用 |
|---|---|
tuned-adm recommend | 查看系统推荐的调优方案 |
tuned-adm profile NAME | 设置调优方案 |
tuned-adm active | 查看当前激活的方案 |
tuned-adm list | 列出所有可用方案 |
tuned-adm off | 关闭调优 |
验证
tuned-adm list | grep Current
# Current active profile: virtual-guest29. RHCSA 新增题型:配置 Umask (2026-05-24)
题目要求
设置 natasha 用户 umask 为 044,永久生效。
实际操作
# 切换到 natasha 用户
su - natasha
# 设置 umask
umask 044
# 永久生效:写入 ~/.bashrc(用户级,不是 /etc/profile)
echo "umask 044" >> ~/.bashrc
source .bashrc
# 验证
mkdir testdir
touch testfile
ls -l
dr--r--r--. 目录权限 777-044=733
-r--r--r--. 文件权限 666-044=622关键点
| 要点 | 说明 |
|---|---|
| umask 计算 | 目录: 777-044=733, 文件: 666-044=622 |
| 永久生效位置 | ~/.bashrc(用户级),不是 /etc/profile |
追加用 >> | 不能用 > 覆盖,否则会清空原有内容 |
source .bashrc | 让当前 shell 立即生效,不用重新登录 |
30. RHCSA 新增题型:编辑应用程序 (2026-05-24)
题目要求
在 /usr/bin/ex200 写入 echo 命令,执行后输出指定内容。
实际操作
# 写入命令(外单内双引号嵌套)
echo 'echo "This is RHCSA Exam"' > /usr/bin/ex200
chmod +x /usr/bin/ex200
# 验证
su - natasha
ex200
# This is RHCSA Exam关键点
/usr/bin/在 PATH 里,放这里直接敲名字能执行- 引号嵌套:外单内双,防止 shell 解析内层双引号
31. RHCSA 新增题型:搜索脚本 (2026-05-24)
题目要求
创建 /usr/local/bin/mysearch 脚本,使用 find 搜索文件并输出结果。
实际操作
cat > /usr/local/bin/mysearch << 'EOF'
#!/bin/bash
find / -size +30k -size -50k -perm -4000 -type f > /root/myfile
EOF
chmod a+x /usr/local/bin/mysearch
mysearchfind 参数详解
| 参数 | 含义 |
|---|---|
-size +30k | 大于 30KB |
-size -50k | 小于 50KB |
-perm -4000 | 包含 SUID 位(- 是包含,不是精确匹配) |
-type f | 普通文件 |
32. RHCSA 新增题型:SELinux 调试脚本 (2026-05-24)
题目要求
编写脚本完成 SELinux 三板斧操作:添加端口、修改文件标签。
→ SELinux 命令详解见 第 3 题扩展知识点 和 第 25 题
实际操作
cat > /root/selinux_debug.sh << 'EOF'
#!/bin/bash
echo "Fixing SELinux..."
semanage port -a -t http_port_t -p tcp 82
chcon -t httpd_sys_content_t /var/www/html/*
EOF
chmod +x /root/selinux_debug.shSELinux 三板斧
| 步骤 | 命令 | 说明 |
|---|---|---|
| 1 | getenforce | 查看当前模式 |
| 2 | semanage port -a -t http_port_t -p tcp 82 | 添加非标端口 |
| 3 | chcon -t httpd_sys_content_t /var/www/html/* | 给文件打 Web 标签 |
chcon是临时修改,考试环境够用- 永久修改用
semanage fcontext+restorecon
33. RHCSA 容器题变化:三合一 (2026-05-24)
变化说明
从自定义构建镜像 → 拉取现成镜像,3道容器题合并1道。
完整流程
# 1. 登录仓库(考前须知给地址)
podman login registry.lab.example.com
# 2. 拉取镜像(地址因座位号不同)
podman search 搜索镜像
podman pull 拉取镜像
# 3. 生成 systemd 服务
podman generate systemd --new --name container-txt2pdf --files
# 4. 移动到用户级服务目录
mv container-txt2pdf.service ~/.config/systemd/user/
# 5. 启用服务
systemctl --user daemon-reload
systemctl --user enable --now container-txt2pdf.service
# 6. 关键:启用 linger(root 执行)
loginctl enable-linger sashat关键点
| 要点 | 说明 |
|---|---|
| 镜像地址 | 不固定,看考前须知,用 podman search 确认 |
挂载加 :Z | SELinux 标签,否则容器可能无权限访问 |
| linger | 确保用户退出后服务继续运行,必须 root 执行 |
| 用户级服务 | 用 systemctl --user,不能 sudo |
综合速查
系统服务管理
systemctl enable --now SERVICE # 启用并立即启动
systemctl status SERVICE # 查看状态
systemctl restart SERVICE # 重启
systemctl reload SERVICE # 重载配置SELinux 速查
getenforce # 查看当前状态
setenforce 1/0 # enforcing/permissive
semanage port -l # 列出端口标签
semanage port -a -t TYPE -p PROTO PORT # 添加端口
chcon -t TYPE FILE # 临时改文件标签
restorecon -Rv DIR # 恢复默认标签
ls -lZ # 查看上下文LVM 速查
pvcreate /dev/vdb1 # 创建 PV
vgcreate VGNAME PV # 创建 VG
lvcreate -L SIZE -n LVNAME VG # 创建 LV
lvextend -r -L SIZE DEV # 扩容 LV + 文件系统容器速查
podman build -t NAME:TAG . # 构建镜像
podman run -d --name NAME IMAGE # 运行容器
podman generate systemd NAME --files --name --new # 生成 service
systemctl --user enable --now SERVICE
loginctl enable-linger USER # 用户持久化容器镜像构建方式对比:第13题 vs 第18题
核心区别
- 第13题:给的是 Containerfile(构建配方),用
podman build生成本地镜像 - 第18题:给的是 tar 包(已打包的镜像),用
podman load导入本地镜像
为什么不能互换?
- Containerfile 是文本配方,不能
load,只能build - tar 包是成品镜像,不能
build,只能load - 两者最终效果一样:先在本地存储生成镜像,再
podman push推到仓库
关键命令对比
| 步骤 | 第13题 | 第18题 |
|---|---|---|
| 生成本地镜像 | podman build -t name:tag . | podman load < file.tar |
| 打标签 | build时 -t 直接指定 | podman tag localhost/name:tag registry/name:tag |
| 推送 | podman push | podman push |
记忆口诀
- 有菜谱(Containerfile)→ 自己炒菜(build)
- 有成品(tar包)→ 装盘上桌(load + tag + push)
25. chcon 命令与 SELinux 标签
chcon -t tmp_t /var/www/html/*→ SELinux 端口管理、文件上下文命令详见 第 3 题扩展知识点
参数拆解
| 参数 | 含义 |
|---|---|
chcon | Change Context,修改 SELinux 安全上下文 |
-t | 指定修改类型(type) |
tmp_t | 临时文件类型标签 |
/var/www/html/* | 目标文件 |
SELinux 安全上下文格式
用户:角色:类型:级别
system_u:object_r:httpd_sys_content_t:s0
↑
类型(type),决定进程能否访问核心规则:进程只能访问和它类型匹配的文件。
常见类型标签
| 标签 | 含义 |
|---|---|
httpd_sys_content_t | httpd 能访问的网页内容 |
httpd_sys_rw_t | httpd 能读写的文件 |
tmp_t | 临时文件 |
admin_home_t | 管理员家目录文件 |
chcon vs semanage
| 命令 | 效果 | 持久性 |
|---|---|---|
chcon -t type file | 临时改标签 | ❌ 重启/restorecon 后恢复 |
semanage fcontext -a -t type "path" | 永久改策略 | ✅ 持久生效 |
chcon 是临时补救,semanage 才是正解。
26. ls -lz 命令(查看 SELinux 标签)
ls -lz /var/www/html/→ SELinux 安全上下文格式详解见 第 25 题
参数
| 参数 | 含义 |
|---|---|
-l | 长格式显示(权限、所有者、大小、时间) |
-z | 显示 SELinux 安全上下文 |
SELinux 上下文格式
unconfined_u:object_r:httpd_sys_content_t:s0
↑ ↑ ↑ ↑
用户 角色 类型 级别| 字段 | 含义 |
|---|---|
| 用户 | 文件属于哪个 SELinux 用户 |
| 角色 | 文件角色(文件固定 object_r) |
| 类型 | 关键字段,决定哪些进程能访问 |
| 级别 | MLS 安全级别(单级系统固定 s0) |
其他查看方式
ls -lZ /var/www/html/ # 大写 Z,和 -z 效果一样
getfattr -n security.selinux /var/www/html/file1一句话
ls -lz = 长格式 + 显示 SELinux 标签,检查文件安全上下文是否正确。
27. useradd -s /sbin/nologin 详解
useradd -s /sbin/nologin alice参数
| 参数 | 含义 |
|---|---|
-s | 指定用户的登录 shell |
/sbin/nologin | 拒绝交互式登录的特殊 shell |
为什么不能登录?
- 用户登录时系统执行其登录 shell
/bin/bash→ 启动命令行,可交互/sbin/nologin→ 直接拒绝,提示 "This account is currently not available"
使用场景
不是所有用户都需要登录。系统服务用的用户不需要交互:
useradd -s /sbin/nologin nginx # nginx 服务账号
useradd -s /sbin/nologin mysql # 数据库服务账号安全原则:服务用专用用户跑,但不让登录,防止被利用。
nologin vs false
| shell | 行为 |
|---|---|
/sbin/nologin | 拒绝登录,友好提示 |
/bin/false | 拒绝登录,静默失败 |
28. ls -ld vs ls -lZ 对比
ls -ld
ls -ld /home/tools| 参数 | 含义 |
|---|---|
-l | 长格式 |
-d | 显示目录本身,不进入目录列内容 |
ls -l /home/tools # 列出目录里面的文件
ls -ld /home/tools # 只看目录自己的属性Set GID(权限里的 s)
drwxrws---. 2 root admins 6 Nov 10 13:19 /home/tools
↑
Set GID- 目录的组执行位出现
s= Set GID - 效果:该目录下新建的文件,所属组自动继承
admins组,而不是创建者的主组
对比
| 命令 | 用途 |
|---|---|
ls -ld /home/tools | 查看目录本身的权限和属性 |
ls -lZ /home/tools | 查看目录里文件的 SELinux 标签 |
ls -ldZ /home/tools | 查看目录本身的 SELinux 标签(两者组合) |
一句话:-d 看目录自己,-Z 看 SELinux 标签,可以组合使用。
34. 容器镜像系统概述 (2026-07-01)
什么是容器镜像?
镜像是一个只读模板,包含运行应用所需的一切:
- 应用代码
- 运行时环境(Python、Java...)
- 系统库文件
- 环境变量、配置
类比:镜像 = 装好软件的系统盘,容器 = 用这个盘启动的一台虚拟机。
分层结构
┌─────────────────────┐
│ 应用代码层 (COPY) │ ← 最上层,每次改代码只重建这一层
├─────────────────────┤
│ 依赖安装层 (RUN) │ ← 比如 pip install
├─────────────────────┤
│ 基础镜像层 (FROM) │ ← 比如 python:3.11-slim
└─────────────────────┘- 多个镜像共享相同的层,节省磁盘空间
- 改了上层,下层不用重建(构建缓存)
- 分发时只传输变化的层
RHCSA 用 Podman,不是 Docker
podman --version
# RHEL 9/10 默认用 podman,命令和 docker 几乎一样
# 区别:podman 无守护进程、支持 rootless核心操作速查
| 操作 | 命令 |
|---|---|
| 拉取镜像 | podman pull <image> |
| 查看镜像 | podman images |
| 运行容器 | podman run -d --name <name> -p <host:cont> <image> |
| 进入容器 | podman exec -it <name> /bin/bash |
| 查看日志 | podman logs <name> |
| 导出镜像 | podman save -o <file.tar> <image> |
| 导入镜像 | podman load -i <file.tar> |
| 推送镜像 | podman login → podman tag → podman push |
| 删除镜像 | podman rmi <image> |
| 清理悬空镜像 | podman image prune |
Containerfile 编写
FROM registry.access.redhat.com/ubi9/ubi:latest
RUN dnf install -y python3 && dnf clean all
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
EXPOSE 8080
CMD ["python3", "app.py"]关键指令:
| 指令 | 作用 | 示例 |
|---|---|---|
FROM | 指定基础镜像(必须第一行) | FROM ubi9/ubi:latest |
COPY | 复制文件到镜像 | COPY app.py . |
RUN | 执行命令(构建时) | RUN dnf install -y python3 |
CMD | 容器启动时执行的命令 | CMD ["python3", "app.py"] |
EXPOSE | 声明端口(文档作用) | EXPOSE 8080 |
WORKDIR | 设置工作目录 | WORKDIR /app |
构建缓存优化:
- 不常变的指令放前面(利用缓存,加快构建)
RUN命令合并,减少层数:
# 不好(3 层)
RUN dnf install -y python3
RUN dnf install -y pip
RUN dnf clean all
# 好(1 层)
RUN dnf install -y python3 pip && dnf clean allsystemd 管理容器
# 生成 systemd 服务文件
podman generate systemd --new --name web --files
# 复制到 systemd 目录
cp container-web.service /etc/systemd/system/
# 重新加载 + 启用
systemctl daemon-reload
systemctl enable --now container-web.service--new 参数重要:
- 加
--new:systemd 会每次重启时重新创建容器(推荐) - 不加:只做 start/stop,容器配置变了不会更新
考试注意事项
- Podman 是 rootless 的,普通用户也能跑容器
COPY路径是相对于构建上下文(.),不是宿主机根目录- 镜像名格式:
[registry/]repository[:tag],不写 tag 默认 latest save/load是离线传输(tar 文件),push/pull是在线传输(仓库)
35. 容器镜像练习题 (2026-07-01)
题型一:写 Containerfile 构建镜像
题目: 创建 Containerfile,基于 ubi9,安装 python3,复制 app.py,暴露 8080,构建镜像 myapp:v1
mkdir -p /root/container-exam && cd /root/container-exam
cat > app.py << 'EOF'
from http.server import HTTPServer, SimpleHTTPRequestHandler
HTTPServer(('0.0.0.0', 8080), SimpleHTTPRequestHandler).serve_forever()
EOF
cat > Containerfile << 'EOF'
FROM registry.access.redhat.com/ubi9/ubi:latest
RUN dnf install -y python3 && dnf clean all
WORKDIR /app
COPY app.py .
EXPOSE 8080
CMD ["python3", "app.py"]
EOF
podman build -t myapp:v1 .题型二:导出/导入镜像
# 导出
podman save -o /tmp/myapp-v1.tar myapp:v1
# 删除原镜像
podman rmi myapp:v1
# 导入
podman load -i /tmp/myapp-v1.tar
# 验证
podman images题型三:镜像推送到私有仓库
podman login registry.example.com
podman tag myapp:v1 registry.example.com/myrepo/myapp:latest
podman push registry.example.com/myrepo/myapp:latest题型四:容器管理
# 启动
podman run -d --name web -p 8080:8080 myapp:v1
# 查看
podman ps
# 进入容器
podman exec -it web /bin/bash
# 查看日志
podman logs web题型五:systemd 管理容器
podman generate systemd --new --name web --files
cp container-web.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now container-web.service
systemctl status container-web.service题型六:容器网络
# 创建自定义网络
podman network create mynet
# 多容器通过容器名互通
podman run -d --name web --network mynet myapp:v1
podman run -d --name client --network mynet ubi9/ubi sleep 3600
podman exec client ping -c 3 web36. RHCSA 报考指南 (2026-07-01)
考试基本信息
| 项目 | 内容 |
|---|---|
| 考试代码 | EX200 |
| 当前版本 | 基于 RHEL 10(已从 RHEL 9 升级) |
| 形式 | 上机实操,约 2-3 小时 |
| 费用 | 约 4000-6000 元 |
报名方式
- 不能个人直接报名,必须通过红帽授权培训机构或 Pearson VUE
- 常见机构:达内、中软国际、誉天等
- 培训机构一般有"培训+考试"套餐
前置条件
- RHCSA 不强制要求培训课程,有经验可直接考
- RHCE 必须先有 RHCSA 证书
注意事项
- 考试已升级到 RHEL 10,复习资料要确认版本
- 考位需要排期,建议提前预约
37. 考试复习计划 (2026-07-01)
总览
7/1-7/7 → RHCSA 核心考点突击
7/8-7/14 → RHCE Ansible + 软考穿插
7/15-7/21 → 三科模拟题轮番刷
7/22-7/31 → 考前冲刺 + 考试第一周:RHCSA 核心考点(每天 4h 实操 + 2h 理论)
| 日期 | 上午(实操) | 晚上(复盘) |
|---|---|---|
| Day 1 | LVM 创建:PV → VG → LV → 格式化 → 挂载 | 记笔记,默写命令 |
| Day 2 | LVM 进阶:扩容(在线/离线)、缩容 | 做 2 道 LVM 题 |
| Day 3 | LVM 快照:创建 → 验证 → merge 恢复 | 整理 LVM 完整流程图 |
| Day 4 | 用户权限:useradd/groupadd/chmod/chown/ACL | SELinux 布尔值 + 上下文 |
| Day 5 | systemd:创建自定义服务 → enable → 日志排查 | 练习 journalctl |
| Day 6 | nmcli:配 IP/DNS/路由/Bond/桥接 | systemctl restart NetworkManager |
| Day 7 | Podman:Containerfile → build → run → save/load | systemd 管理容器 |
第二周:RHCE Ansible + 软考(每天 3h Ansible + 3h 软考)
| 日期 | 上午(Ansible) | 下午(软考) |
|---|---|---|
| Day 8-9 | inventory + ad-hoc + playbook 基础 | OSI/TCP-IP + 子网划分 |
| Day 10-11 | loops/conditionals/templates + roles | 路由协议 + 交换机/VLAN |
| Day 12 | 实战写完整 playbook | 网络安全 |
| Day 13-14 | Ansible 查漏补缺 | 软考真题 |
第三周:模拟题轮刷
- 每天一套模拟题(RHCSA/RHCE 轮换)
- 软考真题每天一套
- 错题整理是核心
- 考前 3 天不学新东西,只看错题
关键原则
- 实操 > 看书 — RHCSA/RHCE 都是上机考
- 每天必须碰 Linux — 保持手感
- 错题本 — 考前只看错题
- 软考和 RHCSA 有交集 — 网络配置部分学一份两边用