Objectives
What the exam tests
- Create, delete, and modify local user accounts
- Change passwords and adjust password aging policies
- Create, delete, and modify local groups and group memberships
- Configure superuser access using
sudo - Configure network interfaces and hostname using NetworkManager
- Configure time service clients using
chrony - Install and update software from Red Hat Network or local repository
- Modify the system bootloader (GRUB2)
- Work with Kickstart files to automate installation
- Manage containers using
podmanandskopeo - Run and manage rootless containers
- Configure container services to start automatically as systemd services
- Attach persistent storage to a running container
- Find, inspect, and manage container images
User/group management and networking with nmcli are guaranteed on every RHCSA exam. Containers (Podman) were added to the EX200 objectives and carry significant weight on RHEL 9 exams.
Coverage weight by topic
Users and groups
User account management
usermod -aG group user — the -a flag (append) is critical. Without it, -G replaces all supplementary groups, removing the user from every other group.
Passwords and aging policy
| Key file | Contents |
|---|---|
/etc/passwd | User accounts: name, UID, GID, home, shell (no passwords) |
/etc/shadow | Hashed passwords and aging fields (root-readable only) |
/etc/group | Group names, GIDs, and member lists |
/etc/gshadow | Group passwords and administrators |
/etc/login.defs | Default values for new accounts (UID ranges, aging defaults) |
/etc/skel/ | Template files copied to new user home directories |
Group management
sudo — superuser access
The safest exam approach: add users to the wheel group with usermod -aG wheel username. The %wheel ALL=(ALL) ALL line in /etc/sudoers is enabled by default on RHEL 9.
Network configuration
Network inspection commands
nmcli — NetworkManager command line
Connection names and device names are different things. The connection name (e.g., "ens3") is a NetworkManager profile label; the device name (e.g., ens3) is the kernel interface name. They often match but don't have to.
Hostname configuration
firewalld — basic firewall management
Always use --permanent for rules that must survive a reboot, then follow with --reload. Rules added without --permanent are lost when the firewall reloads.
Time services and chrony
System time commands
chrony — NTP client configuration
| chronyc sources column | Meaning |
|---|---|
* | Currently selected (syncing) source |
+ | Acceptable source (could be used) |
- | Not selected (not used) |
? | Unreachable source |
x | Source marked as a falseticker (bad time) |
On the exam: set the NTP server in /etc/chrony.conf, restart chronyd, then verify sync with chronyc sources. Look for * next to the configured server.
Kickstart automated installation
Kickstart overview and file structure
A Kickstart file (.cfg) is a plain-text script that answers all Anaconda installer prompts automatically, enabling unattended RHEL installations.
Kickstart file — annotated example
Validating Kickstart files
GRUB2 bootloader management
Container management with Podman
Podman vs Docker — key differences
Podman (RHEL 9 default)
- Daemonless — no background service required
- Rootless containers run as regular users
- OCI-compatible — same image format as Docker
- Drop-in Docker CLI replacement (most commands identical)
- Integrates with systemd for service management
- Supports pods (multiple containers as a unit)
skopeo — image inspection tool
- Inspect images without pulling them
- Copy images between registries
- Delete images from registries
- Does not require a running daemon
- Works with Docker and OCI registries
Managing container images
Running containers
When mounting host directories into rootless containers, always append :Z (or :z for shared) to the volume flag. Without it, SELinux will deny the container access to the host directory.
Container lifecycle management
Containers as systemd services
On the RHCSA exam you will be asked to configure a container to start automatically at boot. The correct approach for rootless containers is to generate a systemd unit file with podman generate systemd and enable it as a user service.
loginctl enable-linger is the critical step that is often missed. Without it, user systemd services only start when the user logs in, not at system boot.
Persistent storage for containers
Cheat sheet
Most-tested commands — quick reference
useradd -m -s /bin/bash alicepasswd aliceusermod -aG wheel aliceusermod -L alice / usermod -U alicechage -l alicechage -d 0 alicegroupadd devsgetent group devsvisudonmcli device statusnmcli con mod "ens3" ipv4.method manual ipv4.addresses "x.x.x.x/24"nmcli con up "ens3"hostnamectl set-hostname srv1.example.comfirewall-cmd --permanent --add-service=httpfirewall-cmd --reloadtimedatectl set-timezone America/Phoenixchronyc sourcespodman pull nginxpodman run -d --name web -p 8080:80 nginxpodman ps -apodman logs -f webserverpodman exec -it webserver bashpodman generate systemd --name web --new --filessystemctl --user enable --now container-web.serviceloginctl enable-linger alicepodman run -v /host/dir:/ctr/dir:Z ...useradd / usermod flag reference
| Flag | useradd | usermod |
|---|---|---|
-u UID | Set UID | Change UID |
-g group | Primary group | Change primary group |
-G groups | Supplementary groups | Replace supplementary groups (use with -a!) |
-a | N/A | Append — must combine with -G |
-s shell | Login shell | Change shell |
-d dir | Home directory path | New home path (use -m to move contents) |
-m | Create home if missing | Move home directory contents |
-c comment | GECOS field | Change comment |
-e date | Account expiry | Change expiry |
-r | System account | N/A |
-L | N/A | Lock account |
-U | N/A | Unlock account |
-l name | N/A | Rename login name |
Container systemd service — exam checklist
Practice quiz
Question 1 of 8
You want to add user alice to the wheel group without removing her from any other groups. Which command is correct?
usermod -aG wheel alice — the -a (append) flag is mandatory. Without it, usermod -G wheel alice replaces all of alice's supplementary groups with only wheel, effectively removing her from every other group. Options C and D use non-existent flags.Question 2 of 8
Which command forces user bob to change his password the next time he logs in?
chage -d 0 bob sets the "last password change" date to day 0 (epoch), making the password immediately expired. On next login, the system will require a new password. Option C (passwd --expire) is also valid and does the same thing. Option A (usermod -e 0) sets the account expiry to epoch — it locks the account entirely. Option D (chage -M 0) sets the max days to 0, which means the password is always expired — different use case.Question 3 of 8
You need to persistently configure interface ens3 with IP 192.168.1.50/24, gateway 192.168.1.1, and DNS 8.8.8.8. Which command sequence is correct?
nmcli con mod modifies the NetworkManager connection profile and persists across reboots. The subsequent nmcli con up applies the changes immediately. Option A (ifcfg files) was the RHEL 7/8 approach but is deprecated on RHEL 9. Options C and D use ip and ifconfig — these are runtime-only and do not survive a reboot.Question 4 of 8
After configuring a chrony NTP server, how do you verify the system is actively synchronizing with it?
chronyc sources lists all configured NTP sources and their synchronization status. A * symbol next to a server means chronyd is currently syncing from it. Option A confirms the service is running but not whether it is actually syncing. Option C is a command to enable NTP (action), not a verification. ntpstat works with the older ntpd, not chrony.Question 5 of 8
You run a rootless container with: podman run -d -v /home/alice/data:/app/data --name myapp myimage. The container cannot access the mounted directory. What is the most likely cause?
:Z (private unshared label) or :z (shared label) to the volume flag. Without it, SELinux will deny the container process access to the host directory. The correct flag is: -v /home/alice/data:/app/data:Z. Rootless containers do support bind mounts, and --privileged is not needed here.Question 6 of 8
You generate a systemd unit file for a rootless container and enable it with systemctl --user enable --now container-myapp.service. After a system reboot, the container does not start. What step was missed?
loginctl enable-linger username allows the user's systemd session (and therefore user services) to persist after logout and start at boot without requiring the user to log in first. Without lingering enabled, user services only start when the user has an active login session — they stop at logout and do not restart at boot.Question 7 of 8
Which firewall-cmd command permanently allows HTTP traffic and applies the rule immediately?
--permanent writes the rule to disk (persists reboots) but does not activate it in the running firewall. --reload then loads the permanent rules into the runtime configuration. Option A adds to runtime only — lost on reload. Option C adds to permanent but never activates it immediately. Option D — --now is not a valid firewall-cmd flag.Question 8 of 8
Which tool should you use to inspect the metadata of a remote container image without pulling it to local storage?
skopeo inspect docker://registry/image:tag queries the registry directly and returns image metadata (labels, environment, layers, etc.) without downloading the image to local storage. podman inspect only works on images already in local storage. podman search lists matching images but does not show detailed metadata. Option D pulls the entire image first — unnecessary if you only need metadata.