IEN-003 - Stage 2 — The Bootloader (GRUB)
At the end of the firmware stage, the computer has completed its hardware initialization and identified a bootable storage device.
However, the firmware still faces one fundamental problem:
It knows where the operating system is stored, but it does not know how to load it.
This is where the bootloader comes into play.
The bootloader acts as the bridge between the firmware and the operating system. Its primary responsibility is to locate the Linux kernel, load it into memory, provide the necessary boot parameters, load the initial RAM disk (initrd or initramfs), and finally transfer execution to the kernel.
Without a bootloader, the firmware has no knowledge of Linux-specific file formats, filesystem layouts, or kernel images.
The bootloader is therefore the first piece of software that understands how to start Linux.
Why Do We Need a Bootloader?
A common misconception is that the firmware could simply load the Linux kernel directly.
While this is technically possible in certain specialized systems, it is not how general-purpose computers are designed.
The firmware is intentionally kept generic. It can initialize hardware and locate a bootable device, but it does not understand:
- Linux kernels
- Windows boot managers
- FreeBSD kernels
- Multiple operating systems
- Kernel command-line arguments
- Recovery modes
Instead, the firmware loads a small program whose sole purpose is boot management.
That program is the bootloader.
Its responsibilities include:
- Presenting a boot menu.
- Selecting an operating system.
- Loading the kernel into memory.
- Loading the initial RAM disk.
- Passing boot parameters to the kernel.
- Supporting recovery and rescue modes.
The Boot Sequence So Far
At this point, the startup sequence looks like this:
Power On
│
▼
Firmware (BIOS / UEFI)
│
▼
POST
│
▼
Boot Device Selected
│
▼
Bootloader (GRUB)
│
▼
Linux Kernel
Notice that Linux itself is still not running.
GRUB is responsible for preparing everything the kernel needs before handing over control.
A Brief History of Linux Bootloaders
Before GRUB became the de facto standard, Linux systems used several different bootloaders.
Some of the most well-known include:
| Bootloader | Status | Notes |
|---|---|---|
| LILO | Legacy | One of the earliest Linux bootloaders. Required reinstallation after kernel changes. |
| GRUB Legacy | Legacy | Widely used by RHEL 5, CentOS 5, and many older distributions. |
| GRUB2 | Current | Successor to GRUB Legacy. More modular and feature-rich. |
| systemd-boot | Current | Lightweight bootloader primarily used on UEFI systems. |
Because much of the Infrastructure Engineering Notes series focuses on enterprise environments—including legacy systems such as RHEL 5—we will encounter both GRUB Legacy and GRUB2.
Understanding their differences is essential when performing recovery operations.
GRUB Legacy vs GRUB2
Although both bootloaders share the same goal, their internal design differs considerably.
| Feature | GRUB Legacy | GRUB2 |
|---|---|---|
| Typical distributions | RHEL 5, CentOS 5 | RHEL 7+, Ubuntu, Debian, Rocky Linux |
| Configuration file | /boot/grub/grub.conf |
/boot/grub2/grub.cfg or /boot/efi/EFI/... |
| Configuration generation | Manual editing | Automatically generated |
| Module support | Limited | Modular architecture |
| Filesystem support | Basic | Extensive |
| UEFI support | No | Yes |
One important point is that GRUB2 is not simply a newer version of GRUB Legacy. It is a complete redesign.
For example, on RHEL 5 you typically edit grub.conf directly. On modern systems, editing grub.cfg manually is discouraged because it is generated automatically from configuration templates.
This distinction becomes important during recovery scenarios.
Inside GRUB Legacy
Under legacy BIOS systems, GRUB is traditionally divided into multiple stages.
+----------------------+
| Stage 1 |
| (MBR) |
+----------+-----------+
│
▼
+----------------------+
| Stage 1.5 |
| Filesystem Support |
+----------+-----------+
│
▼
+----------------------+
| Stage 2 |
| Full GRUB |
+----------+-----------+
│
▼
Read grub.conf
│
▼
Load Kernel
│
▼
Load initrd
Let's examine each stage.
Stage 1
Stage 1 occupies the first 446 bytes of the Master Boot Record (MBR).
Its size is extremely limited, so it cannot understand filesystems or locate the Linux kernel directly.
Its only responsibility is to load the next stage.
Stage 1.5
Stage 1.5 resides immediately after the MBR in the so-called embedding area.
Unlike Stage 1, it contains basic filesystem drivers.
This allows GRUB to read files from partitions such as ext2 or ext3.
Without Stage 1.5, Stage 1 would have no way to locate the full GRUB program stored within the filesystem.
Stage 2
Stage 2 is the full bootloader.
It provides:
- Interactive command line.
- Boot menu.
- Configuration parsing.
- Filesystem access.
- Kernel loading.
- initrd loading.
- Recovery options.
When users refer to "GRUB," they are usually interacting with Stage 2.
The GRUB Configuration File
Once Stage 2 starts, GRUB searches for its configuration file.
On GRUB Legacy systems, this file is usually:
/boot/grub/grub.conf
or
/boot/grub/menu.lst
The configuration file defines:
- Available operating systems.
- Default boot entry.
- Boot timeout.
- Kernel image location.
- initrd image location.
- Kernel parameters.
A simplified example looks like this:
title Red Hat Enterprise Linux
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-128.el5.img
Each line has a specific purpose:
root (hd0,0)tells GRUB where to find the/bootpartition.kernelspecifies the kernel image and its boot parameters.initrdpoints to the initial RAM disk required during early boot.
If any of these paths are incorrect, GRUB may fail before the Linux kernel even begins execution.
Engineering Insight
One of the most common production issues after restoring or cloning a server is that the kernel and initrd files no longer match the entries in grub.conf. GRUB itself is functioning correctly, but it is instructed to load files that no longer exist or belong to a different kernel version. The result can range from a simple "File not found" message to a kernel panic later in the boot process.
This is exactly the type of issue we encountered during our RHEL 5.2 recovery project, and we will revisit it in detail later in this series.
Loading the Linux Kernel
Once a boot entry is selected, GRUB performs one of its most important tasks: loading the Linux kernel into memory.
At this stage, the kernel is still just a compressed binary file stored on disk.
GRUB reads this file from the /boot filesystem, copies it into RAM, and prepares the execution environment.
Immediately afterward, it loads the corresponding initrd (or initramfs) image into memory as well.
Only when both components are ready does GRUB transfer control to the Linux kernel.
From that moment onward, the bootloader's job is complete.
The Linux kernel takes over, and the boot process enters its next stage.
Common Bootloader Failures
Understanding common failures helps quickly identify whether a problem belongs to the bootloader stage.
| Symptom | Likely Cause |
|---|---|
grub> prompt |
Missing or incorrect configuration |
grub rescue> |
GRUB cannot locate its modules or filesystem |
Error 15: File not found |
Kernel or initrd path is incorrect |
Unknown filesystem |
Filesystem driver unavailable or partition damaged |
| Boot menu does not appear | Corrupted GRUB installation or wrong boot target |
A key observation is that none of these errors originate from the Linux kernel. They occur before the kernel starts executing.
Summary
The bootloader is responsible for bridging the gap between firmware and the Linux kernel. It locates the kernel image, loads the initial RAM disk, passes kernel parameters, and transfers control to the operating system.
A failure at this stage prevents Linux from starting entirely, making it essential to distinguish bootloader issues from kernel or userspace problems.