Bootloader: Difference between revisions

m oopsie, fix iso url
DHCP (talk | contribs)
m Use <syntaxhighlight lang=console> for shell commands and prefix them with "$"
 
(6 intermediate revisions by 6 users not shown)
Line 4: Line 4:


A bootloader is a type of software that manages the loading of the operating system (OS) on the computer at startup. It is responsible for preparing the system before passing control to the OS. Here are the types of bootloaders commonly used in NixOS:
A bootloader is a type of software that manages the loading of the operating system (OS) on the computer at startup. It is responsible for preparing the system before passing control to the OS. Here are the types of bootloaders commonly used in NixOS:
* '''GRUB (Grand Unified Bootloader)''': Widely used, supports multiple operating systems, and provides a boot menu to select how the system boots.
* '''[[GNU GRUB]] (Grand Unified Bootloader)''': Widely used, supports multiple operating systems, and provides a boot menu to select how the system boots.
* '''systemd-boot''': Simple UEFI-only bootloader, formerly known as gummiboot.
* '''[[Systemd/boot|systemd-boot]]''': Simple UEFI-only bootloader, formerly known as gummiboot.
* '''[[Limine]]''': Modern, advanced, multiprotocol bootloader and boot manager.
* '''EFISTUB''': Utilizes the UEFI firmware itself to boot the kernel, without the need for a traditional bootloader.
* '''EFISTUB''': Utilizes the UEFI firmware itself to boot the kernel, without the need for a traditional bootloader.


Line 24: Line 25:
The following command will print which boot mode you are using. This can be used on the NixOS installation image to determine which steps to follow in the guide.
The following command will print which boot mode you are using. This can be used on the NixOS installation image to determine which steps to follow in the guide.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
[ -d /sys/firmware/efi/efivars ] && echo "UEFI" || echo "Legacy"
$ [ -d /sys/firmware/efi/efivars ] && echo "UEFI" || echo "Legacy"
</syntaxhighlight>
</syntaxhighlight>


=== How do I remove older generations from the bootloader? ===
=== How do I remove older generations from the bootloader? ===


First, collect garbages in your system, then rebuild. The scripts will collect leftover files.
First, remove some system generations of your system, then rebuild. The rebuild script will remove stale boot entries.


The first command, in the example below, removes everything older than 14 days.
The first command, in the example below, removes system generations older than 14 days.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
sudo nix-collect-garbage --delete-older-than 14d  
$ sudo nix-env --delete-generations --profile /nix/var/nix/profiles/system 14d
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
sudo nixos-rebuild boot
$ sudo nixos-rebuild boot
</syntaxhighlight>
</syntaxhighlight>


Line 69: Line 70:
};
};
</nowiki>}}
</nowiki>}}
=== Show a custom label or tags for my build in the bootloader menu ===
Most bootloaders like GRUB will show the NixOS version as the name of the generation (as shown with nixos-rebuild list-generations). To add a custom name for your build use [https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=system.nixos.label system.nixos.label]


== Troubleshooting ==
== Troubleshooting ==
Line 95: Line 100:
==== From a running system ====
==== From a running system ====


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
sudo nixos-rebuild --install-bootloader boot
$ sudo nixos-rebuild --install-bootloader boot
</syntaxhighlight>
</syntaxhighlight>


Line 103: Line 108:
Booting from the installation media, mount the root partition under <code>/mnt</code> and the boot partition under <code>/mnt/boot</code>. Next, enter the installed system with <code>nixos-enter</code>, or by manually binding the virtual filesystems and then calling <code>chroot</code>. Finally, run the [https://github.com/NixOS/nixpkgs/blob/e140d71d6330786c40b4bd9c0d59af7ad1a5e86a/nixos/modules/installer/tools/nixos-install.sh#L191-L192 command that the installer would run]. This will re-install the bootloader.
Booting from the installation media, mount the root partition under <code>/mnt</code> and the boot partition under <code>/mnt/boot</code>. Next, enter the installed system with <code>nixos-enter</code>, or by manually binding the virtual filesystems and then calling <code>chroot</code>. Finally, run the [https://github.com/NixOS/nixpkgs/blob/e140d71d6330786c40b4bd9c0d59af7ad1a5e86a/nixos/modules/installer/tools/nixos-install.sh#L191-L192 command that the installer would run]. This will re-install the bootloader.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
mount /dev/[root partition] /mnt
$ mount /dev/[root partition] /mnt
mount /dev/[boot partition] /mnt/boot
$ mount /dev/[boot partition] /mnt/boot
</syntaxhighlight>
</syntaxhighlight>


With <code>nixos-enter</code>:
With <code>nixos-enter</code>:


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
nixos-enter
$ nixos-enter
NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
$ NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
</syntaxhighlight>
</syntaxhighlight>


Or manually:
Or manually:


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
for i in dev proc sys; do mount --rbind /$i /mnt/$i; done
$ for i in dev proc sys; do mount --rbind /$i /mnt/$i; done
NIXOS_INSTALL_BOOTLOADER=1 chroot /mnt \
$ NIXOS_INSTALL_BOOTLOADER=1 chroot /mnt \
    /nix/var/nix/profiles/system/bin/switch-to-configuration boot
      /nix/var/nix/profiles/system/bin/switch-to-configuration boot
</syntaxhighlight>
</syntaxhighlight>


Line 197: Line 202:
Then use efibootmgr to add the entry again, where the disk device is specified, with the partition number followed by the index and finally the path to the grub boot loader.
Then use efibootmgr to add the entry again, where the disk device is specified, with the partition number followed by the index and finally the path to the grub boot loader.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
efibootmgr -c -d /dev/sda -p 1 -L NixOS-boot -l '\EFI\NixOS-boot\grubx64.efi'
$ efibootmgr -c -d /dev/sda -p 1 -L NixOS-boot -l '\EFI\NixOS-boot\grubx64.efi'
</syntaxhighlight>
</syntaxhighlight>