Difference between revisions of "Netboot"

From NixOS Wiki
Jump to: navigation, search
(update installer system. sshd has been enabled by default since nixpkgs a5872edf2f61d97a4ada2734d543eaaefe25c916)
m (rollback unauthorized mass edits)
Tag: Rollback
 
(11 intermediate revisions by 5 users not shown)
Line 2: Line 2:
  
 
=== Example ===
 
=== Example ===
This example uses [https://github.com/danderson/netboot/tree/master/pixiecore Pixiecore] for hosting, which works in an ordinary network environment with an existing DHCP server.
+
This example uses [https://github.com/danderson/netboot/tree/main/pixiecore Pixiecore] for hosting, which works in an ordinary network environment with an existing DHCP server.
  
<syntaxHighlight lang=bash>
+
Create file <code>system.nix</code>:
#!/usr/bin/env bash
+
<syntaxHighlight lang=nix>
 +
let
 +
  # NixOS 22.11 as of 2023-01-12
 +
  nixpkgs = builtins.getFlake "github:nixos/nixpkgs/54644f409ab471e87014bb305eac8c50190bcf48";
  
set -euo pipefail
+
  sys = nixpkgs.lib.nixosSystem {
 +
    system = "x86_64-linux";
 +
    modules = [
 +
      ({ config, pkgs, lib, modulesPath, ... }: {
 +
        imports = [
 +
          (modulesPath + "/installer/netboot/netboot-minimal.nix")
 +
        ];
 +
        config = {
 +
          ## Some useful options for setting up a new system
 +
          # services.getty.autologinUser = lib.mkForce "root";
 +
          # users.users.root.openssh.authorizedKeys.keys = [ ... ];
 +
          # console.keyMap = "de";
 +
          # hardware.video.hidpi.enable = true;
  
nix-build --out-link /tmp/netboot - <<'EOF'
+
          system.stateVersion = config.system.nixos.release;
let
+
        };
  bootSystem = import <nixpkgs/nixos> {
+
       })
    # system = ...;
+
     ];
 
 
    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.getty.autologinUser = mkForce "root";
 
       # users.users.root.openssh.authorizedKeys.keys = [ ... ];
 
      # console.keyMap = "de";
 
     };
 
 
   };
 
   };
  
   pkgs = import <nixpkgs> {};
+
   run-pixiecore = let
 +
    hostPkgs = if sys.pkgs.system == builtins.currentSystem
 +
              then sys.pkgs
 +
              else nixpkgs.legacyPackages.${builtins.currentSystem};
 +
    build = sys.config.system.build;
 +
  in hostPkgs.writers.writeBash "run-pixiecore" ''
 +
    exec ${hostPkgs.pixiecore}/bin/pixiecore \
 +
      boot ${build.kernel}/bzImage ${build.netbootRamdisk}/initrd \
 +
      --cmdline "init=${build.toplevel}/init loglevel=4" \
 +
      --debug --dhcp-no-bind \
 +
      --port 64172 --status-port 64172 "$@"
 +
  '';
 
in
 
in
   pkgs.symlinkJoin {
+
   run-pixiecore
    name = "netboot";
+
</syntaxHighlight>
    paths = with bootSystem.config.system.build; [
+
 
      netbootRamdisk
+
Run pixiecore:
      kernel
+
<syntaxHighlight lang=bash>
      netbootIpxeScript
+
# Build pixiecore runner
    ];
+
nix build -f system.nix -o /tmp/run-pixiecore
    preferLocalBuild = true;
 
  }
 
EOF
 
  
n=$(realpath /tmp/netboot)
+
# Open required firewall ports
init=$(grep -ohP 'init=\S+' $n/netboot.ipxe)
+
sudo iptables -w -I nixos-fw -p udp -m multiport --dports 67,69,4011 -j ACCEPT
 +
sudo iptables -w -I nixos-fw -p tcp -m tcp --dport 64172 -j ACCEPT
  
nix build -o /tmp/pixiecore nixpkgs.pixiecore
+
# Run pixiecore
 +
sudo $(realpath /tmp/run-pixiecore)
  
# Start the PXE server.
+
# Close ports
# These ports need to be open in your firewall:
+
sudo iptables -w -D nixos-fw -p udp -m multiport --dports 67,69,4011 -j ACCEPT
# UDP: 67, 69
+
sudo iptables -w -D nixos-fw -p tcp -m tcp --dport 64172 -j ACCEPT
# TCP: 64172
 
sudo /tmp/pixiecore/bin/pixiecore \
 
  boot $n/bzImage $n/initrd \
 
  --cmdline "$init loglevel=4" \
 
  --debug --dhcp-no-bind --port 64172 --status-port 64172
 
  
 
</syntaxHighlight>
 
</syntaxHighlight>
  
 
=== See also ===
 
=== See also ===
NixOS: [https://search.nixos.org/options?channel=20.09&from=0&size=30&sort=relevance&query=services.pixiecore Pixiecore module].
+
NixOS: [https://search.nixos.org/options?channel=23.11&from=0&size=30&sort=relevance&type=packages&query=services.pixiecore Pixiecore module].
  
 
NixOS manual: [https://nixos.org/nixos/manual/index.html#sec-booting-from-pxe PXE booting].
 
NixOS manual: [https://nixos.org/nixos/manual/index.html#sec-booting-from-pxe PXE booting].

Latest revision as of 10:58, 6 April 2024

Building and serving a netboot image

Example

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

Create file system.nix:

let
  # NixOS 22.11 as of 2023-01-12
  nixpkgs = builtins.getFlake "github:nixos/nixpkgs/54644f409ab471e87014bb305eac8c50190bcf48";

  sys = nixpkgs.lib.nixosSystem {
    system = "x86_64-linux";
    modules = [
      ({ config, pkgs, lib, modulesPath, ... }: {
        imports = [
          (modulesPath + "/installer/netboot/netboot-minimal.nix")
        ];
        config = {
          ## Some useful options for setting up a new system
          # services.getty.autologinUser = lib.mkForce "root";
          # users.users.root.openssh.authorizedKeys.keys = [ ... ];
          # console.keyMap = "de";
          # hardware.video.hidpi.enable = true;

          system.stateVersion = config.system.nixos.release;
        };
      })
    ];
  };

  run-pixiecore = let
    hostPkgs = if sys.pkgs.system == builtins.currentSystem
               then sys.pkgs
               else nixpkgs.legacyPackages.${builtins.currentSystem};
    build = sys.config.system.build;
  in hostPkgs.writers.writeBash "run-pixiecore" ''
    exec ${hostPkgs.pixiecore}/bin/pixiecore \
      boot ${build.kernel}/bzImage ${build.netbootRamdisk}/initrd \
      --cmdline "init=${build.toplevel}/init loglevel=4" \
      --debug --dhcp-no-bind \
      --port 64172 --status-port 64172 "$@"
  '';
in
  run-pixiecore

Run pixiecore:

# Build pixiecore runner
nix build -f system.nix -o /tmp/run-pixiecore

# Open required firewall ports
sudo iptables -w -I nixos-fw -p udp -m multiport --dports 67,69,4011 -j ACCEPT
sudo iptables -w -I nixos-fw -p tcp -m tcp --dport 64172 -j ACCEPT

# Run pixiecore
sudo $(realpath /tmp/run-pixiecore)

# Close ports
sudo iptables -w -D nixos-fw -p udp -m multiport --dports 67,69,4011 -j ACCEPT
sudo iptables -w -D nixos-fw -p tcp -m tcp --dport 64172 -j ACCEPT

See also

NixOS: Pixiecore module.

NixOS manual: PXE booting.

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