diff --git a/flake.nix b/flake.nix index 4c1d644..68e1ce3 100644 --- a/flake.nix +++ b/flake.nix @@ -35,6 +35,7 @@ ./nixos/machines/driftwood/machine.nix ./home-manager/machines/wsl/home.nix ./home-manager/machines/crash/home.nix + ./home-manager/machines/swarm/home.nix ./home-manager/machines/tides/home.nix ./home-manager/machines/driftwood/home.nix ./devshells/rust.nix diff --git a/nixos/machines/swarm/configuration.nix b/nixos/machines/swarm/configuration.nix new file mode 100644 index 0000000..28e1dd1 --- /dev/null +++ b/nixos/machines/swarm/configuration.nix @@ -0,0 +1,275 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). +{ + config, + pkgs, + ... +}: { + imports = [ + ]; + + # Setup nixbuild.net, since this laptop is somewhat under powered + # programs.ssh.extraConfig = '' + # Host eu.nixbuild.net + # PubkeyAcceptedKeyTypes ssh-ed25519 + # ServerAliveInterval 60 + # IPQoS throughput + # IdentityFile /home/nathan/.ssh/id_ed25519 + # ControlMaster auto + # ''; + # programs.ssh.knownHosts = { + # nixbuild = { + # hostNames = ["eu.nixbuild.net"]; + # publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPIQCZc54poJ8vqawd8TraNryQeJnvH1eLpIDgbiqymM"; + # }; + # }; + + # Configure nix + nix = { + settings = { + # Auto optimize the store after every action + auto-optimise-store = true; + trusted-users = [ + "root" + "nathan" + ]; + }; + # GC agressively + gc = { + automatic = true; + dates = "daily"; + options = "--delete-older-than 7d"; + }; + distributedBuilds = true; + buildMachines = [ + { + hostName = "eu.nixbuild.net"; + system = "x86_64-linux"; + maxJobs = 100; + supportedFeatures = [ + "benchmark" + "big-parallel" + ]; + } + ]; + }; + + # Bootloader and plymouth + boot = { + loader = { + systemd-boot = { + enable = true; + consoleMode = "auto"; + }; + efi.canTouchEfiVariables = true; + }; + plymouth = { + enable = true; + }; + }; + + # Steam setup + programs.steam = { + enable = true; + gamescopeSession = { + enable = true; + args = [ + "--expose-wayland" + ]; + }; + }; + + networking.hostName = "swarm"; # Define your hostname. + + services.tailscale.enable = true; + + networking.networkmanager.enable = true; + + # Set your time zone. + time.timeZone = "America/New_York"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + + # Enable the X11 windowing system. + # You can disable this if you're only using the Wayland session. + services.xserver.enable = true; + + # Enable the KDE Plasma Desktop Environment. + services.displayManager.sddm.enable = true; + services.desktopManager.plasma6.enable = true; + environment.sessionVariables.NIXOS_OZONE_WL = "1"; + # Setup bluetooth + hardware.bluetooth.enable = true; + + # Configure keymap in X11 + services.xserver.xkb = { + layout = "us"; + variant = ""; + }; + + # Enable CUPS to print documents. + services.printing.enable = true; + + # Enable sound with pipewire. + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + + # Enable touchpad support (enabled default in most desktopManager). + # services.xserver.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.nathan = { + extraGroups = ["networkmanager"]; + }; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + # Touch stuff + libinput + maliit-keyboard + dconf-editor + iptsd + surface-control + wl-clipboard + # Podman + podman-desktop + podman-compose + # System tools + gparted + f2fs-tools + ]; + + virtualisation.podman = {enable = true;}; + + # Enable sway + programs.sway = { + enable = true; + package = pkgs.swayfx; + }; + + # We need to use a fork of iptsd for the LiftTimeout option + # https://github.com/linux-surface/iptsd/issues/166#issuecomment-2391567615 + nixpkgs.overlays = let + iptsd_overlay = self: super: { + iptsd = super.iptsd.overrideAttrs (prev: { + src = pkgs.fetchFromGitHub { + owner = "wvffle"; + repo = "iptsd"; + rev = "9c3e4c7b85767a3239bb2ba1ee12430ba5c92a86"; + hash = "sha256-wyCstqTpyFDLRe/AGFrjJi9A+txwkFNbsW4KLNcMf1Q="; + }; + }); + }; + in [iptsd_overlay]; + # Setup iptsd for touch and stylus support + services.iptsd = { + enable = true; + config = { + Touchscreen = { + DisableOnPalm = true; + DisableOnStylus = true; + }; + Contacts = { + SizeMin = "0.775"; + SizeMax = "1.710"; + AspectMin = "1.005"; + AspectMax = "1.470"; + }; + Stylus = { + LiftTimeout = "0.07"; + }; + DFT = { + PositionMinAmp = "10"; + }; + }; + }; + + # Since this _is_ a tablet, waydroid time + virtualisation.waydroid.enable = true; + + # And thermald + services.thermald = { + enable = true; + }; + + # Other power saving goodies + hardware.enableAllFirmware = true; + services.tlp = { + enable = false; + settings = { + CPU_SCALING_GOVERNOR_ON_AC = "performance"; + CPU_SCALING_GOVERNOR_ON_BAT = "powersave"; + + CPU_ENERGY_PERF_POLICY_ON_BAT = "power"; + CPU_ENERGY_PERF_POLICY_ON_AC = "performance"; + }; + }; + powerManagement.enable = true; + services.power-profiles-daemon.enable = true; + services.cpupower-gui.enable = true; + + # Nvidia gpu setup + hardware.nvidia = { + open = true; + prime = { + intelBusId = "PCI:0:2:0"; + nvidiaBusId = "PCI:2:0:0"; + }; + }; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.firewall.enable = false; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + + system.stateVersion = "24.11"; # Did you read the comment? +} diff --git a/nixos/machines/swarm/hardware.nix b/nixos/machines/swarm/hardware.nix new file mode 100644 index 0000000..94fbd5d --- /dev/null +++ b/nixos/machines/swarm/hardware.nix @@ -0,0 +1,64 @@ +# 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" "usb_storage" "sd_mod"]; + boot.initrd.kernelModules = ["dm-snapshot" "cryptd"]; + boot.initrd.luks.devices."crypt".device = "/dev/disk/by-uuid/f16ca8aa-f596-4876-ba82-7427da9afaba"; + boot.kernelModules = ["kvm-intel"]; + boot.extraModulePackages = []; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/1e6c0a42-1a50-42a6-a1ce-972cfc63a1c3"; + fsType = "btrfs"; + options = ["subvol=root"]; + }; + + fileSystems."/home" = { + device = "/dev/disk/by-uuid/1e6c0a42-1a50-42a6-a1ce-972cfc63a1c3"; + fsType = "btrfs"; + options = ["subvol=home"]; + }; + + fileSystems."/nix" = { + device = "/dev/disk/by-uuid/1e6c0a42-1a50-42a6-a1ce-972cfc63a1c3"; + fsType = "btrfs"; + options = ["subvol=nix"]; + }; + + fileSystems."/var" = { + device = "/dev/disk/by-uuid/1e6c0a42-1a50-42a6-a1ce-972cfc63a1c3"; + fsType = "btrfs"; + options = ["subvol=var"]; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/5742-D107"; + fsType = "vfat"; + options = ["fmask=0022" "dmask=0022"]; + }; + + swapDevices = [ + {device = "/dev/disk/by-uuid/36cee131-a975-4a20-a0b8-c063af268bcb";} + ]; + + # 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.wlp0s20f3.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/nixos/machines/swarm/machine.nix b/nixos/machines/swarm/machine.nix new file mode 100644 index 0000000..c997e88 --- /dev/null +++ b/nixos/machines/swarm/machine.nix @@ -0,0 +1,59 @@ +{ + withSystem, + inputs, + ... +}: { + # perSystem = { ... }: { config.packages.hello = ...; }; + + flake.nixosConfigurations.swarm = withSystem "x86_64-linux" ( + ctx @ { + config, + inputs', + ... + }: + inputs.nixpkgs.lib.nixosSystem { + # Expose `packages`, `inputs` and `inputs'` as module arguments. + # Use specialArgs permits use in `imports`. + # Note: if you publish modules for reuse, do not rely on specialArgs, but + # on the flake scope instead. See also https://flake.parts/define-module-in-separate-file.html + specialArgs = { + packages = config.packages; + inherit inputs inputs'; + }; + modules = [ + ( + { + config, + lib, + pkgs, + ... + }: { + imports = [ + # Hardware support + inputs.nixos-hardware.nixosModules.microsoft-surface-common + inputs.nixos-hardware.nixosModules.common-pc + inputs.nixos-hardware.nixosModules.common-pc-laptop + inputs.nixos-hardware.nixosModules.common-pc-laptop-ssd + inputs.nixos-hardware.nixosModules.common-cpu-intel + inputs.nixos-hardware.nixosModules.common-gpu-nvidia + # Our modules + (import ../../modules/base.nix {inherit inputs;}) + (import ../../modules/desktop.nix) + (import ./configuration.nix) + (import ./hardware.nix) + (import ../../modules/user.nix { + inherit inputs; + mutableUsers = false; + }) + ]; + + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + } + ) + ]; + } + ); +}