Netboot: Difference between revisions

m Format the recently-added example with `nixfmt-rfc-style`.
Nh2 (talk | contribs)
Link issue
 
(7 intermediate revisions by 4 users not shown)
Line 1: Line 1:
== Building and serving a netboot image ==
== Building and serving a netboot image ==
This provides an easy way to serve the NixOS installer over netboot, such as when you already have a working NixOS machine and want to install NixOS on a second machine connected to the same network.


=== Example ===
=== Example ===
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.
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.
Pixiecore will notice when the booted machine talks to the network's existing DHCP server, and send netboot information to it at that time.


Create file <code>system.nix</code>:
Create file <code>system.nix</code>:
Line 44: Line 47:
in
in
   run-pixiecore
   run-pixiecore
</syntaxHighlight>
</syntaxHighlight>Building:<syntaxhighlight lang="bash">
 
Run pixiecore:
<syntaxHighlight lang=bash>
# Build pixiecore runner
# Build pixiecore runner
nix build -f system.nix -o /tmp/run-pixiecore
nix-build system.nix -o /tmp/run-pixiecore
 
</syntaxhighlight>Running:<syntaxhighlight lang="bash">
# Open required firewall ports
# 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 udp -m multiport --dports 67,69,4011 -j ACCEPT
Line 62: Line 62:
sudo iptables -w -D nixos-fw -p tcp -m tcp --dport 64172 -j ACCEPT
sudo iptables -w -D nixos-fw -p tcp -m tcp --dport 64172 -j ACCEPT


</syntaxHighlight>
</syntaxhighlight>


=== Another example ===
=== Another example ===
{{file|netboot.nix|nix|
{{file|netboot.nix|nix|3={
<nowiki>
{
   name ? "netboot",
   name ? "netboot",
   arch ? "x86_64-linux",
   arch ? "x86_64-linux",
Line 116: Line 114:
           mutt
           mutt
           borgbackup
           borgbackup
           rxvt_unicode.terminfo
           rxvt-unicode
         ];
         ];
         # users.users.nixos.openssh.authorizedKeys.keys = [ … ];
         # users.users.nixos.openssh.authorizedKeys.keys = [ … ];
Line 129: Line 127:
     modules = [
     modules = [
       <nixpkgs/nixos/modules/installer/netboot/netboot-minimal.nix>
       <nixpkgs/nixos/modules/installer/netboot/netboot-minimal.nix>
      # Reduce build time by ~7x (~1 minute instead of many minutes) by not using the highest compression (image is 5% larger).
      ({ ... }: { netboot.squashfsCompression = "zstd -Xcompression-level 6"; })
       version-module
       version-module
       example-configuration
       example-configuration
Line 138: Line 138:
     { config, ... }:
     { config, ... }:
     {
     {
       system.stateVersion = config.system.nixos.version; # be quiet
       system.stateVersion = builtins.substring 0 (builtins.stringLength "XX.XX") config.system.nixos.version;
       system.nixos.tags = [ name ];
       system.nixos.tags = [ name ];
     };
     };
Line 207: Line 207:


in
in
if legacy then run-dnsmasq else run-pixiecore
if legacy then run-dnsmasq else run-pixiecore|name=netboot.nix|lang=nix}}


</nowiki>
Building:
}}
<syntaxhighlight lang="bash"># Build pixiecore runner
 
nix-build netboot.nix -o /tmp/run-pixiecore
Usage example:
<syntaxHighlight lang=bash>
# Build pixiecore runner
nix build -f netboot.nix -o /tmp/run-pixiecore


# Build dnsmasq + pxelinux runner
# Build dnsmasq + pxelinux runner
nix build -f netboot.nix --arg legacy true -o /tmp/run-dnsmasq
nix-build netboot.nix --arg legacy true -o /tmp/run-dnsmasq


# Build for some ancient system with a serial console
# Build for some ancient system with a serial console
nix build -f netboot.nix --arg name '"ancient-netboot"' -o /tmp/run-netboot \
nix-build netboot.nix --arg name '"ancient-netboot"' -o /tmp/run-netboot \
   --arg configuration 'import ./ancient-config.nix' \
   --arg configuration 'import ./ancient-config.nix' \
   --arg legacy true --arg proxynets '["10.2.1.0"]' \
   --arg legacy true --arg proxynets '["10.2.1.0"]' \
   --arg serialconsole true --arg serialport 3 --arg serialspeed 115200
   --arg serialconsole true --arg serialport 3 --arg serialspeed 115200</syntaxhighlight>Running:
 
* Run the example exactly like the other example further up on the page.
 
=== Troubleshooting ===


</syntaxHighlight>
* Error "'''autoexec.ipxe... Operation not supported'''": See [https://github.com/NixOS/nixpkgs/pull/378513#pullrequestreview-3081586117 this issue].


=== See also ===
=== See also ===
NixOS: [https://search.nixos.org/options?channel=23.11&from=0&size=30&sort=relevance&type=packages&query=services.pixiecore Pixiecore module].
NixOS: [https://search.nixos.org/options?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].