diff options
Diffstat (limited to 'configurations/eonwe/default.nix')
-rw-r--r-- | configurations/eonwe/default.nix | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/configurations/eonwe/default.nix b/configurations/eonwe/default.nix new file mode 100644 index 0000000..1904cdb --- /dev/null +++ b/configurations/eonwe/default.nix @@ -0,0 +1,312 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; +{ + imports = attrValues (modulesIn ./.); + + nixfiles.modules = { + ark.enable = true; + + wireguard.client.enable = true; + + syncthing.enable = true; + + openssh.server.enable = true; + + android.enable = true; + beets.enable = true; + bluetooth.enable = true; + games = { + lutris.enable = true; + minecraft.client.enable = true; + steam.enable = true; + steam-run.quirks.blackIsleStudios = true; + }; + libvirtd.enable = true; + incus.enable = true; + mpd.enable = true; + qutebrowser.enable = true; + }; + + hm = { + home.packages = with pkgs; [ + anki + gzdoom + iaito + kdenlive + krita + obs-studio + openmw + openttd + qbittorrent + qolibri + qzdl + radeontop + vcmi + vesktop + vial + wacomtablet + xonotic + ]; + + programs = { + beets.settings.directory = mkForce "/mnt/udata/music"; + + mpv = { + profiles = + let + mapShaders = shaders: map (args: toString (pkgs.fetchurl args)) shaders; + cfl-prediction = mapShaders [ + { + url = "https://raw.githubusercontent.com/Artoriuz/glsl-chroma-from-luma-prediction/471c65dd3915d39e7ef69957ab63e006125fbb88/CfL_Prediction.glsl"; + sha256 = "sha256-Mgb1KqF1EPPzR3SCVr9S4XzVmZkYEEFIHSp59RZ9wq8="; + } + ]; + ravu-lite-ar-r4 = mapShaders [ + { + url = "https://raw.githubusercontent.com/bjin/mpv-prescalers/b3f0a59d68f33b7162051ea5970a5169558f0ea2/compute/ravu-lite-ar-r4.hook"; + sha256 = "sha256-gyBAv/Sf75CobVUugeTOhy54B9z8iIoJSJgnLopfMsY="; + } + ]; + ssimdownscaler = mapShaders [ + { + url = "https://gist.githubusercontent.com/igv/36508af3ffc84410fe39761d6969be10/raw/575d13567bbe3caa778310bd3b2a4c516c445039/SSimDownscaler.glsl"; + sha256 = "sha256-AEq2wv/Nxo9g6Y5e4I9aIin0plTcMqBG43FuOxbnR1w="; + } + ]; + in + { + # TODO Profile conditionals on width are not working. + "qhd-downscale" = { + dscale = "lanczos"; + linear-downscaling = false; + glsl-shaders-append = ssimdownscaler; + }; + + "qhd-upscale" = { + glsl-shaders-append = cfl-prediction ++ ravu-lite-ar-r4; + }; + }; + + config = { + profile = "gpu-hq"; + vo = "gpu-next"; + gpu-api = "vulkan"; + hwdec = "auto"; + + deband = true; + deband-iterations = 4; + deband-threshold = 35; + deband-range = 16; + deband-grain = 5; + + temporal-dither = true; + dither-depth = "auto"; + dither = "fruit"; + + interpolation = true; + video-sync = "display-resample"; + tscale = "oversample"; + + target-prim = "auto"; + target-trc = "auto"; + vf = "format=colorlevels=full:colormatrix=auto"; + video-output-levels = "full"; + + glsl-shaders-append = map (text: toString (pkgs.writeText "shader.hook" text)) [ + '' + //!HOOK LUMA + //!BIND HOOKED + #define STRENGTH 48.0 + float mod289(float x) { return x - floor(x / 289.0) * 289.0; } + float permute(float x) { return mod289((34.0*x + 1.0) * x); } + float rand(float x) { return fract(x / 41.0); } + vec4 hook() { + vec3 _m = vec3(HOOKED_pos, 1.0) + vec3(1.0); + float h = permute(permute(permute(_m.x)+_m.y)+_m.z); + vec4 noise; + noise.x = rand(h); + return HOOKED_tex(HOOKED_pos) + vec4(STRENGTH/8192.0) * (noise - 0.5); + } + '' + '' + //!HOOK CHROMA + //!BIND HOOKED + #define STRENGTH 48.0 + float mod289(float x) { return x - floor(x / 289.0) * 289.0; } + float permute(float x) { return mod289((34.0*x + 1.0) * x); } + float rand(float x) { return fract(x / 41.0); } + vec4 hook() { + vec3 _m = vec3(HOOKED_pos, 0.5) + vec3(1.0); + float h = permute(permute(permute(_m.x)+_m.y)+_m.z); + vec4 noise; + noise.x = rand(h); h = permute(h); + noise.y = rand(h); + return HOOKED_tex(HOOKED_pos) + vec4(STRENGTH/8192.0) * (noise - 0.5); + } + '' + ]; + }; + }; + }; + + services = { + mpd.musicDirectory = mkForce "/mnt/udata/music"; + + xsettingsd.settings."Xft/DPI" = "93"; + }; + }; + + services = { + smartd = { + enable = true; + notifications.mail = { + enable = true; + sender = "admin+smartd@${my.domain.shire}"; + recipient = "admin+smartd@${my.domain.shire}"; + }; + }; + + openssh.settings = { + KbdInteractiveAuthentication = mkForce true; + PasswordAuthentication = mkForce true; + }; + + udev.packages = with pkgs; [ vial ]; + + xserver.wacom.enable = true; + }; + + # Usually stuff that is going to be compiled on this machine is going to have + # parallelisation support enabled, so we will make sure that all cores are + # utilised and limit the job queue to one. + nix.settings = { + max-jobs = 1; + cores = 32; + }; + + # Required[1] for using ZFS kernel modules with "unsupported" kernels. + # + # [1]: https://github.com/NixOS/nixpkgs/pull/121113#issuecomment-830003344 + # [1]: https://github.com/NixOS/nixpkgs/pull/230498#issuecomment-1551328615 + nixpkgs.config.allowBroken = true; + + boot = { + kernelPackages = pkgs.linuxPackages_xanmod_latest; + + kernelParams = [ + # Silence benign MCE errors: + # ``` + # mce: [Hardware Error]: CPU 1: Machine Check: 0 Bank 29: ffffffffffffffff + # mce: [Hardware Error]: TSC 0 MISC ff1fffffffffffff SYND ffffffffffffffff IPID ffffffffffffffff + # mce: [Hardware Error]: PROCESSOR 2:a60f12 TIME 1669988017 SOCKET 0 APIC 2 microcode a601201 + # ``` + "mce=nobootlog" + # This disables[1] User Mode Instruction Protection (UMIP)[2]. This is + # required for some games to run via Wine. + # + # [1]: https://docs.kernel.org/x86/cpuinfo.html + # [2]: https://en.wikichip.org/wiki/x86/umip + "clearcpuid=514" + ]; + + # https://wiki.archlinux.org/title/improving_performance#Watchdogs + blacklistedKernelModules = [ "sp5100_tco" ]; + + # The boot drive is Samsung SSD 980 PRO 2TB. + initrd.kernelModules = [ "nvme" ]; + + # These pools were configured manually with a specific mountpoint. + zfs.extraPools = [ + "udata" + "vdata" + ]; + }; + + # Filesystem creation: + # ``` + # mkfs.vfat -F 32 -l nixos-boot /dev/nvmeXnYpZ + # + # zpool create + # -o ashift=12 + # -o autotrim=on + # -O acltype=posixacl + # -O xattr=sa + # -O compression=zstd + # -O mountpoint=none + # nixos + # /dev/nvmeXnYpZ + # + # zfs create + # nixos/root + # + # zfs create + # -o encryption=aes-256-gcm + # -o keyformat=passphrase + # -o mountpoint=legacy + # nixos/root/ark + # + # zfs create + # -o mountpoint=legacy + # nixos/root/nix + # ``` + # + # physical structure (backside): + # [ 1 ] [ 2 ] [ 3 ] + # 1: disk/by-id/ata-WDC_WD20SPZX-22UA7T0_WD-WXP2E3163YW6 + # 2: disk/by-id/ata-WDC_WD20SPZX-22UA7T0_WD-WXN2E312R5HP + # 3: disk/by-id/ata-WDC_WD20SPZX-22UA7T0_WD-WXP2E311E6P2 + # + # physical structure (mobo M.2): + # [ 1 ] + # [ 2 ] + # 1: disk/by-id/nvme-Samsung_SSD_980_PRO_2TB_S69ENF0R872526A + # 2: disk/by-id/nvme-Samsung_SSD_980_PRO_2TB_S69ENX0T807723X + fileSystems = { + "/" = { + device = "none"; + fsType = "tmpfs"; + options = [ + "size=8G" + "mode=755" + ]; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/1363-02E6"; + fsType = "vfat"; + }; + + "/nix" = { + device = "nixos/root/nix"; + fsType = "zfs"; + options = [ "noatime" ]; + }; + + ${config.ark.path} = { + device = "nixos/root/ark"; + fsType = "zfs"; + neededForBoot = true; # Required by impermanence. + }; + + # Required[1] when using impermanence with agenix. Filesystem itself is + # defined as an `ark.directory` in `nixos/common/users.nix`. + # + # [1]: https://github.com/ryantm/agenix/issues/45#issuecomment-847852593 + # [1]: https://github.com/nix-community/impermanence/issues/22 + # [1]: https://github.com/NixOS/nixpkgs/pull/86967#pullrequestreview-667929259 + "/home/${my.username}" = { + depends = [ config.ark.path ]; + neededForBoot = true; + }; + }; + + # No swap space is declared here because the system already has 128Gb of RAM. + # I've only manage to hit around 100Gb mark when running large + # computations/compiling something big. Pretty sure that a hefty chunk of it + # was just cache and it wouldn't make me get to OOM situations. +} |