Definition: A bootloader is a small program that loads the operating system into memory when a computer starts up.
Boot Process Overview
graph TD
Power[Power On] --> BIOS[BIOS/UEFI]
BIOS --> POST[Power-On Self-Test]
POST --> Boot[Find Boot Device]
Boot --> MBR[Load Bootloader from MBR/EFI]
MBR --> Stage1[Stage 1 Bootloader]
Stage1 --> Stage2[Stage 2 Bootloader]
Stage2 --> Kernel[Load Kernel]
Kernel --> Init[Initialize System]
Init --> OS[Operating System Running]
Boot Stages
Stage 1: BIOS/UEFI
- Firmware initializes hardware
- Runs Power-On Self-Test (POST)
- Identifies boot device (HDD, SSD, USB)
- Loads first 512 bytes (MBR) or EFI partition
Stage 2: First-Stage Bootloader
- Stored in MBR (Master Boot Record)
- Very small (446 bytes for code)
- Loads second-stage bootloader
MBR Structure (512 bytes):
┌────────────────────┬──────────────┬──────┐
│ Bootstrap Code │ Partition │ Boot │
│ (446 bytes) │ Table (64 B) │ Sig │
└────────────────────┴──────────────┴──────┘
0x55AA
Stage 3: Second-Stage Bootloader
- Larger, more capable bootloader
- Provides boot menu (if multiple OSes)
- Loads kernel and initramfs
- Passes control to kernel
Common Bootloaders
| Bootloader | Platform | Features |
|---|---|---|
| GRUB2 | Linux | Multi-boot, scripting, modules |
| Windows Boot Manager | Windows | BCD store, Secure Boot |
| U-Boot | Embedded | Network boot, multiple architectures |
| rEFInd | UEFI | Boot manager, graphical interface |
GRUB2 Configuration
GRUB Configuration File
# /boot/grub/grub.cfg (auto-generated)
menuentry 'Ubuntu' {
set root='hd0,gpt2'
linux /boot/vmlinuz-5.15.0 root=/dev/sda2 ro quiet splash
initrd /boot/initrd.img-5.15.0
}
menuentry 'Windows 10' {
insmod part_gpt
insmod ntfs
set root='hd0,gpt1'
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
Update GRUB
# Edit configuration
sudo nano /etc/default/grub
# Update GRUB
sudo update-grub
# Or manually
sudo grub-mkconfig -o /boot/grub/grub.cfg
UEFI vs BIOS
| Aspect | BIOS (Legacy) | UEFI |
|---|---|---|
| Boot Mode | 16-bit real mode | 32/64-bit protected mode |
| Partition Scheme | MBR (2TB limit) | GPT (9.4ZB limit) |
| Boot Speed | Slower | Faster |
| Security | None | Secure Boot |
| Interface | Text-based | Graphical + mouse support |
Secure Boot
UEFI feature that ensures only trusted software runs during boot.
graph TD
Boot[Boot Starts] --> Check{Verify Signature}
Check -->|Valid| Load[Load Bootloader]
Check -->|Invalid| Block[Block Boot]
Load --> VerifyKernel{Verify Kernel}
VerifyKernel -->|Valid| StartOS[Start OS]
VerifyKernel -->|Invalid| Block
- Uses cryptographic signatures
- Prevents rootkits and bootkits
- Requires signed bootloaders and kernels
Bootloader Installation
Install GRUB (Linux)
# Install GRUB to disk
sudo grub-install /dev/sda
# For UEFI systems
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi
# Update configuration
sudo update-grub
Repair Windows Bootloader
# From Windows Recovery Environment
bootrec /fixmbr
bootrec /fixboot
bootrec /rebuildbcd
# Or use BCDEdit
bcdedit /export C:\BCD_Backup
bcdedit /createstore C:\boot\BCD
bcdedit /store C:\boot\BCD /create {bootmgr}
Embedded Bootloaders
U-Boot Example
// U-Boot commands
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2
setenv bootcmd 'mmc dev 0; fatload mmc 0:1 0x80000000 uImage; bootm 0x80000000'
saveenv
boot
// Network boot
setenv serverip 192.168.1.100
setenv ipaddr 192.168.1.10
tftp 0x80000000 uImage
bootm 0x80000000
Troubleshooting Boot Issues
Common Problems
- GRUB Rescue: Bootloader corrupted or missing
- Boot Device Not Found: BIOS can't find bootable device
- Kernel Panic: Kernel fails to load or initialize
- Missing Operating System: MBR/GPT corrupted
Recovery Steps
# Boot from Live USB
# Mount root partition
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi # For UEFI
# Chroot into system
sudo chroot /mnt
# Reinstall bootloader
grub-install /dev/sda
update-grub
# Exit and reboot
exit
sudo reboot
Dual Boot Setup
graph LR
GRUB[GRUB Bootloader] --> Linux[Linux Kernel]
GRUB --> Windows[Windows Boot Manager]
Linux --> LinuxOS[Linux OS]
Windows --> WinOS[Windows OS]
Best Practices:
- Install Windows first, then Linux
- Use separate partitions for each OS
- GRUB will detect Windows automatically
- Keep EFI partition shared (UEFI systems)