2022-05-17 05:47:43 +00:00
|
|
|
|
# this file originates from ‘nixos-generate-config’
|
|
|
|
|
# but has been heavily modified
|
2022-04-27 06:38:39 +00:00
|
|
|
|
{ config, lib, pkgs, modulesPath, ... }:
|
|
|
|
|
|
|
|
|
|
{
|
2022-05-17 21:19:54 +00:00
|
|
|
|
# enables non-free firmware
|
2022-05-17 06:43:24 +00:00
|
|
|
|
hardware.enableRedistributableFirmware = true;
|
2022-04-27 06:38:39 +00:00
|
|
|
|
|
2022-05-17 05:47:43 +00:00
|
|
|
|
# XXX colin: these four statements were autogenerated and placed here: why?
|
|
|
|
|
# boot.initrd.availableKernelModules = [ "xhci_pci" "usbhid" "usb_storage" ];
|
|
|
|
|
# boot.initrd.kernelModules = [ ];
|
|
|
|
|
# boot.kernelModules = [ ];
|
|
|
|
|
# boot.extraModulePackages = [ ];
|
2022-04-27 06:38:39 +00:00
|
|
|
|
|
2022-05-17 21:19:54 +00:00
|
|
|
|
# default nixos-21.11 kernel of 5.10 doesn't have the rpi-400 device tree blob.
|
|
|
|
|
# turns out 5.15, 5.16, 5.17 are all unable to boot the pi from usb (they fail to "direct load" certain broadcom firmware).
|
|
|
|
|
# linuxPackages_rpi4 uses 5.10, but supplies the pi-400 dtb & boots fine.
|
|
|
|
|
# boot.kernelPackages = pkgs.linuxPackages_latest;
|
|
|
|
|
# boot.kernelPackages = pkgs.linuxPackages_5_15;
|
|
|
|
|
# boot.kernelPackages = pkgs.linuxPackages_5_16;
|
|
|
|
|
boot.kernelPackages = pkgs.linuxPackages_rpi4;
|
|
|
|
|
|
2022-05-17 05:47:43 +00:00
|
|
|
|
# NixOS defaults to grub: we don't want that.
|
|
|
|
|
boot.loader.grub.enable = false;
|
2022-05-17 09:10:26 +00:00
|
|
|
|
# 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;
|
2022-05-17 05:47:43 +00:00
|
|
|
|
boot.loader.raspberryPiColin.enable = true;
|
|
|
|
|
boot.loader.raspberryPiColin.uboot.enable = true;
|
|
|
|
|
boot.loader.raspberryPiColin.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"
|
|
|
|
|
];
|
2022-05-17 21:19:54 +00:00
|
|
|
|
# boot.initrd.compressor = "gzip"; # defaults to zstd
|
2022-05-17 05:47:43 +00:00
|
|
|
|
# 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
|
2022-05-17 21:19:54 +00:00
|
|
|
|
boot.consoleLogLevel = 7;
|
2022-05-17 05:47:43 +00:00
|
|
|
|
# boot.kernelParams = [
|
|
|
|
|
# "boot.shell_on_fail"
|
|
|
|
|
# # "boot.trace"
|
|
|
|
|
# # "systemd.log_level=debug"
|
|
|
|
|
# # "systemd.log_target=console"
|
|
|
|
|
# ];
|
2022-04-27 06:38:39 +00:00
|
|
|
|
|
2022-05-17 21:19:54 +00:00
|
|
|
|
# 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";
|
2022-05-18 10:40:28 +00:00
|
|
|
|
|
|
|
|
|
# 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 <vendor specific duration>
|
|
|
|
|
${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
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
2022-04-27 06:38:39 +00:00
|
|
|
|
}
|