# This module creates netboot media containing the given NixOS # configuration. { config, lib, pkgs, ... }: with lib; { options = { netboot.storeContents = mkOption { example = literalExample "[ pkgs.stdenv ]"; description = '' This option lists additional derivations to be included in the Nix store in the generated netboot image. ''; }; }; config = { boot.loader.grub.version = 2; # Don't build the GRUB menu builder script, since we don't need it # here and it causes a cyclic dependency. boot.loader.grub.enable = false; boot.initrd.postMountCommands = '' mkdir -p /mnt-root/nix/store mount -t squashfs /nix-store.squashfs /mnt-root/nix/store ''; # !!! Hack - attributes expected by other modules. system.boot.loader.kernelFile = "bzImage"; environment.systemPackages = [ pkgs.grub2 pkgs.grub2_efi pkgs.syslinux ]; boot.consoleLogLevel = mkDefault 7; fileSystems."/" = { fsType = "tmpfs"; options = [ "mode=0755" ]; }; boot.initrd.availableKernelModules = [ "squashfs" ]; boot.initrd.kernelModules = [ "loop" ]; # Closures to be copied to the Nix store, namely the init # script and the top-level system configuration directory. netboot.storeContents = [ config.system.build.toplevel ]; # Create the squashfs image that contains the Nix store. system.build.squashfsStore = import ../../../lib/make-squashfs.nix { inherit (pkgs) stdenv squashfsTools perl pathsFromGraph; storeContents = config.netboot.storeContents; }; # Create the initrd system.build.netbootRamdisk = pkgs.makeInitrd { inherit (config.boot.initrd) compressor; prepend = [ "${config.system.build.initialRamdisk}/initrd" ]; contents = [ { object = config.system.build.squashfsStore; symlink = "/nix-store.squashfs"; } ]; }; system.build.netbootIpxeScript = pkgs.writeTextDir "netboot.ipxe" "#!ipxe\nkernel bzImage init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}\ninitrd initrd\nboot"; boot.loader.timeout = 10; boot.postBootCommands = '' # After booting, register the contents of the Nix store # in the Nix database in the tmpfs. ${config.nix.package}/bin/nix-store --load-db < /nix/store/nix-path-registration # nixos-rebuild also requires a "system" profile and an # /etc/NIXOS tag. touch /etc/NIXOS ${config.nix.package}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system ''; }; }