nixos/activation, switch-to-configuration-ng, doc: improve NIXOS_LUSTRATE installation experience (#349049)

Changed files
+54 -19
nixos
doc
modules
system
pkgs
by-name
sw
switch-to-configuration-ng
src
src
+43 -11
nixos/doc/manual/installation/installing-from-other-distro.section.md
···
Refer to the `nixos-generate-config` step in
[](#sec-installation) for more information.
+
::: {.note}
+
On [UEFI](https://en.wikipedia.org/wiki/UEFI) systems, check that your `/etc/nixos/hardware-configuration.nix` did the right thing with the [EFI System Partition](https://en.wikipedia.org/wiki/EFI_system_partition).
+
In NixOS, by default, both [systemd-boot](https://systemd.io/BOOT/) and [grub](https://www.gnu.org/software/grub/index.html) expect it to be mounted on `/boot`.
+
However, the configuration generator bases its [](#opt-fileSystems) configuration on the current mount points at the time it is run.
+
If the current system and NixOS's bootloader configuration don't agree on where the [EFI System Partition](https://en.wikipedia.org/wiki/EFI_system_partition) is to be mounted, you'll need to manually alter the mount point in `hardware-configuration.nix` before building the system closure.
+
:::
+
+
::: {.note}
+
The lustrate process will not work if the [](#opt-boot.initrd.systemd.enable) option is set to `true`.
+
If you want to use this option, wait until after the first boot into the NixOS system to enable it and rebuild.
+
:::
+
You'll likely want to set a root password for your first boot using
the configuration files because you won't have a chance to enter a
password until after you reboot. You can initialize the root password
···
$ echo etc/nixos | sudo tee -a /etc/NIXOS_LUSTRATE
```
-
1. Finally, move the `/boot` directory of your current distribution out
-
of the way (the lustrate process will take care of the rest once you
-
reboot, but this one must be moved out now because NixOS needs to
-
install its own boot files:
+
1. Finally, install NixOS's boot system, backing up the current boot system's files in the process.
+
+
The details of this step can vary depending on the bootloader configuration in NixOS and the bootloader in use by the current system.
+
+
The commands below should work for:
+
+
- [BIOS](https://en.wikipedia.org/wiki/BIOS) systems.
+
+
- [UEFI](https://en.wikipedia.org/wiki/UEFI) systems where both the current system and NixOS mount the [EFI System Partition](https://en.wikipedia.org/wiki/EFI_system_partition) on `/boot`.
+
Both [systemd-boot](https://systemd.io/BOOT/) and [grub](https://www.gnu.org/software/grub/index.html) expect this by default in NixOS, but other distributions vary.
::: {.warning}
-
Once you complete this step, your current distribution will no
-
longer be bootable! If you didn't get all the NixOS configuration
-
right, especially those settings pertaining to boot loading and root
-
partition, NixOS may not be bootable either. Have a USB rescue
-
device ready in case this happens.
+
Once you complete this step, your current distribution will no longer be bootable!
+
If you didn't get all the NixOS configuration right, especially those settings pertaining to boot loading and root partition, NixOS may not be bootable either.
+
Have a USB rescue device ready in case this happens.
+
:::
+
+
::: {.warning}
+
On [UEFI](https://en.wikipedia.org/wiki/UEFI) systems, anything on the [EFI System Partition](https://en.wikipedia.org/wiki/EFI_system_partition) will be removed by these commands, such as other coexisting OS's bootloaders.
:::
```ShellSession
-
$ sudo mv -v /boot /boot.bak &&
-
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration boot
+
$ sudo mkdir /boot.bak && sudo mv /boot/* /boot.bak &&
+
sudo NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
```
Cross your fingers, reboot, hopefully you should get a NixOS prompt!
+
+
In other cases, most commonly where the [EFI System Partition](https://en.wikipedia.org/wiki/EFI_system_partition) of the current system is instead mounted on `/boot/efi`, the goal is to:
+
+
- Make sure `/boot` (and the [EFI System Partition](https://en.wikipedia.org/wiki/EFI_system_partition), if mounted elsewhere) are mounted how the NixOS configuration would mount them.
+
+
- Clear them of files related to the current system, backing them up outside of `/boot`.
+
NixOS will move the backups into `/old-root` along with everything else when it first boots.
+
+
- Instruct the NixOS closure built earlier to install its bootloader with:
+
```ShellSession
+
sudo NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
+
```
1. If for some reason you want to revert to the old distribution,
you'll need to boot on a USB rescue disk and do something along
+6 -4
nixos/modules/system/activation/switch-to-configuration.pl
···
my $out = "@out@";
# System closure path to switch to
my $toplevel = "@toplevel@";
-
# Path to the directory containing systemd tools of the old system
-
my $cur_systemd = abs_path("/run/current-system/sw/bin");
-
# Path to the systemd store path of the new system
-
my $new_systemd = "@systemd@";
# To be robust against interruption, record what units need to be started etc.
# We read these files again every time this script starts to make sure we continue
···
if ($action eq "boot") {
exit(0);
}
+
+
# Path to the directory containing systemd tools of the old system
+
# Needs to be after the "boot" action exits, as this directory will not exist when doing a NIXOS_LUSTRATE install
+
my $cur_systemd = abs_path("/run/current-system/sw/bin");
+
# Path to the systemd store path of the new system
+
my $new_systemd = "@systemd@";
# Check if we can activate the new configuration.
my $cur_init_interface_version = read_file("/run/current-system/init-interface-version", err_mode => "quiet") // "";
+5 -4
pkgs/by-name/sw/switch-to-configuration-ng/src/src/main.rs
···
std::env::set_var("LOCALE_ARCHIVE", locale_archive);
}
-
let current_system_bin = std::path::PathBuf::from("/run/current-system/sw/bin")
-
.canonicalize()
-
.context("/run/current-system/sw/bin is missing")?;
-
let os_release = parse_os_release().context("Failed to parse os-release")?;
let distro_id_re = Regex::new(format!("^\"?{}\"?$", distro_id).as_str())
···
if *action == Action::Boot {
std::process::exit(0);
+
+
// Needs to be after the "boot" action exits, as this directory will not exist when doing a NIXOS_LUSTRATE install
+
let current_system_bin = std::path::PathBuf::from("/run/current-system/sw/bin")
+
.canonicalize()
+
.context("/run/current-system/sw/bin is missing")?;
let current_init_interface_version =
std::fs::read_to_string("/run/current-system/init-interface-version").unwrap_or_default();