LILO vs GRUB: A Look Back at Linux Bootloaders

Before GRUB became the near-universal Linux bootloader, LILO (LInux LOader) held that position — and its limitations directly shaped what GRUB was designed to fix.

LILO’s Core Limitation

LILO wrote boot configuration directly to fixed disk sectors at install time — meaning any change to lilo.conf required explicitly re-running the lilo command to write the new configuration to disk. Forgetting this step after editing the config was a classic, genuinely dangerous mistake — the system would boot using the stale, unwritten configuration, sometimes failing entirely if the referenced kernel had since been removed.

GRUB’s Key Improvement

LILO: config changes require re-running <code>lilo</code> to write to disk sectors
GRUB: reads its config file directly AT BOOT TIME from a real filesystem
       - no separate "write" step, no risk of a stale, un-applied config

GRUB could read its configuration and even locate kernels directly from a real, mounted filesystem at boot time, rather than needing configuration baked into fixed disk sectors in advance — a fundamentally more flexible and forgiving design that made LILO’s classic “forgot to re-run lilo” failure mode structurally impossible.

Legacy

By the mid-2000s, GRUB had become the default bootloader across virtually every major distribution, and LILO faded into legacy status — still occasionally found on genuinely old or deliberately minimal systems, but no longer a mainstream choice for new installations.