111 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# 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 = rec {
 | 
						|
    # 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;
 | 
						|
 | 
						|
    # !!! Hack - attributes expected by other modules.
 | 
						|
    environment.systemPackages = [ pkgs.grub2_efi ]
 | 
						|
      ++ (if pkgs.stdenv.system == "aarch64-linux"
 | 
						|
          then []
 | 
						|
          else [ pkgs.grub2 pkgs.syslinux ]);
 | 
						|
    system.boot.loader.kernelFile = pkgs.stdenv.platform.kernelTarget;
 | 
						|
 | 
						|
    fileSystems."/" =
 | 
						|
      { fsType = "tmpfs";
 | 
						|
        options = [ "mode=0755" ];
 | 
						|
      };
 | 
						|
 | 
						|
    # In stage 1, mount a tmpfs on top of /nix/store (the squashfs
 | 
						|
    # image) to make this a live CD.
 | 
						|
    fileSystems."/nix/.ro-store" =
 | 
						|
      { fsType = "squashfs";
 | 
						|
        device = "../nix-store.squashfs";
 | 
						|
        options = [ "loop" ];
 | 
						|
        neededForBoot = true;
 | 
						|
      };
 | 
						|
 | 
						|
    fileSystems."/nix/.rw-store" =
 | 
						|
      { fsType = "tmpfs";
 | 
						|
        options = [ "mode=0755" ];
 | 
						|
        neededForBoot = true;
 | 
						|
      };
 | 
						|
 | 
						|
    fileSystems."/nix/store" =
 | 
						|
      { fsType = "unionfs-fuse";
 | 
						|
        device = "unionfs";
 | 
						|
        options = [ "allow_other" "cow" "nonempty" "chroot=/mnt-root" "max_files=32768" "hide_meta_files" "dirs=/nix/.rw-store=rw:/nix/.ro-store=ro" ];
 | 
						|
      };
 | 
						|
 | 
						|
    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
 | 
						|
      kernel ${pkgs.stdenv.platform.kernelTarget} init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}
 | 
						|
      initrd initrd
 | 
						|
      boot
 | 
						|
    '';
 | 
						|
 | 
						|
    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
 | 
						|
      '';
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
}
 |