Netboot: Difference between revisions

From NixOS Wiki
imported>Hhm
m fix link
imported>Erikarvstedt
Add section 'Building and serving a netboot image'
Line 1: Line 1:
== Building a netboot image ==
== Building and serving a netboot image ==
For information about building your own image, see the [https://nixos.org/nixos/manual/index.html#sec-booting-from-pxe official NixOS Manual].
=== Prerequisites ===
Enable Docker on the host system: <code>virtualisation.docker.enable = true</code>
=== Example ===
This example uses [https://github.com/danderson/netboot/tree/master/pixiecore pixicore] for hosting, which works in an ordinary network environment with an existing DHCP server.


== Hosting Netboot with NixOS ==
<syntaxHighlight lang=bash>
#!/usr/bin/env bash -e


You can import the <code>netboot_server</code> module from [https://github.com/cleverca22/nixos-configs/blob/1d6a7de65c1b133f623fd4ce6619c56ef749ffa6/netboot_server.nix clever].
nix-build --out-link /tmp/netboot - <<'EOF'
let
  nixpkgs = <nixpkgs>;
  pkgs = import nixpkgs {};
 
  configuration = { config, pkgs, lib, ... }: with lib; {
    imports = [
        "${nixpkgs}/nixos/modules/installer/netboot/netboot-minimal.nix"
    ];
    ## Some useful options for setting up a new system
    services.mingetty.autologinUser = mkForce "root";
    # Enable sshd which gets disabled by netboot-minimal.nix
    systemd.services.sshd.wantedBy = mkOverride 0 [ "multi-user.target" ];
    # users.users.root.openssh.authorizedKeys.keys = [ ... ];
    # i18n.consoleKeyMap = "de";
  };
 
  nixos = import "${nixpkgs}/nixos" {
    inherit configuration;
    # system = ...;
  };
in
  pkgs.symlinkJoin {
    name = "netboot";
    paths = with nixos.config.system.build; [
      netbootRamdisk
      kernel
      netbootIpxeScript
    ];
    preferLocalBuild = true;
  }
EOF
 
n=$(realpath /tmp/netboot)
init=$(grep -ohP 'init=\S+' $n/netboot.ipxe)
 
# Start the PXE server.
# These ports need to be open in your firewall:
# UDP: 67, 69
# TCP: 64172
docker run --rm \
      -v /etc/ssl/certs:/etc/ssl/certs:ro \
      -v /nix/store:/nix/store:ro \
      --net=host \
      pixiecore/pixiecore:master \
      boot $n/bzImage $n/initrd \
      --cmdline "$init loglevel=4" \
      -d --dhcp-no-bind --port 64172 --status-port 64172
</syntaxHighlight>
 
See the [https://nixos.org/nixos/manual/index.html#sec-booting-from-pxe official NixOS Manual] for more information about PXE booting.
 
== Native netboot hosting with NixOS ==
Pixiecore is still in the process of being [https://github.com/NixOS/nixpkgs/pull/62113 added  to NixOS]. Meanwhile, you can use the <code>netboot_server</code> module from [https://github.com/cleverca22/nixos-configs/blob/1d6a7de65c1b133f623fd4ce6619c56ef749ffa6/netboot_server.nix clever].


== netboot.xyz ==
== netboot.xyz ==
Line 10: Line 67:
Just select <b>NixOS</b> from Linux installs and you should be ready to go.
Just select <b>NixOS</b> from Linux installs and you should be ready to go.


<b>Note:</b> Your ipxe must be recent enough to support https:// links
<b>Note:</b> Your iPXE must be recent enough to support https:// links

Revision as of 22:10, 7 December 2019

Building and serving a netboot image

Prerequisites

Enable Docker on the host system: virtualisation.docker.enable = true

Example

This example uses pixicore for hosting, which works in an ordinary network environment with an existing DHCP server.

#!/usr/bin/env bash -e

nix-build --out-link /tmp/netboot - <<'EOF'
let
  nixpkgs = <nixpkgs>;
  pkgs = import nixpkgs {};

  configuration = { config, pkgs, lib, ... }: with lib; {
    imports = [
        "${nixpkgs}/nixos/modules/installer/netboot/netboot-minimal.nix"
    ];
    ## Some useful options for setting up a new system
    services.mingetty.autologinUser = mkForce "root";
    # Enable sshd which gets disabled by netboot-minimal.nix
    systemd.services.sshd.wantedBy = mkOverride 0 [ "multi-user.target" ];
    # users.users.root.openssh.authorizedKeys.keys = [ ... ];
    # i18n.consoleKeyMap = "de";
  };

  nixos = import "${nixpkgs}/nixos" {
    inherit configuration;
    # system = ...;
  };
in
  pkgs.symlinkJoin {
    name = "netboot";
    paths = with nixos.config.system.build; [
      netbootRamdisk
      kernel
      netbootIpxeScript
    ];
    preferLocalBuild = true;
  }
EOF

n=$(realpath /tmp/netboot)
init=$(grep -ohP 'init=\S+' $n/netboot.ipxe)

# Start the PXE server.
# These ports need to be open in your firewall:
# UDP: 67, 69
# TCP: 64172
docker run --rm \
       -v /etc/ssl/certs:/etc/ssl/certs:ro \
       -v /nix/store:/nix/store:ro \
       --net=host \
       pixiecore/pixiecore:master \
       boot $n/bzImage $n/initrd \
       --cmdline "$init loglevel=4" \
       -d --dhcp-no-bind --port 64172 --status-port 64172

See the official NixOS Manual for more information about PXE booting.

Native netboot hosting with NixOS

Pixiecore is still in the process of being added to NixOS. Meanwhile, you can use the netboot_server module from clever.

netboot.xyz

There is now official netboot.xyz support. Just select NixOS from Linux installs and you should be ready to go.

Note: Your iPXE must be recent enough to support https:// links