diff --git a/flake.lock b/flake.lock index 2eefa02..f7f54fa 100644 --- a/flake.lock +++ b/flake.lock @@ -592,6 +592,20 @@ "type": "github" } }, + "nixos-hardware": { + "locked": { + "lastModified": 1705312285, + "narHash": "sha256-rd+dY+v61Y8w3u9bukO/hB55Xl4wXv4/yC8rCGVnK5U=", + "rev": "bee2202bec57e521e3bd8acd526884b9767d7fa0", + "revCount": 1526, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/NixOS/nixos-hardware/0.1.1526%2Brev-bee2202bec57e521e3bd8acd526884b9767d7fa0/018d0c89-6528-7027-9aae-490d904ad98f/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/NixOS/nixos-hardware/0.1.%2A.tar.gz" + } + }, "nixpkgs": { "locked": { "lastModified": 1681001314, @@ -718,6 +732,7 @@ "flake-schemas": "flake-schemas", "home-config": "home-config", "home-manager": "home-manager", + "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs_2", "stylix": "stylix" } diff --git a/flake.nix b/flake.nix index e4c3322..b61d8e6 100644 --- a/flake.nix +++ b/flake.nix @@ -21,8 +21,10 @@ inputs.flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.tar.gz"; + inputs.nixos-hardware.url = "https://flakehub.com/f/NixOS/nixos-hardware/0.1.*.tar.gz"; + # Flake outputs that other flakes can use - outputs = { flake-schemas, nixpkgs, stylix, home-manager, home-config, ... }: + outputs = { flake-schemas, nixpkgs, stylix, home-manager, home-config, nixos-hardware, ... }: let inherit (nixpkgs) lib; # Helpers for producing system-specific outputs @@ -55,10 +57,17 @@ # Pin nixpkgs nix.registry.nixpkgs.flake = nixpkgs; }; + + machines = [ "capricorn" "gemini" "vm" ]; + mkMachine = hostname: { + imports = [ nixosModule (import ./machine + "${hostname}" nixos-hardware) ]; + home-manager.sharedModules = [{ jhome.hostName = hostname; }]; + }; + machineModules = lib.genAttrs machines mkMachine; in { default = nixosModule; inherit nixosModule; - }; + } // machineModules; }; } diff --git a/machines/capricorn/default.nix b/machines/capricorn/default.nix new file mode 100644 index 0000000..4738b1d --- /dev/null +++ b/machines/capricorn/default.nix @@ -0,0 +1,41 @@ +{ nixos-hardware }: { + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + nixos-hardware.nixosModules.common-pc-laptop + nixos-hardware.nixosModules.common-pc-laptop-hdd + nixos-hardware.nixosModules.common-pc-laptop-ssd + nixos-hardware.nixosModules.common-cpu-intel + ]; + + # Setup extra filesystem options + fileSystems."/".options = [ "compress=zstd" ]; + fileSystems."/home".options = [ "compress=zstd" ]; + fileSystems."/nix".options = [ "compress=zstd" "noatime" ]; + + hardware.bluetooth.enable = true; + + # Bootloader + boot.loader.systemd-boot.enable = true; + boot.loader.systemd-boot.configurationLimit = 10; + boot.loader.efi.canTouchEfiVariables = true; + + # Network configuration + networking.hostName = "capricorn"; + networking.networkmanager.enable = true; + networking.networkmanager.wifi.backend = "iwd"; + networking.networkmanager.appendNameservers = [ "1.1.1.1" "1.0.0.1" "8.8.8.8" "8.4.4.8" ]; + + console.useXkbConfig = true; + + # Enable CUPS to print documents. + services.printing.enable = true; + + # 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 = "22.11"; # Did you read the comment? +} diff --git a/machines/capricorn/hardware-configuration.nix b/machines/capricorn/hardware-configuration.nix new file mode 100644 index 0000000..af4d03f --- /dev/null +++ b/machines/capricorn/hardware-configuration.nix @@ -0,0 +1,51 @@ +# 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, modulesPath, ... }: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-label/NIXROOT"; + fsType = "btrfs"; + options = [ "subvol=root" ]; + }; + + fileSystems."/nix" = { + device = "/dev/disk/by-label/NIXROOT"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + fileSystems."/home" = { + device = "/dev/disk/by-label/NIXHOME"; + fsType = "btrfs"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-label/NIXBOOT"; + fsType = "vfat"; + }; + + swapDevices = [ + { device = "/dev/disk/by-label/NIXSWAP"; } + ]; + + # 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.enp0s20f0u1c2.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp2s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/machines/gemini/default.nix b/machines/gemini/default.nix new file mode 100644 index 0000000..536251d --- /dev/null +++ b/machines/gemini/default.nix @@ -0,0 +1,71 @@ +# 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’). +{ nixos-hardware }: { pkgs, ... }: { + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + nixos-hardware.nixosModules.common-pc + nixos-hardware.nixosModules.common-pc-hdd + nixos-hardware.nixosModules.common-pc-ssd + nixos-hardware.nixosModules.common-cpu-amd + nixos-hardware.nixosModules.common-gpu-amd + ]; + + fileSystems."/".options = [ "compress=zstd" ]; + fileSystems."/steam".options = [ "compress=zstd" ]; + fileSystems."/home".options = [ "compress=zstd" ]; + fileSystems."/nix".options = [ "compress=zstd" "noatime" ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.systemd-boot.configurationLimit = 3; + boot.loader.efi.canTouchEfiVariables = true; + + # Enable bluetooth + hardware.bluetooth.enable = true; + + networking.hostName = "gemini"; + networking.networkmanager.enable = true; + networking.interfaces.enp4s0.wakeOnLan.enable = true; + + console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + useXkbConfig = true; # use xkbOptions in tty. + }; + + # Fix PoE switch going to sleep + systemd.services."ping-router" = { + enable = true; + description = "Continiuosly ping router to prevent PoE switch from going to sleep"; + script = '' + ${pkgs.iputils}/bin/ping \ + "$(${pkgs.iproute2}/bin/ip route list default | sed 's/.*via \(\S\+\) .*/\1/')" + ''; + wantedBy = [ "network-online.target" ]; + after = [ "network-online.target" ]; + serviceConfig = { + Type = "simple"; + }; + }; + + # Configure keymap in X11 + # services.xserver.xkbOptions = { + # "caps:swapescape" # map caps to escape. + # }; + services.openssh.enable = true; + services.openssh.startWhenNeeded = true; + services.openssh.settings.AllowUsers = [ "jalil" ]; + + # Enable CUPS to print documents. + services.printing.enable = true; + + # 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 = "22.11"; # Did you read the comment? +} diff --git a/machines/gemini/hardware-configuration.nix b/machines/gemini/hardware-configuration.nix new file mode 100644 index 0000000..400c870 --- /dev/null +++ b/machines/gemini/hardware-configuration.nix @@ -0,0 +1,58 @@ +# 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, modulesPath, ... }: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + # device = "/dev/disk/by-label/NIXOSROOT"; + device = "/dev/disk/by-label/NIXOSHOME"; + fsType = "btrfs"; + options = [ "subvol=root" ]; + }; + + fileSystems."/steam" = { + device = "/dev/disk/by-label/STEAM"; + fsType = "btrfs"; + }; + + fileSystems."/home" = { + device = "/dev/disk/by-label/NIXOSHOME"; + fsType = "btrfs"; + options = [ "subvol=home" ]; + }; + + fileSystems."/nix" = { + device = "/dev/disk/by-label/NIXOSROOT"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-label/BOOT"; + fsType = "vfat"; + }; + + swapDevices = [ + { + device = "/dev/disk/by-label/SWAP"; + } + ]; + + # 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.enp4s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/machines/vm/default.nix b/machines/vm/default.nix new file mode 100644 index 0000000..bef837e --- /dev/null +++ b/machines/vm/default.nix @@ -0,0 +1,31 @@ +{ ... }: { + services.qemuGuest.enable = true; + + boot.initrd.availableKernelModules = [ + "xhci_pci" + "ehci_pci" + "ahci" + "usbhid" + "usb_storage" + "sd_mod" + "virtio_balloon" + "virtio_blk" + "virtio_pci" + "virtio_ring" + # "virtio_vga" + "virtio_gpu" + ]; + fileSystems."/".device = "/dev/disk/by-label/nixos"; + + boot.loader.systemd-boot.enable = true; + + services.openssh.enable = true; + + # 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 = "22.11"; # Did you read the comment? +}