LILO is gone: Linux boot loaders today and how to switch
LILO, the LInux LOader, is no longer maintained or shipped by mainstream distributions. Its last release, 24.2, dates from 2015, and Debian dropped it from testing in 2020. Today almost every Linux system boots with GRUB 2 or systemd-boot; rEFInd and Limine are good alternatives. This page explains what each one does, how to see which one you have, how to switch, and how to repair a system that no longer boots.
The old LILO mini-HOWTO (2001) explained lilo.conf, BIOS disk numbers and the 1024-cylinder limit. None of that applies to a UEFI PC with an NVMe disk. If you still run LILO on an old BIOS machine, the section on switching below is for you.
Why LILO went away
LILO did not understand file systems. When you ran /sbin/lilo, it recorded the disk block numbers where the kernel lay and wrote them into the boot sector. Any change to the kernel file (an update, a copy, even a defragmenter) moved those blocks, and if you forgot to rerun lilo, the machine did not boot. LILO was also built for the PC BIOS. UEFI firmware, which every current PC uses, loads boot programs as files from a FAT partition, the EFI system partition (ESP). GRUB reads file systems at boot time, so it always finds the current kernel, and it runs on both BIOS and UEFI.
Boot loaders today
| Boot loader | Firmware | Where kernels can live | Used by default on |
|---|---|---|---|
| GRUB 2 (2.14, January 2026) | BIOS and UEFI | Almost any file system, LVM, RAID, LUKS | Debian, Ubuntu, Fedora, RHEL/Alma/Rocky, most others |
| systemd-boot | UEFI only | ESP or XBOOTLDR partition (FAT) | Optional; installed by choice |
| rEFInd (0.14.2) | UEFI only | ESP, plus ext4, Btrfs and others through its bundled drivers | Installed separately, in front of another loader |
| Limine (12.x) | BIOS and UEFI | FAT12/16/32 and ISO 9660 only | Installed separately |
- GRUB 2
- A full boot loader with a menu, a shell and scripting. Its menu,
grub.cfg, is generated bygrub-mkconfig(update-grubon Debian/Ubuntu,grub2-mkconfigon Fedora/RHEL). Fedora and RHEL keep each kernel's entry in a small file in/boot/loader/entries/. - systemd-boot
- A small UEFI boot manager. It shows entries from text files in
loader/entries/on the ESP and also finds Unified Kernel Images and other EFI programs. No generated configuration and no bundled file-system drivers; the kernel and initramfs must sit on a FAT partition. Manage it withbootctl. - rEFInd
- A graphical boot manager: it scans disks for kernels and other operating systems at every boot, so it needs almost no configuration. It hands Linux kernels to the firmware to start (kernels can run as EFI programs themselves).
- Limine
- A small, multi-protocol boot loader for BIOS and UEFI. It reads only FAT and ISO 9660, so kernels must be on the ESP or a FAT
/boot.
Which one am I using?
[ -d /sys/firmware/efi ] && echo "UEFI boot" || echo "BIOS (legacy) boot"
sudo efibootmgr -v # UEFI: firmware boot entries and the file each one starts
bootctl status # UEFI: shows the current boot loader, ESP and Secure Boot state
ls /boot/efi/EFI /efi/EFI 2>/dev/null # folders on the ESP: debian, ubuntu, fedora, systemd, refind, BOOT…
On UEFI, efibootmgr output such as Boot0001* debian HD(1,GPT,…)/File(\EFI\debian\shimx64.efi) tells you the firmware starts Debian's shim, which starts GRUB. shimx64.efi is the small signed first-stage loader that lets distribution boot loaders run under Secure Boot.
Switching boot loaders
From LILO to GRUB (old Debian-family BIOS systems)
LILO was last in Debian 10. Before upgrading such a system, replace LILO with GRUB while it still boots. Replace /dev/sda with the disk the BIOS boots from:
sudo apt install grub-pc # BIOS version of GRUB; it may offer to remove lilo
sudo grub-install /dev/sda # writes GRUB to the disk's boot sector
sudo update-grub # builds /boot/grub/grub.cfg from your kernels
sudo apt purge lilo
sudo reboot # reboots the machine
On a GPT disk booted by BIOS, GRUB needs a tiny "BIOS boot" partition (1 MiB, no file system) for its core image; see the Partition mini-HOWTO.
From GRUB to systemd-boot (UEFI only)
This is for experienced users. Keep GRUB installed until the new entry works, and have a live USB ready. On Debian 13:
sudo apt install systemd-boot
sudo bootctl install # copies systemd-boot to the ESP and adds a firmware boot entry
bootctl list # the installed kernels should appear as entries
sudo reboot
If bootctl list does not show your current kernel, add it with sudo kernel-install add $(uname -r) /boot/vmlinuz-$(uname -r) before rebooting.
systemd-boot needs the kernel and initramfs on the ESP (or an XBOOTLDR partition), so the ESP must be large enough to hold several kernels and initramfs files; plan for 1 GiB or more. The kernel command line for new kernels comes from /etc/kernel/cmdline; see the BootPrompt HOWTO. If Secure Boot is on, check that your distribution provides a signed systemd-boot; otherwise keep the shim and GRUB chain.
Adding rEFInd
rEFInd sits in front of whatever you already have. On Ubuntu its author's PPA is the easy route:
sudo apt-add-repository ppa:rodsmith/refind
sudo apt-get update
sudo apt-get install refind # asks whether to install to the ESP
RPM and Debian package files are also on the rEFInd site. With Secure Boot on, read rEFInd's Secure Boot page first: it needs shim or your own keys.
Repair a system that does not boot
A failed update, a Windows reinstall or a firmware reset can leave you with no boot loader or no firmware entry. Boot any live USB of the same distribution, then mount the installed system and reinstall the boot loader from inside it (a chroot). Find your partitions first with lsblk -f. The example uses an NVMe disk with the ESP on partition 1 and root on partition 2:
sudo mount /dev/nvme0n1p2 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi # the ESP (skip on BIOS systems)
for d in dev proc sys run; do sudo mount --rbind /$d /mnt/$d; done
sudo chroot /mnt
If root is on LVM, run vgchange -ay first and mount /dev/mapper/…; if it is encrypted, open it with cryptsetup open before mounting. If /boot is a separate partition, mount it at /mnt/boot before the ESP. Then, inside the chroot:
# Debian, Ubuntu (UEFI with the ESP on /boot/efi, or BIOS with "grub-install /dev/nvme0n1")
grub-install
update-grub
# Fedora, RHEL, Alma, Rocky (UEFI): reinstall the signed files instead of running grub2-install
dnf reinstall grub2-efi-x64 shim-x64
grub2-mkconfig -o /boot/grub2/grub.cfg
# Fedora/RHEL on BIOS (the disk the BIOS boots from, not a partition; check with lsblk)
grub2-install /dev/sda
# systemd-boot
bootctl install
Type exit, unmount (sudo umount -R /mnt) and reboot. If the machine still boots straight into another system, the firmware boot order is wrong; fix it with efibootmgr -o or in the firmware setup screen, as described in the dual-boot mini-HOWTO.
Do not run grub2-install on UEFI Fedora or RHEL. It replaces the signed boot files with unsigned ones, which Secure Boot then refuses to start. Reinstall the packages as shown above.
Mistakes to avoid
- Install the BIOS or the UEFI version of a boot loader to match how the machine actually boots (check
/sys/firmware/efi), not how you think it boots. - Do not format the ESP during a reinstall if other systems use it: Windows and other distributions keep their boot files there too.
- Keep at least one older kernel in the menu. Most distributions do this automatically.
- Keep a live USB stick; see the Bootdisk HOWTO.
The classic LILO mini-HOWTO is kept by the LDP at tldp.org.
Sources
- lilo package tracker (removal history), Debian
- grubby(8): LILO, SILO and ELILO deprecated, rhboot/grubby
- GNU GRUB 2.14 release and manual source, ftp.gnu.org
- update-grub(8), Debian
- systemd-boot(7) and bootctl(1), man7.org
- systemd package tracker (systemd-boot package), Debian
- The rEFInd Boot Manager, Installing rEFInd and rEFInd drivers, Roderick W. Smith
- Limine boot loader and Limine releases, GitHub
- efibootmgr(8), Debian
- Managing, monitoring, and updating the kernel: Reinstalling GRUB (RHEL 10), Red Hat