diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 3b1f6da..894d47b 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -11,7 +11,6 @@ ./roles/reset ./util/unfree_polyfill ./roles/iso - ./hosts/odo "${ builtins.fetchTarball { url = "https://github.com/nix-community/disko/archive/refs/tags/v1.9.0.tar.gz"; diff --git a/nix/configuration/flake.nix b/nix/configuration/flake.nix index 91b59fe..c0f25ee 100644 --- a/nix/configuration/flake.nix +++ b/nix/configuration/flake.nix @@ -81,7 +81,39 @@ }; systems = { odo = { - main = nixpkgs.lib.nixosSystem (base_x86_64_linux // { }); + main = nixpkgs.lib.nixosSystem ( + base_x86_64_linux + // { + modules = base_x86_64_linux.modules ++ [ + ./hosts/odo + ]; + } + ); + iso = nixpkgs.lib.nixosSystem ( + base_x86_64_linux + // { + modules = base_x86_64_linux.modules ++ [ + (nixpkgs + "/nixos/modules/installer/cd-dvd/iso-image.nix") + # TODO: Figure out how to do image based appliances + # (nixpkgs + "/nixos/modules/profiles/image-based-appliance.nix") + { + isoImage.makeEfiBootable = true; + isoImage.makeUsbBootable = true; + me.buildingIso = true; + } + ]; + } + ); + }; + neelix = { + main = nixpkgs.lib.nixosSystem ( + base_x86_64_linux + // { + modules = base_x86_64_linux.modules ++ [ + ./hosts/neelix + ]; + } + ); iso = nixpkgs.lib.nixosSystem ( base_x86_64_linux // { @@ -103,5 +135,7 @@ { nixosConfigurations.odo = systems.odo.main; iso.odo = systems.odo.iso.config.system.build.isoImage; + nixosConfigurations.neelix = systems.neelix.main; + iso.neelix = systems.neelix.iso.config.system.build.isoImage; }; } diff --git a/nix/configuration/hosts/neelix/default.nix b/nix/configuration/hosts/neelix/default.nix new file mode 100644 index 0000000..bdcd7dd --- /dev/null +++ b/nix/configuration/hosts/neelix/default.nix @@ -0,0 +1,30 @@ +{ config, pkgs, ... }: +{ + imports = [ + ./hardware-configuration.nix + ./disk-config.nix + ./optimized_build.nix + ./power_management.nix + ./screen_brightness.nix + ./wifi.nix + ]; + + # Generate with `head -c4 /dev/urandom | od -A none -t x4` + networking.hostId = "fbd233d8"; + + networking.hostName = "neelix"; # Define your hostname. + + time.timeZone = "America/New_York"; + i18n.defaultLocale = "en_US.UTF-8"; + + me.secureBoot.enable = false; + + # Early KMS + boot.initrd.kernelModules = [ "i915" ]; + + # Mount tmpfs at /tmp + boot.tmp.useTmpfs = true; + + me.graphical = true; + me.graphicsCardType = "intel"; +} diff --git a/nix/configuration/hosts/neelix/disk-config.nix b/nix/configuration/hosts/neelix/disk-config.nix new file mode 100644 index 0000000..f9204aa --- /dev/null +++ b/nix/configuration/hosts/neelix/disk-config.nix @@ -0,0 +1,140 @@ +# Manual Step: +# Check if drive supports 4kn: nvme id-ns -H /dev/nvme0n1 +# Format the drive to 4kn: nvme format --lbaf=1 /dev/nvme0n1 +{ + config, + lib, + pkgs, + ... +}: + +lib.mkIf (!config.me.buildingIso) { + disko.devices = { + disk = { + main = { + type = "disk"; + device = "/dev/nvme0n1"; + content = { + type = "gpt"; + partitions = { + ESP = { + size = "1G"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ + "umask=0077" + "noatime" + "discard" + ]; + }; + }; + zfs = { + size = "100%"; + content = { + type = "zfs"; + pool = "zroot"; + }; + }; + }; + }; + }; + }; + zpool = { + zroot = { + type = "zpool"; + # mode = "mirror"; + # Workaround: cannot import 'zroot': I/O error in disko tests + options.cachefile = "none"; + options = { + ashift = "12"; + compatibility = "openzfs-2.2-freebsd"; + autotrim = "on"; + }; + rootFsOptions = { + acltype = "posixacl"; + atime = "off"; + relatime = "off"; + xattr = "sa"; + mountpoint = "none"; + compression = "lz4"; + canmount = "off"; + utf8only = "on"; + dnodesize = "auto"; + normalization = "formD"; + }; + + datasets = { + "linux/nix" = { + type = "zfs_fs"; + options.mountpoint = "none"; + }; + "linux/nix/root" = { + type = "zfs_fs"; + options.mountpoint = "legacy"; + mountpoint = "/"; + postCreateHook = "zfs list -t snapshot -H -o name | grep -E '^zroot/linux/nix/root@blank$' || zfs snapshot zroot/linux/nix/root@blank"; + }; + "linux/nix/nix" = { + type = "zfs_fs"; + options.mountpoint = "legacy"; + mountpoint = "/nix"; + postCreateHook = "zfs list -t snapshot -H -o name | grep -E '^zroot/linux/nix/nix@blank$' || zfs snapshot zroot/linux/nix/nix@blank"; + options = { + recordsize = "1MiB"; + compression = "lz4"; + }; + }; + "linux/nix/home" = { + type = "zfs_fs"; + options.mountpoint = "legacy"; + mountpoint = "/home"; + postCreateHook = "zfs list -t snapshot -H -o name | grep -E '^zroot/linux/nix/home@blank$' || zfs snapshot zroot/linux/nix/home@blank"; + }; + "linux/nix/persist" = { + type = "zfs_fs"; + options.mountpoint = "legacy"; + mountpoint = "/persist"; + postCreateHook = "zfs list -t snapshot -H -o name | grep -E '^zroot/linux/nix/persist@blank$' || zfs snapshot zroot/linux/nix/persist@blank"; + }; + "linux/nix/state" = { + type = "zfs_fs"; + options.mountpoint = "legacy"; + mountpoint = "/state"; + postCreateHook = "zfs list -t snapshot -H -o name | grep -E '^zroot/linux/nix/state@blank$' || zfs snapshot zroot/linux/nix/state@blank"; + }; + }; + }; + }; + }; + + # Make sure all persistent volumes are marked as neededForBoot + # + # Also mounts /home so it is mounted before the user home directories are created. + fileSystems."/persist".neededForBoot = true; + fileSystems."/state".neededForBoot = true; + fileSystems."/home".neededForBoot = true; + + fileSystems."/".options = [ + "noatime" + "norelatime" + ]; + fileSystems."/nix".options = [ + "noatime" + "norelatime" + ]; + fileSystems."/persist".options = [ + "noatime" + "norelatime" + ]; + fileSystems."/state".options = [ + "noatime" + "norelatime" + ]; + fileSystems."/home".options = [ + "noatime" + "norelatime" + ]; +} diff --git a/nix/configuration/hosts/neelix/hardware-configuration.nix b/nix/configuration/hosts/neelix/hardware-configuration.nix new file mode 100644 index 0000000..b583e6a --- /dev/null +++ b/nix/configuration/hosts/neelix/hardware-configuration.nix @@ -0,0 +1,32 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + pkgs, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usbhid" "usb_storage" "sd_mod" "sdhci_pci" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp58s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/nix/configuration/hosts/neelix/optimized_build.nix b/nix/configuration/hosts/neelix/optimized_build.nix new file mode 100644 index 0000000..4f678a4 --- /dev/null +++ b/nix/configuration/hosts/neelix/optimized_build.nix @@ -0,0 +1,68 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + imports = [ ]; + + nix.settings.system-features = lib.mkForce [ + "gccarch-alderlake" + "gccarch-x86-64-v3" + "benchmark" + "big-parallel" + "kvm" + "nixos-test" + ]; + + # nixpkgs.hostPlatform = { + # gcc.arch = "alderlake"; + # gcc.tune = "alderlake"; + # system = "x86_64-linux"; + # }; + + nixpkgs.overlays = [ + ( + self: super: + let + optimizeWithFlags = + pkg: flags: + pkg.overrideAttrs (old: { + NIX_CFLAGS_COMPILE = [ (old.NIX_CFLAGS_COMPILE or "") ] ++ flags; + }); + addConfig = + additionalConfig: pkg: + pkg.override (oldconfig: { + structuredExtraConfig = pkg.structuredExtraConfig // additionalConfig; + }); + in + { + linux_alderlake = + addConfig + { + # Full preemption + PREEMPT = lib.mkOverride 60 lib.kernel.yes; + PREEMPT_VOLUNTARY = lib.mkOverride 60 lib.kernel.no; + + # Google's BBRv3 TCP congestion Control + TCP_CONG_BBR = lib.kernel.yes; + DEFAULT_BBR = lib.kernel.yes; + + # Preemptive Full Tickless Kernel at 300Hz + HZ = lib.kernel.freeform "300"; + HZ_300 = lib.kernel.yes; + HZ_1000 = lib.kernel.no; + } + ( + optimizeWithFlags super.linux_6_12 [ + "-march=alderlake" + "-mtune=alderlake" + ] + ); + } + ) + ]; + + boot.kernelPackages = lib.mkIf (!config.me.buildingIso) (pkgs.linuxPackagesFor pkgs.linux_alderlake); +} diff --git a/nix/configuration/hosts/neelix/power_management.nix b/nix/configuration/hosts/neelix/power_management.nix new file mode 100644 index 0000000..99bdbe2 --- /dev/null +++ b/nix/configuration/hosts/neelix/power_management.nix @@ -0,0 +1,46 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + imports = [ ]; + + environment.systemPackages = with pkgs; [ + powertop + ]; + + # pcie_aspm=force pcie_aspm.policy=powersupersave :: Enable PCIe active state power management for power reduction. + # nowatchdog :: Disable watchdog for power savings (related to disable_sp5100_watchdog above). + boot.kernelParams = [ + "pcie_aspm=force" + # "pcie_aspm.policy=powersupersave" + "nowatchdog" + ]; + + # systemd.tmpfiles.rules = [ + # "w- /sys/firmware/acpi/platform_profile - - - - low-power" + # "w- /sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy1/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy2/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy3/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy4/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy5/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy6/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy7/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy8/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy9/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy10/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy11/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy12/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy13/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy14/energy_performance_preference - - - - power" + # "w- /sys/devices/system/cpu/cpufreq/policy15/energy_performance_preference - - - - power" + # ]; + + boot.extraModprobeConfig = '' + options snd_hda_intel power_save=1 + ''; +} diff --git a/nix/configuration/hosts/neelix/screen_brightness.nix b/nix/configuration/hosts/neelix/screen_brightness.nix new file mode 100644 index 0000000..8314d0e --- /dev/null +++ b/nix/configuration/hosts/neelix/screen_brightness.nix @@ -0,0 +1,14 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + imports = [ ]; + + # systemd.tmpfiles.rules = [ + # "w- /sys/class/backlight/amdgpu_bl1/brightness - - - - 85" + # ]; +} diff --git a/nix/configuration/hosts/neelix/wifi.nix b/nix/configuration/hosts/neelix/wifi.nix new file mode 100644 index 0000000..a1c136d --- /dev/null +++ b/nix/configuration/hosts/neelix/wifi.nix @@ -0,0 +1,16 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + imports = [ ]; + + # config = { + # environment.loginShellInit = lib.mkIf (!config.me.buildingIso) '' + # doas iw dev wlan0 set power_save off + # ''; + # }; +} diff --git a/nix/configuration/hosts/odo/disk-config.nix b/nix/configuration/hosts/odo/disk-config.nix index 07048d4..dc31c68 100644 --- a/nix/configuration/hosts/odo/disk-config.nix +++ b/nix/configuration/hosts/odo/disk-config.nix @@ -1,3 +1,6 @@ +# Manual Step: +# Check if drive supports 4kn: nvme id-ns -H /dev/nvme0n1 +# Format the drive to 4kn: nvme format --lbaf=1 /dev/nvme0n1 { config, lib,