Skip to content

🐧 RHCSA 9.0 知识库 ​

基于模拟题整理,按题号编排,每道题向外扩散关键知识点。 考试在 servera.lab.example.com 和 serverb.lab.example.com 上操作。


考试环境概览 ​

主机IP说明
servera.lab.example.com172.25.0.10主要操作节点
serverb.lab.example.com172.25.0.11第二操作节点
classroom.example.com172.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。

实际操作 ​

bash
# 设置主机名
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.methodIP 获取方式manual / auto
ipv4.addressesIP/子网掩码172.25.250.10/24
ipv4.gateway默认网关172.25.250.254
ipv4.dnsDNS 服务器172.25.250.254
autoconnect开机自动连接yes / no

验证 ​

bash
ping classroom.example.com

2. 配置软件仓库 (servera) ​

题目要求 ​

配置 servera 的 YUM 软件仓库。

实际操作 ​

bash
# 创建仓库文件
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仓库地址
enabled1=启用,0=禁用
gpgcheck1=检查签名,0=不检查

验证 ​

bash
dnf repolist all

3. 调试 SELinux(Web 非标准端口) ​

题目要求 ​

Web 服务器在端口 82 上运行失败,修复以确保:

  • 能访问 /var/www/html 中的文件
  • 通过 82 端口访问
  • 系统启动时自动启动 httpd
  • SELinux 保持 Enforcing 模式

实际操作 ​

bash
# 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_tHTTP/HTTPS 端口标签
httpd_sys_content_tWeb 静态内容标签
tmp_t临时文件标签(httpd 无法读取)

验证 ​

bash
curl http://servera:82/file1
# Hello RHEL9 for file1

4. 创建用户账户 ​

题目要求 ​

创建组 admins,创建用户 harry、natasha(属于 admins 组)、alice(无登录 Shell,不属于 admins),密码均为 redhat。

实际操作 ​

bash
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添加用户到附加组

验证 ​

bash
id harry

5. 配置周期性计划任务 ​

题目要求 ​

以 natasha 用户身份,每周三 15:30 执行 logger "This is a rhcsa exam"。

实际操作 ​

bash
crontab -u natasha -e
# 添加:
# 30 15 * * 3 logger 'This is a rhcsa exam'

扩展开的知识点 ​

crontab 时间格式 ​

分 时 日 月 周
30 15 *  *  3    # 每周三 15:30
字段范围特殊写法
分钟0-59*/5 每5分钟
小时0-239-17 9点到17点
日1-311,15 1号和15号
月1-12* 每月
周0-7 (0和7=周日)3 周三

crontab 命令 ​

命令作用
crontab -u USER -e编辑用户计划任务
crontab -u USER -l列出计划任务
crontab -u USER -r删除计划任务

验证 ​

bash
crontab -u natasha -l

6. 创建共享目录 ​

题目要求 ​

创建 /home/tools,拥有组 admins,组成员可读写访问,新文件自动继承 admins 组。

实际操作 ​

bash
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 2775SGID + rwxrwxr-x

chgrp ​

  • chgrp GROUP PATH — 更改文件/目录的拥有组

验证 ​

bash
ls -ld /home/tools
# drwxrws---. 2 root admins 6 Nov 10 13:19 /home/tools

7. 配置网络时间同步 ​

题目要求 ​

配置 chrony 向 classroom.example.com 同步时间。

实际操作 ​

bash
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 秒内完成首次同步

验证 ​

bash
chronyc sources
# ^* 表示正在同步
# 只要能看到配置的地址即可

8. 配置文件系统自动挂载 ​

题目要求 ​

配置 autofs,自动挂载 serverb 的 NFS 共享 /rhome/remoteuser0 到本地 /rhome/remoteuser0。

实际操作 ​

bash
# 安装
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 服务

验证 ​

bash
su - remoteuser0
df -Th | grep rhome
touch /rhome/remoteuser0/test.txt   # 能写入

9. 配置用户账户 ​

题目要求 ​

创建用户 john,UID 为 2023,密码 redhat。

实际操作 ​

bash
useradd -u 2023 john
echo redhat | passwd --stdin john

10. 查找文件 ​

题目要求 ​

查找属于用户 john 的文件,复制到 /root/findfiles。

实际操作 ​

bash
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 语法 ​

bash
find ... -exec COMMAND {} \;
# {} 代表找到的文件
# \; 表示 exec 结束

验证 ​

bash
ls /root/findfiles/

11. 查找字符串 ​

题目要求 ​

从 /etc/man_db.conf 中找所有含 sbin 的行,导入 /root/out.txt(不含空行)。

实际操作 ​

bash
grep sbin /etc/man_db.conf > /root/out.txt

扩展开的知识点 ​

grep 常用选项 ​

选项含义
-i忽略大小写
-v反向匹配(排除)
-n显示行号
-r递归搜索目录
-c只显示匹配行数
-E扩展正则表达式
-w匹配整个单词

验证 ​

bash
cat /root/out.txt

12. 创建归档 ​

题目要求 ​

创建 /root/backup-YYYY-MM-DD.tar.bz2 归档 /usr/local。

实际操作 ​

bash
tar -cjf /root/backup-$(date +%F).tar.bz2 /usr/local/

扩展开的知识点 ​

tar 压缩选项 ​

选项压缩格式
-zgzip(.tar.gz)
-jbzip2(.tar.bz2)
-Jxz(.tar.xz)

tar 操作选项 ​

选项作用
-c创建归档
-x解压归档
-t列出归档内容
-f指定文件名
-v显示详细信息

date 命令 ​

格式输出
date +%F2023-11-10
date +%Y%m%d20231110
date +%H:%M14:30

验证 ​

bash
file /root/backup-*.tar.bz2

13. 创建容器镜像 ​

题目要求 ​

以 sashat 用户,使用 http://content.example.com/Containerfile 创建 modify_file:latest 镜像。

实际操作 ​

bash
# 以 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指定镜像名和标签
.构建上下文(当前目录)

镜像仓库配置 ​

toml
# /etc/containers/registries.conf
unqualified-search-registries = ['registry.lab.example.com']

[[registry]]
location = "registry.lab.example.com"
insecure = true
blocked = false

验证 ​

bash
podman images

14. 配置容器开机自启 ​

题目要求 ​

创建 rootless 容器 txt2pdf,使用 modify_file 镜像,配置为 systemd 服务自动启动。

实际操作 ​

bash
# 创建映射目录
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(持久化) ​

bash
loginctl enable-linger sashat

确保用户退出后服务仍在运行。

验证 ​

bash
# 测试
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 身份执行任何命令,无需密码。

实际操作 ​

bash
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所有命令

验证安全配置 ​

bash
visudo -c       # 检查 sudoers 语法

验证 ​

bash
su - harry
sudo id
# uid=0(root)

16. 设置默认密码策略 ​

题目要求 ​

新创建用户密码默认 20 天后过期。

实际操作 ​

bash
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设置账户过期日期

验证 ​

bash
useradd testuser
chage -l testuser
# Maximum number of days between password change: 20
userdel -r testuser

17. 创建系统监控脚本 ​

题目要求 ​

创建 /usr/local/bin/exam_sysinfo 脚本,按 CPU 百分比排序输出进程信息。

实际操作 ​

bash
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实际内存大小
%cpuCPU 使用率

ps 选项 ​

选项含义
-x包含无终端的进程
-a所有用户的进程
-o自定义输出格式
--sort=%cpu按 CPU 排序

18. 运行一个容器(rsyslog) ​

题目要求 ​

从 tar 包导入 rsyslog 镜像,推送到仓库,运行容器,用 logger 发送日志。

实际操作 ​

bash
# 下载并导入
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在运行容器中执行命令

验证 ​

bash
grep rhcsa /home/sashat/syslog/messages

19. 重置 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 命令详解 ​

bash
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

关键步骤 ​

步骤命令含义
1mount -o remount,rw /sysroot以读写方式挂载系统根
2chroot /sysroot切换到真实系统根目录
3passwd修改密码
4touch /.autorelabel创建标签重打标记(SELinux)

20. 配置软件仓库 (serverb) ​

题目要求 ​

在 serverb 上配置 YUM 仓库,操作与 第 2 题 完全相同。

实际操作 ​

bash
# 与第 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,保留文件系统内容。

实际操作 ​

bash
# 如果逻辑卷不存在,先创建 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),不管有没有挂载

其他相关命令 ​

bash
lvs              # 查看逻辑卷信息
vgs              # 查看卷组信息
pvs              # 查看物理卷信息
blkid            # 查看设备 UUID 和文件系统类型

LVM 常用命令 ​

命令作用
lvs / lvdisplay查看逻辑卷
vgs / vgdisplay查看卷组
pvs / pvdisplay查看物理卷
lvcreate创建逻辑卷
lvextend扩容逻辑卷
lvreduce缩减逻辑卷
lvremove删除逻辑卷

验证 ​

bash
df -Th /mnt/rhel
# Size 在 507M 左右正常
# 确认 fstab 中有自动挂载项

22. 配置 swap 交换分区 ​

题目要求 ​

向 serverb 添加一个 512MiB 交换分区,开机自动挂载。

实际操作 ​

bash
# 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不保存退出

分区类型代码 ​

代码类型
82Linux swap
83Linux 标准
8eLinux LVM

fstab 格式 ​

设备        挂载点  类型   选项     dump  fsck
/dev/vdb2  swap    swap   defaults 0     0

验证 ​

bash
free -m  # 查看 swap 大小

23. 创建逻辑卷 ​

题目要求 ​

创建逻辑卷 myvg/mylv:50 个 PE(每个 PE 16MiB),ext3 格式化,挂载到 /mnt/mydata。

实际操作 ​

bash
# 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逻辑卷名称

验证 ​

bash
df -Th /mnt/mydata

24. 配置系统调优 ​

题目要求 ​

将系统调优配置设置为 tuned 推荐的配置。

实际操作 ​

bash
# 查看推荐配置
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关闭调优

验证 ​

bash
tuned-adm list | grep Current
# Current active profile: virtual-guest

29. RHCSA 新增题型:配置 Umask (2026-05-24) ​

题目要求 ​

设置 natasha 用户 umask 为 044,永久生效。

实际操作 ​

bash
# 切换到 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 命令,执行后输出指定内容。

实际操作 ​

bash
# 写入命令(外单内双引号嵌套)
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 搜索文件并输出结果。

实际操作 ​

bash
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
mysearch

find 参数详解 ​

参数含义
-size +30k大于 30KB
-size -50k小于 50KB
-perm -4000包含 SUID 位(- 是包含,不是精确匹配)
-type f普通文件

32. RHCSA 新增题型:SELinux 调试脚本 (2026-05-24) ​

题目要求 ​

编写脚本完成 SELinux 三板斧操作:添加端口、修改文件标签。

→ SELinux 命令详解见 第 3 题扩展知识点 和 第 25 题

实际操作 ​

bash
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.sh

SELinux 三板斧 ​

步骤命令说明
1getenforce查看当前模式
2semanage port -a -t http_port_t -p tcp 82添加非标端口
3chcon -t httpd_sys_content_t /var/www/html/*给文件打 Web 标签
  • chcon 是临时修改,考试环境够用
  • 永久修改用 semanage fcontext + restorecon

33. RHCSA 容器题变化:三合一 (2026-05-24) ​

变化说明 ​

从自定义构建镜像 → 拉取现成镜像,3道容器题合并1道。

完整流程 ​

bash
# 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 确认
挂载加 :ZSELinux 标签,否则容器可能无权限访问
linger确保用户退出后服务继续运行,必须 root 执行
用户级服务用 systemctl --user,不能 sudo

综合速查 ​

系统服务管理 ​

bash
systemctl enable --now SERVICE   # 启用并立即启动
systemctl status SERVICE          # 查看状态
systemctl restart SERVICE         # 重启
systemctl reload SERVICE          # 重载配置

SELinux 速查 ​

bash
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 速查 ​

bash
pvcreate /dev/vdb1                # 创建 PV
vgcreate VGNAME PV                # 创建 VG
lvcreate -L SIZE -n LVNAME VG     # 创建 LV
lvextend -r -L SIZE DEV           # 扩容 LV + 文件系统

容器速查 ​

bash
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 pushpodman push

记忆口诀 ​

  • 有菜谱(Containerfile)→ 自己炒菜(build)
  • 有成品(tar包)→ 装盘上桌(load + tag + push)

25. chcon 命令与 SELinux 标签 ​

bash
chcon -t tmp_t /var/www/html/*

→ SELinux 端口管理、文件上下文命令详见 第 3 题扩展知识点

参数拆解 ​

参数含义
chconChange Context,修改 SELinux 安全上下文
-t指定修改类型(type)
tmp_t临时文件类型标签
/var/www/html/*目标文件

SELinux 安全上下文格式 ​

用户:角色:类型:级别
system_u:object_r:httpd_sys_content_t:s0
                ↑
              类型(type),决定进程能否访问

核心规则:进程只能访问和它类型匹配的文件。

常见类型标签 ​

标签含义
httpd_sys_content_thttpd 能访问的网页内容
httpd_sys_rw_thttpd 能读写的文件
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 标签) ​

bash
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)

其他查看方式 ​

bash
ls -lZ /var/www/html/      # 大写 Z,和 -z 效果一样
getfattr -n security.selinux /var/www/html/file1

一句话 ​

ls -lz = 长格式 + 显示 SELinux 标签,检查文件安全上下文是否正确。


27. useradd -s /sbin/nologin 详解 ​

bash
useradd -s /sbin/nologin alice

参数 ​

参数含义
-s指定用户的登录 shell
/sbin/nologin拒绝交互式登录的特殊 shell

为什么不能登录? ​

  • 用户登录时系统执行其登录 shell
  • /bin/bash → 启动命令行,可交互
  • /sbin/nologin → 直接拒绝,提示 "This account is currently not available"

使用场景 ​

不是所有用户都需要登录。系统服务用的用户不需要交互:

bash
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 ​

bash
ls -ld /home/tools
参数含义
-l长格式
-d显示目录本身,不进入目录列内容
bash
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 ​

bash
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 编写 ​

dockerfile
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 命令合并,减少层数:
dockerfile
# 不好(3 层)
RUN dnf install -y python3
RUN dnf install -y pip
RUN dnf clean all

# 好(1 层)
RUN dnf install -y python3 pip && dnf clean all

systemd 管理容器 ​

bash
# 生成 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,容器配置变了不会更新

考试注意事项 ​

  1. Podman 是 rootless 的,普通用户也能跑容器
  2. COPY 路径是相对于构建上下文(.),不是宿主机根目录
  3. 镜像名格式:[registry/]repository[:tag],不写 tag 默认 latest
  4. save/load 是离线传输(tar 文件),push/pull 是在线传输(仓库)

35. 容器镜像练习题 (2026-07-01) ​

题型一:写 Containerfile 构建镜像 ​

题目: 创建 Containerfile,基于 ubi9,安装 python3,复制 app.py,暴露 8080,构建镜像 myapp:v1

bash
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 .

题型二:导出/导入镜像 ​

bash
# 导出
podman save -o /tmp/myapp-v1.tar myapp:v1

# 删除原镜像
podman rmi myapp:v1

# 导入
podman load -i /tmp/myapp-v1.tar

# 验证
podman images

题型三:镜像推送到私有仓库 ​

bash
podman login registry.example.com
podman tag myapp:v1 registry.example.com/myrepo/myapp:latest
podman push registry.example.com/myrepo/myapp:latest

题型四:容器管理 ​

bash
# 启动
podman run -d --name web -p 8080:8080 myapp:v1

# 查看
podman ps

# 进入容器
podman exec -it web /bin/bash

# 查看日志
podman logs web

题型五:systemd 管理容器 ​

bash
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

题型六:容器网络 ​

bash
# 创建自定义网络
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 web

36. 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 1LVM 创建:PV → VG → LV → 格式化 → 挂载记笔记,默写命令
Day 2LVM 进阶:扩容(在线/离线)、缩容做 2 道 LVM 题
Day 3LVM 快照:创建 → 验证 → merge 恢复整理 LVM 完整流程图
Day 4用户权限:useradd/groupadd/chmod/chown/ACLSELinux 布尔值 + 上下文
Day 5systemd:创建自定义服务 → enable → 日志排查练习 journalctl
Day 6nmcli:配 IP/DNS/路由/Bond/桥接systemctl restart NetworkManager
Day 7Podman:Containerfile → build → run → save/loadsystemd 管理容器

第二周:RHCE Ansible + 软考(每天 3h Ansible + 3h 软考) ​

日期上午(Ansible)下午(软考)
Day 8-9inventory + ad-hoc + playbook 基础OSI/TCP-IP + 子网划分
Day 10-11loops/conditionals/templates + roles路由协议 + 交换机/VLAN
Day 12实战写完整 playbook网络安全
Day 13-14Ansible 查漏补缺软考真题

第三周:模拟题轮刷 ​

  • 每天一套模拟题(RHCSA/RHCE 轮换)
  • 软考真题每天一套
  • 错题整理是核心
  • 考前 3 天不学新东西,只看错题

关键原则 ​

  1. 实操 > 看书 — RHCSA/RHCE 都是上机考
  2. 每天必须碰 Linux — 保持手感
  3. 错题本 — 考前只看错题
  4. 软考和 RHCSA 有交集 — 网络配置部分学一份两边用

小弟二号打造的知识体系