Home Explore Blog Models CI



nixpkgs

nixos/doc/manual/installation/installing-kexec.section.md
c05d68202bbc89bea5d49a25eed0baafd2c603780b05b0cd00000003000007f1
# "Booting" into NixOS via kexec {#sec-booting-via-kexec}

In some cases, your system might already be booted into/preinstalled with
another Linux distribution, and booting NixOS by attaching an installation
image is quite a manual process.

This is particularly useful for (cloud) providers where you can't boot a custom
image, but get some Debian or Ubuntu installation.

In these cases, it might be easier to use `kexec` to "jump into NixOS" from the
running system, which only assumes `bash` and `kexec` to be installed on the
machine.

Note that kexec may not work correctly on some hardware, as devices are not
fully re-initialized in the process. In practice, this however is rarely the
case.

To build the necessary files from your current version of nixpkgs,
you can run:

```ShellSession
nix-build -A kexec.x86_64-linux '<nixpkgs/nixos/release.nix>'
```

This will create a `result` directory containing the following:
 - `bzImage` (the Linux kernel)
 - `initrd` (the initrd file)
 - `kexec-boot` (a shellscript invoking `kexec`)

These three files are meant to be copied over to the other already running
Linux Distribution.

Note its symlinks pointing elsewhere, so `cd` in, and use
`scp * root@$destination` to copy it over, rather than rsync.

Once you finished copying, execute `kexec-boot` *on the destination*, and after
some seconds, the machine should be booting into an (ephemeral) NixOS
installation medium.

In case you want to describe your own system closure to kexec into, instead of
the default installer image, you can build your own `configuration.nix`:

```nix
{ modulesPath, ... }:
{
  imports = [ (modulesPath + "/installer/netboot/netboot-minimal.nix") ];

  services.openssh.enable = true;
  users.users.root.openssh.authorizedKeys.keys = [ "my-ssh-pubkey" ];
}
```


```ShellSession
nix-build '<nixpkgs/nixos>' \
  --arg configuration ./configuration.nix
  --attr config.system.build.kexecTree
```

Make sure your `configuration.nix` does still import `netboot-minimal.nix` (or
`netboot-base.nix`).

Chunks
ec4f19bb (1st chunk of `nixos/doc/manual/installation/installing-kexec.section.md`)
Title: Booting NixOS via kexec from another Linux Distribution
Summary
This document describes how to use `kexec` to boot into NixOS from an already running Linux distribution, which is particularly useful in environments like cloud providers where booting custom images is restricted. It outlines the process of building the necessary files (kernel, initrd, kexec-boot script) from nixpkgs, copying them to the target machine, and executing the `kexec-boot` script to initiate an ephemeral NixOS installation. The text also provides instructions for building a custom NixOS system closure to kexec into, rather than the default installer image.