You need more time to choose a kernel
You upgraded to a new Fedora release and the boot menu vanished. You hold Shift, you mash Escape, but the system plows straight into the default kernel. You need to access recovery mode, or you dual-boot with Windows and the menu flashes too fast to select the other OS. The default one-second timeout is too short for human reaction. You need to change the GRUB timeout to give yourself time to intervene.
How Fedora manages the boot menu
GRUB is the bootloader that runs before the kernel. It presents a menu, waits for input, and loads the selected operating system. Fedora does not store the final boot configuration in a static file you edit by hand. The file /boot/grub2/grub.cfg is generated code. If you edit it directly, your changes disappear the next time you install a kernel update or run a system upgrade.
Fedora keeps a template in /etc/default/grub. This template defines the variables that control the menu behavior. When you change the template, you must run a command to regenerate the configuration file. This two-step process ensures the boot loader stays consistent with the installed kernels and system state.
Fedora provides two tools for managing boot settings. grubby modifies specific parameters across kernel entries and is the recommended tool for single changes. grub2-mkconfig rebuilds the entire configuration from the template. Both tools update the generated file, but grubby is safer for quick tweaks because it does not risk overwriting custom menu entries you may have added manually.
Edit the template, not the output. The output gets overwritten on every kernel update.
Set the timeout with grubby
The fastest way to change the timeout is to use grubby. This tool updates the boot entries directly without requiring you to edit a text file. It applies the change to all installed kernels in one step.
Here is how to check the current timeout value for the default kernel entry.
sudo grubby --default-kernel # WHY: Returns the path of the currently selected default kernel.
sudo grubby --info=$(sudo grubby --default-kernel) | grep timeout # WHY: Filters the output to show only the timeout setting for the default entry.
The output shows a line like timeout="1". The value is in seconds. A value of 1 means the menu waits one second before booting.
Here is how to set the timeout to 10 seconds for all installed kernels.
sudo grubby --update-kernel=ALL --timeout=10 # WHY: Updates the timeout to 10 seconds for every installed kernel entry.
The --update-kernel=ALL flag ensures the change applies to the current kernel and any older kernels still on the system. The --timeout flag sets the wait time. This command modifies the boot entries immediately. You do not need to run grub2-mkconfig after using grubby.
Run grubby for quick changes. It updates entries without touching the template file.
Set the timeout via the configuration template
If you prefer to edit the template file, or if you need to change multiple settings at once, modify /etc/default/grub. This approach is useful when you want to document your changes or apply a batch of configuration updates.
Here is how to open the configuration template for editing.
sudo nano /etc/default/grub # WHY: Opens the configuration template where persistent changes are stored.
Locate the line starting with GRUB_TIMEOUT. Change the value to your desired wait time. You will also see GRUB_TIMEOUT_STYLE. This variable controls whether the menu appears. The default value is hidden, which means the menu only shows if you press a key during boot. If you want the menu to appear automatically, change the style to menu.
GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=menu
The GRUB_TIMEOUT value defines the duration in seconds. The GRUB_TIMEOUT_STYLE value defines the behavior. A timeout of 10 with style hidden will wait 10 seconds but show a blank screen unless you press a key. A timeout of 10 with style menu will show the menu and count down. A timeout of 0 boots immediately regardless of the style. A timeout of -1 waits indefinitely for user input.
After saving the file, you must regenerate the configuration. The template changes do not take effect until the boot loader reads the new values.
Here is how to rebuild the GRUB configuration from the template.
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # WHY: Regenerates the bootloader configuration from the template and writes it to the boot directory.
On most Fedora systems, this command targets the correct path automatically. If your system uses UEFI and the standard path does not work, or if you have a custom EFI layout, you may need to target the EFI directory directly.
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg # WHY: Targets the EFI system partition directly if the standard path is not symlinked correctly.
Run grub2-mkconfig after every template change. The template is just a promise until you build.
Verify the change
After updating the timeout, check the generated configuration file to confirm the value was applied. The generated file contains the actual instructions GRUB executes at boot.
Here is how to check the timeout value in the generated configuration.
grep "set timeout" /boot/grub2/grub.cfg # WHY: Confirms the generated configuration contains the expected timeout value.
The output should show set timeout=10 or similar, matching your setting. If the value is still 1, the regeneration step failed or you edited the wrong file. Check for errors in the grub2-mkconfig output and ensure you saved the template file.
You can also verify the timeout using grubby to see the effective value across all entries.
sudo grubby --info=ALL | grep timeout # WHY: Lists the timeout setting for every installed kernel entry.
All entries should show the same timeout value. If some entries differ, run grubby --update-kernel=ALL --timeout=10 to synchronize them.
Check the generated file before rebooting. A mismatch means the change did not apply.
Common pitfalls and error patterns
Editing the generated file is the most common mistake. Users open /boot/grub2/grub.cfg, change the timeout, and reboot. The change works once. The next kernel update runs grub2-mkconfig automatically and overwrites the file with the old values from the template. The timeout reverts. Always edit /etc/default/grub or use grubby.
The GRUB_TIMEOUT_STYLE setting can hide the menu even with a long timeout. If you set GRUB_TIMEOUT=10 but leave GRUB_TIMEOUT_STYLE=hidden, the system waits 10 seconds with a blank screen. You must press a key to see the menu. Set GRUB_TIMEOUT_STYLE=menu to force the menu to appear. This is essential for dual-boot systems where you need to see the options without guessing.
Dual-boot setups may not show Windows if os-prober is not running. Fedora enables os-prober by default, but some installations disable it. If the timeout is correct but Windows is missing from the menu, check the os-prober status. Run sudo os-prober to see if it detects other operating systems. If it returns nothing, the other OS is not detected. This is not a timeout issue. The timeout only controls how long the menu waits. It does not create menu entries.
UEFI systems sometimes have the configuration file in a different location. The standard path /boot/grub2/grub.cfg is usually a symlink to the EFI directory. If grub2-mkconfig reports an error about the output path, check the EFI partition mount point. The EFI system partition must be mounted at /boot/efi for the standard command to work. If it is mounted elsewhere, adjust the -o flag to match the actual path.
SELinux does not block GRUB configuration changes. The grub2-mkconfig command runs with root privileges and sets the correct security contexts on the generated file. You do not need to adjust SELinux policies for timeout changes. If you see a denial, it is likely related to a custom script or a misconfigured file context, not the timeout setting itself.
Check GRUB_TIMEOUT_STYLE. A timeout does nothing if the style is hidden.
When to use each method
Use grubby --update-kernel=ALL --timeout=10 when you want to change the timeout quickly without touching the template file.
Use grub2-mkconfig when you have modified /etc/default/grub or need to regenerate the full configuration after adding custom menu entries.
Use GRUB_TIMEOUT_STYLE=menu when you want the boot menu to appear automatically without pressing a key.
Use GRUB_TIMEOUT=0 when you want the system to boot the default entry immediately without delay.
Use GRUB_TIMEOUT=-1 when you need the system to wait indefinitely for user input, useful for headless servers accessed via IPMI.
Use os-prober when the timeout is correct but other operating systems are missing from the menu.