# this file originates from ‘nixos-generate-config’ # but has been heavily modified { pkgs, ... }: { # enables non-free firmware hardware.enableRedistributableFirmware = true; # i changed this becuse linux 5.10 didn't have rpi-400 device tree blob. # nixos-22.05 linux 5.15 DOES have these now. # it should be possible to remove this if desired, but i'm not sure how the rpi-specific kernel differs. # see: https://github.com/raspberrypi/linux boot.kernelPackages = pkgs.linuxPackages_rpi4; # NixOS defaults to grub: we don't want that. boot.loader.grub.enable = false; # raspberryPi boot loader creates extlinux.conf. # otherwise, enable the generic-extlinux-compatible loader below. # note: THESE ARE MUTUALLY EXCLUSIVE. generic-extlinux-compatible causes uboot to not be built # boot.loader.generic-extlinux-compatible.enable = true; boot.loader.raspberryPi.enable = true; boot.loader.raspberryPi.uboot.enable = true; boot.loader.raspberryPi.version = 4; boot.initrd.availableKernelModules = [ "bcm2711_thermal" "bcm_phy_lib" "brcmfmac" "brcmutil" "broadcom" "clk_raspberrypi" "drm" # Direct Render Manager "enclosure" # SCSI ? "fuse" "mdio_bcm_unimac" "pcie_brcmstb" "raspberrypi_cpufreq" "raspberrypi_hwmon" "ses" # SCSI Enclosure Services "uas" # USB attached storage "uio" # userspace IO "uio_pdrv_genirq" "xhci_pci" "xhci_pci_renesas" ]; # boot.initrd.compressor = "gzip"; # defaults to zstd # hack in the `boot.shell_on_fail` arg since it doesn't seem to work otherwise boot.initrd.preFailCommands = "allowShell=1"; # default: 4 (warn). 7 is debug boot.consoleLogLevel = 7; # boot.kernelParams = [ # "boot.shell_on_fail" # # "boot.trace" # # "systemd.log_level=debug" # # "systemd.log_target=console" # ]; # ondemand power scaling keeps the cpu at low frequency when idle, and sets to max frequency # when load is detected. (v.s. the "performance" default, which always uses the max frequency) powerManagement.cpuFreqGovernor = "ondemand"; # XXX colin: this allows one to `systemctl halt` and then not remove power until the HDD has spun down. # however, it doesn't work with reboot because systemd will spin the drive up again to read its reboot bin. # a better solution would be to put the drive behind a powered USB hub (or get a SSD). # systemd.services.diskguard = { # description = "Safely power off spinning media"; # before = [ "shutdown.target" ]; # wantedBy = [ "sysinit.target" ]; # # old (creates dep loop, but works) # # before = [ "systemd-remount-fs.service" "shutdown.target" ]; # # wantedBy = [ "systemd-remount-fs.service" ]; # serviceConfig = { # Type = "oneshot"; # RemainAfterExit = true; # ExecStart = "${pkgs.coreutils}/bin/true"; # ExecStop = with pkgs; writeScript "diskguard" '' # #!${bash}/bin/bash # if ${procps}/bin/pgrep nixos-rebuild ; # then # exit 0 # don't halt drives unless we're actually shutting down. maybe better way to do this (check script args?) # fi # # ${coreutils}/bin/sync # # ${util-linux}/bin/mount -o remount,ro /nix/store # # ${util-linux}/bin/mount -o remount,ro / # # -S 1 retracts the spindle after 5 seconds of idle # # -B 1 spins down the drive after # ${hdparm}/sbin/hdparm -S 1 -B 1 /dev/sda # # TODO: monitor smartmonctl until disk is idle? or try hdparm -Y # # ${coreutils}/bin/sleep 20 # # exec ${util-linux}/bin/umount --all -t ext4,vfat,ext2 # ''; # }; # }; }