{ hostRegistry, config, pkgs, lib, ... }: { boot = { loader.raspberryPi = { enable = true; version = 4; }; kernelPackages = pkgs.linuxPackages_rpi4; kernelParams = [ "verbose" "shell_on_fail" "elevator=deadline" ]; initrd = { network = { enable = true; flushBeforeStage2 = false; }; supportedFilesystems = lib.mkForce [ "nfs" ]; # TODO: still needed? extraUtilsCommands = '' cp -v ${pkgs.klibc}/lib/klibc/bin.static/nfsmount $out/bin cp -v ${pkgs.glibc}/lib/libresolv.so.* $out/lib ''; # keyboard support for debugging availableKernelModules = [ "usb_storage" "usbhid" ]; }; tmpOnTmpfs = true; }; fileSystems."/" = { fsType = "tmpfs"; options = [ "mode=0755" ]; }; fileSystems."/etc" = { fsType = "tmpfs"; options = [ "mode=0755" ]; }; fileSystems."/var" = { fsType = "tmpfs"; options = [ "mode=0755" ]; }; fileSystems."/nix/store" = { device = "${hostRegistry.hosts.nix-build.ip4}:/nix/store"; fsType = "nfs"; options = [ "nfsvers=3" "proto=tcp" "nolock" "hard" "async" "ro" ]; neededForBoot = true; }; environment.systemPackages = with pkgs; [ libraspberrypi raspberrypi-eeprom ]; systemd = { # r/o /nix/store services.nix-daemon.enable = false; sockets.nix-daemon.enable = false; }; services.journald.extraConfig = '' Storage=volatile ''; system.build.tftproot = pkgs.runCommand "tftproot-${config.networking.hostName}" {} '' mkdir -p $out cp -rs ${pkgs.raspberrypifw}/share/raspberrypi/boot/* $out/ rm -f $out/kernel8.img $out/initrd.img ln -s ${config.system.build.kernel}/Image $out/kernel8.img ln -s ${config.system.build.initialRamdisk}/initrd $out/initrd.img cat << EOF > $out/config.txt kernel=kernel8.img initramfs initrd.img followkernel gpu_mem=64 arm_64bit=1 EOF echo "dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 verbose init=${config.system.build.toplevel}/init" > $out/cmdline.txt ''; }