Study guide
16.3 Modify the System Bootloader
Red Hat Certified System Administrator RHCSA
Track your progress as you read
Finished sections get a check mark.
1 Introduction & Exam Overview
1.1 Current Exam Facts 1.2 Lab Setup & Performance-Based Study Strategy
2 Essential Tools: Shell, Redirection & Text Analysis
2.1 Shell Prompt and Command Syntax 2.2 Input-Output Redirection and Pipes 2.3 grep and Regular Expressions for Text Analysis
3 Essential Tools: Remote Access, Users & Text Editing
3.1 Access Remote Systems Using SSH 3.2 Log In and Switch Users in Multiuser Targets 3.3 Create and Edit Text Files
4 Essential Tools: Files, Links & Archives
4.1 Create, Delete, Copy, and Move Files and Directories 4.2 Hard and Soft Links 4.3 Archive and Compress with tar, gzip, and bzip2
5 Essential Tools: Permissions & System Documentation
5.1 List, Set, and Change Standard ugo/rwx Permissions 5.2 System Documentation: man, info, and /usr/share/doc
6 Manage Software: RPM and Flatpak
6.1 Configure Access to RPM Repositories 6.2 Install and Remove RPM Software Packages 6.3 Configure Access to Flatpak Repositories 6.4 Install and Remove Flatpak Software Packages
7 Create Simple Shell Scripts
7.1 Conditional Execution: if, test, and [] 7.2 Looping Constructs for Files and Input 7.3 Process Script Inputs ($1, $2, and Beyond) 7.4 Process Shell Command Output in Scripts
8 Operate Running Systems: Boot and Recovery
8.1 Boot, Reboot, and Shut Down a System Normally 8.2 Boot Systems into Different Targets Manually 8.3 Interrupt the Boot Process to Gain Access
9 Operate Running Systems: Processes and Tuning
9.1 Identify and Kill CPU/Memory Intensive Processes 9.2 Adjust Process Scheduling 9.3 Manage Tuning Profiles
10 Operate Running Systems: Logs, Services & File Transfer
10.1 Locate and Interpret System Log Files and Journals 10.2 Preserve System Journals 10.3 Start, Stop, and Check Status of Network Services 10.4 Securely Transfer Files Between Systems
11 Configure Local Storage: Partitions and LVM
11.1 List, Create, and Delete Partitions on GPT Disks 11.2 Create and Remove Physical Volumes 11.3 Assign Physical Volumes to Volume Groups 11.4 Create and Delete Logical Volumes
12 Configure Local Storage: Mounting and Expansion
12.1 Mount File Systems at Boot by UUID or Label 12.2 Add Partitions, Logical Volumes, and Swap Non-Destructively
13 Create and Configure File Systems: Local FS and Permissions
13.1 Create, Mount, and Use VFAT, ext4, and XFS File Systems 13.2 Extend Existing Logical Volumes 13.3 Diagnose and Correct File Permission Problems
14 Create and Configure File Systems: NFS and autofs
14.1 Mount and Unmount Network File Systems Using NFS 14.2 Configure autofs
15 Deploy and Maintain: Scheduling, Services & Targets
15.1 Schedule Tasks with at, cron, and systemd Timers 15.2 Start, Stop, and Enable Services at Boot 15.3 Configure Systems to Boot into a Specific Target
16 Deploy and Maintain: Time, Software Updates & Bootloader
16.1 Configure Time Service Clients 16.2 Install and Update Software from CDN, Remote Repos, and Local Files 16.3 Modify the System Bootloader
17 Manage Basic Networking
17.1 Configure IPv4 and IPv6 Addresses 17.2 Configure Hostname Resolution 17.3 Configure Network Services to Start Automatically at Boot 17.4 Restrict Network Access Using firewalld and firewall-cmd
18 Manage Users and Groups
18.1 Create, Delete, and Modify Local User Accounts 18.2 Change Passwords and Adjust Password Aging 18.3 Create, Delete, and Modify Local Groups and Memberships 18.4 Configure Privileged Access
19 Manage Security: Firewall, umask & SSH Keys
19.1 Configure Firewall Settings with firewall-cmd and firewalld 19.2 Manage Default File Permissions 19.3 Configure Key-Based Authentication for SSH
20 Manage Security: SELinux Modes and Contexts
20.1 Set Enforcing and Permissive Modes for SELinux 20.2 List and Identify SELinux File and Process Contexts 20.3 Restore Default File Contexts
21 Manage Security: SELinux Ports and Booleans
21.1 Manage SELinux Port Labels 21.2 Use Boolean Settings to Modify SELinux Settings
16.3 Modify the System Bootloader
Key Takeaways Explain This Topic AI
RHEL uses GRUB2; prefer grubby for kernel argument and default-kernel changes, and understand /etc/default/grub plus grub2-mkconfig for regenerating grub.cfg.
Persistent kernel parameters belong in bootloader config (grubby --update-kernel=ALL --args=… or GRUB_CMDLINE_LINUX in /etc/default/grub then grub2-mkconfig)—not only a one-boot GRUB edit.
Know where grub.cfg lives (BIOS vs UEFI paths), how to list kernels with grubby --info=ALL, and how to set a default kernel index or path.
After modifying bootloader config, reboot to prove the kernel command line (cat /proc/cmdline) matches the requirement.
Coordinate with recovery skills (Ch8): one-boot edits help repair; deploy tasks need lasting bootloader changes.
Last updated: August 2026
16.3 Modify the System Bootloader
Quick Answer: List kernels with grubby --info=ALL . Add persistent kernel args with sudo grubby --update-kernel=ALL --args="quiet foo=bar" (and --remove-args= to drop). Set default kernel with grubby --set-default . Alternatively edit /etc/default/grub ( GRUB_CMDLINE_LINUX ) and run grub2-mkconfig -o …/grub.cfg . Prove after reboot with cat /proc/cmdline .
Why bootloader modification is a deploy skill
Operate chapters taught booting, targets, and interrupting GRUB once for recovery. This objective is modify the system bootloader so changes stick :
Add or remove kernel command-line parameters (e.g. console= , systemd.unit= , vendor-required args, removing rhgb / quiet for noisier boot).
Change which kernel is default after installs/updates.
Ensure configuration is correct on BIOS or UEFI layout used by the VM.
Typical wording: “Persistently configure the bootloader so the kernel boots with parameter X,” or “Set the default boot kernel to ….”
GRUB2 on RHEL: mental model
- Piece Role
- Firmware (BIOS/UEFI) Loads GRUB
- GRUB menu / grub.cfg Entries for kernels/initramfs
- Kernel cmdline Parameters passed to the kernel/systemd
- /etc/default/grub Human-edited defaults used when regenerating config
- grubby Red Hat-friendly tool to edit kernel entries/args
- BLS / boot entries UEFI boot variables (related, not always the exam focus)
Generated config paths (know both):
- Firmware style Common grub.cfg path
- BIOS (legacy) /boot/grub2/grub.cfg
- UEFI /boot/efi/EFI/redhat/grub.cfg # Discover what this system uses
- ls /sys/firmware/efi 2>/dev/null && echo UEFI || echo BIOS-or-no-efi-sysfs
- ls -l /boot/grub2/grub.cfg /boot/efi/EFI/redhat/grub.cfg 2>/dev/null
Never hand-edit grub.cfg as your first choice—it is generated and package updates may overwrite careless edits. Prefer grubby or /etc/default/grub + grub2-mkconfig .
- grubby: preferred RHEL interface
- Inventory sudo grubby --info=ALL
- sudo grubby --default-kernel
- sudo grubby --default-index
- sudo grubby --info=$(sudo grubby --default-kernel)
- uname -r
- cat /proc/cmdline
Each boot entry has an index , kernel path, args , initrd , etc.
- Add or remove kernel arguments (persistent) # Add args to ALL installed kernels (common exam pattern)
- sudo grubby --update-kernel=ALL --args="console=ttyS0,115200"
- # Add to the running/default kernel only
- sudo grubby --update-kernel=DEFAULT --args="systemd.unit=multi-user.target"
- # Add to one specific kernel file
- sudo grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="foo=bar"
- # Remove args
- sudo grubby --update-kernel=ALL --remove-args="rhgb quiet" # Verify grubby view
- sudo grubby --info=DEFAULT | grep -E 'args|kernel'
- After reboot: cat /proc/cmdline
- # must contain the new tokens; removed tokens must be gone
ALL vs DEFAULT: If the task says every kernel or you just installed updates, --update-kernel=ALL avoids “works only on the old default.” If only current matters, DEFAULT may be enough—read the task.
Change default kernel sudo grubby --info=ALL | grep -E '^index=|^kernel='
# Set by kernel path:
sudo grubby --set-default /boot/vmlinuz-5.x.x-x.el10.x86_64
# or by index:
- sudo grubby --set-default-index=0
- sudo grubby --default-kernel
Kernel RPMs install new vmlinuz-* under /boot ; default may stay on the newest depending on install scripts— explicitly set default when the task names a version.
- /etc/default/grub and grub2-mkconfig
- Classic durable pattern: sudo cp -a /etc/default/grub /etc/default/grub.bak
- sudo vim /etc/default/grub
Important variables:
- Variable Meaning
- GRUB_TIMEOUT Menu timeout seconds
- GRUB_DEFAULT Default menu entry (saved/index)
- GRUB_CMDLINE_LINUX Kernel args applied when config is generated
GRUB_CMDLINE_LINUX_DEFAULT Sometimes used for non-recovery style entries (distro-dependent; on RHEL focus on GRUB_CMDLINE_LINUX )
- GRUB_DISABLE_SUBMENU Menu layout
- Example: # Ensure a parameter is in GRUB_CMDLINE_LINUX="... existing ... audit=1"
- grep GRUB_CMDLINE_LINUX /etc/default/grub
- Regenerate config: # BIOS-style path
- sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- # UEFI-style path (RHEL)
- sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
On many RHEL systems a convenience wrapper exists: sudo grub2-mkconfig -o $(readlink -e /etc/grub2.cfg 2>/dev/null || readlink -e /etc/grub2-efi.cfg 2>/dev/null)
# or follow Red Hat docs for the platform:
- # BIOS: grub2-mkconfig -o /boot/grub2/grub.cfg
- # UEFI: grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg ls -l /etc/grub2.cfg /etc/grub2-efi.cfg 2>/dev/null
Mismatch trap: Running grub2-mkconfig to the BIOS path on a UEFI VM (or the reverse) updates a file firmware does not use—boot looks unchanged. Detect EFI vs BIOS first, write the correct output path.
grubby vs grub2-mkconfig together
grubby edits BLS/bootloader entries and is the least error-prone for args and default kernel on modern RHEL.
/etc/default/grub + grub2-mkconfig is the traditional regeneration path; still required knowledge when tasks mention those files.
If you use both, avoid fighting yourself: after heavy grubby use, understand that regenerating from /etc/default/grub re-applies GRUB_CMDLINE_LINUX to entries—keep that file consistent with desired args.
One-boot GRUB edit vs persistent change
- Method Persistent? Use
- Edit menu entry once (e key) No Recovery, Ch8
- grubby --args / --remove-args Yes EX200 deploy
- GRUB_CMDLINE_LINUX + grub2-mkconfig Yes EX200 deploy
- systemd.unit= only on one boot No Temporary target
- If the grader reboots twice, only persistent methods pass “configure the bootloader.”
- Password and menu aesthetics (light touch)
EX200 focuses less on GRUB passwords than on cmdline and defaults . Still know: grep GRUB_TIMEOUT /etc/default/grub
# change timeout, then grub2-mkconfig to the correct grub.cfg
Do not set a GRUB password unless asked—you can lock recovery paths.
- Kernel install interaction sudo dnf install -y kernel # may add a new entry
- sudo grubby --info=ALL
- sudo grubby --default-kernel
After kernel updates, confirm default and args still meet the task. Re-apply --update-kernel=ALL --args=… if a new kernel lacks required parameters.
- Verification checklist # 1) Before reboot
- sudo grubby --info=DEFAULT
- grep GRUB_CMDLINE_LINUX /etc/default/grub
- # 2) Reboot
- sudo systemctl reboot
- # 3) After login
- uname -r
- cat /proc/cmdline
- sudo grubby --default-kernel
- Optional: journalctl -b -0 | head
- # confirm system came up with expected console/target behavior
- Exam workflows
- Workflow A — Persist a kernel parameter with grubby sudo grubby --update-kernel=ALL --args="audit=1"
- sudo grubby --info=DEFAULT | grep args
- sudo systemctl reboot
- # cat /proc/cmdline | grep audit=1
- Workflow B — Remove quiet boot noise sudo grubby --update-kernel=ALL --remove-args="rhgb quiet"
- sudo systemctl reboot
- cat /proc/cmdline
- Workflow C — /etc/default/grub path sudo vi /etc/default/grub # add token inside GRUB_CMDLINE_LINUX="..."
# UEFI example:
sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# BIOS example:
- # sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- sudo systemctl reboot
- cat /proc/cmdline
- Workflow D — Set default kernel to a specific version ls /boot/vmlinuz-*
- sudo grubby --set-default /boot/vmlinuz-WANTEDVERSION
- sudo grubby --default-kernel
- sudo systemctl reboot
- uname -r # expect WANTEDVERSION
- Workflow E — Confirm firmware path before mkconfig if [ -d /sys/firmware/efi ]; then
- sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
- else
- sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- fi
- Common traps
Only editing GRUB once at the menu —lost on next reboot.
grub2-mkconfig to the wrong path (BIOS vs UEFI).
Hand-editing only grub.cfg without updating /etc/default/grub or using grubby—fragile.
Adding args to one old kernel while the system boots a newer default without those args.
Typos in cmdline ( audit = 1 with spaces may not mean what you want)—use key=value forms cleanly.
Forgetting reboot verification via /proc/cmdline .
Confusing systemctl set-default (target) with bootloader default kernel .
Removing critical args that break console or root device (rare on VMs but possible).
Assuming grubby alone updated /etc/default/grub —keep mental model clear; verify with grubby --info and /proc/cmdline .
Kernel update overwriting expectations —re-check defaults after dnf upgrade .
Relationship to other chapters
Ch8 operate-boot: one-shot GRUB edits and rescue; this section owns persistence .
15.3 default target: prefer systemctl set-default for multi-user/graphical; bootloader systemd.unit= is alternate/one-boot style unless task says bootloader parameter.
16.2 software updates: new kernels → grubby defaults/args.
Storage/root: cmdline root= and rd.lvm settings are advanced; do not invent unless repairing a known lab breakage.
Section checkpoint
You should inventory entries with grubby --info=ALL , persistently add/remove kernel args , set the default kernel , edit /etc/default/grub and regenerate the correct grub.cfg with grub2-mkconfig , distinguish BIOS vs UEFI paths, avoid relying on one-boot menu edits for deploy tasks, and verify with cat /proc/cmdline after reboot. That is the EX200 standard for modifying the system bootloader on RHEL 10.