Nixos Config
Table of Contents
For now this is the way I'm configuring nixos. There is no flakes here, just a configuration.nix and a bunch of other stuff
1. Prefix
The nixos config is going to consist of a bunch of "imports" which are just a bunch of configs in the imports part of the main configuration. Then we can put each part of said config on its own source block This does require a bit of a prefix, that lets us access packages, existing configuration and library functions
{ config, lib, pkgs, ... }: let sources = import ./nix/sources.nix; nur = import sources.NUR { inherit pkgs; }; nurModules = import sources.NUR { }; in { imports = [ <<nixos-config>> ]; }
2. Configuration
2.1. Hardware
Normal nixos installation comes with a hardware-configuration file. we are not going to add the contents of that file here ourself, but instead add it as an external module. This is the only place where we'll do this
./hardware-configuration.nix
Also i want to have a full bluetooth experience
{ hardware.bluetooth = { enable = true; package = pkgs.bluez; }; }
2.2. personal stuff
First, some personal stuff, so that I can tel people my computer is mine
{ options.mainUser = with lib; mkOption { type = types.str; default = builtins.getEnv "USER"; }; }
and then the actual info:
{ mainUser = "erik"; networking.hostName = "RACEMONSTER"; time.timeZone = "Europe/Amsterdam"; }
2.3. Main user config
This sets up a (secret) default password for the main user and also sets some default groups
{ users.mutableUsers = false; # Define a user account. Don't forget to set a password with ‘passwd’. users.users.${config.mainUser} = { initialHashedPassword = "$6$XTH/sALyqg$G.bMWemErh4KGCAjUfT16DL96QMn/4NTmxlw6Z26wUVJn.tagQG.Fzmrz7uPkdiWZbBBFWP36.YA4hw9AcL8Q1"; isNormalUser = true; extraGroups = [ "video" "wheel" "NetworkManager" ]; # Enable ‘sudo’ for the user. # shell = pkgs.nushell; }; }
Furthermore, I want to have some prefabs available in my $PATH if I make them
{ environment.shellInit = '' if [ -h /etc/nixos/nix-prefabs/result ]; then export PATH=$PATH:/etc/nixos/nix-prefabs/result/bin fi ''; }
2.4. Init system
nixos is started with systemd-boot, since we don't run any other distros
{ boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; }
2.5. nixpkgs setup
not much info here right now. emacs itself now refers to emacsng
{ nix.package = pkgs.lix; programs.nix-ld = { enable = true; # use all the libraries that AppImage uses to load an image libraries = with pkgs; [fuse] ++ (with appimageTools.defaultFhsEnvArgs; multiPkgs pkgs ++ targetPkgs pkgs); }; nixpkgs.config.allowUnfree = true; nixpkgs.overlays = [ (final: prev: { emacs = (import sources.emacs-ng).outputs.packages."x86_64-linux".default; emacsWithPackages = final.emacs.pkgs.withPackages; inherit (nur.repos) instantos; }) ]; }
2.5.1. cachix
Cachix and other substitute servers allow you to not have to compile things as much as you are supposed to We will create a small module for cachix before we put in the rest declaratively
{ options.nix.cacheAttrs = with lib; mkOption { type = with types; attrsOf str; default = {}; }; config = with lib; { nix.settings.substituters = builtins.attrNames config.nix.cacheAttrs; nix.settings.trusted-public-keys = builtins.attrValues config.nix.cacheAttrs; }; }
With the config in hand, we can now quickly and easily declare our substitute servers
{ nix.cacheAttrs = { "https://crazazy.cachix.org" = "crazazy.cachix.org-1:3KaIHK26pkvd5palJH5A4Re1Hn2+GDV+aXYnftMYAm4="; "https://emacsng.cachix.org" = "emacsng.cachix.org-1:i7wOr4YpdRpWWtShI8bT6V7lOTnPeI7Ho6HaZegFWMI="; # "https://ethancedwards8.cachix.org" = "ethancedwards8.cachix.org-1:YMasjqyFnDreRQ9GXmnPIshT3tYyFHE2lUiNhbyIxOc="; "https://nix-community.cachix.org" = "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="; # "https://nrdxp.cachix.org" = "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4="; # "https://rycee.cachix.org" = "rycee.cachix.org-1:TiiXyeSk0iRlzlys4c7HiXLkP3idRf20oQ/roEUAh/A="; # "https://cache.iog.io" = "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ="; }; }
2.6. udev binds
I have a bindmount system so that I can easily make binds to persistent directories from my home directory This should prevent clutter
2.6.1. The config
This part is quite advanced. It makes entries for filesystems and then makes a systemd service to re-assign generated temporary directories to the owner of the home folder
{ options = with lib; { homeBinds = mkOption { type = with types; listOf str; default = [ ]; description = "Bind mounts in your home folder"; }; persistRoot = mkOption { type = types.str; default = "/nix/persist"; }; }; config = with lib; mkIf (config.homeBinds != [ ]) { fileSystems = genAttrs (map (loc: "/home/${config.mainUser}/${loc}") config.homeBinds) (loc: { device = "${config.persistRoot}${loc}"; fsType = "none"; options = [ "bind" ]; }); systemd.services.fix-home-perms = { wantedBy = [ "multi-user.target" ]; after = map (loc: "${builtins.replaceStrings ["/"] ["-"] loc}.mount") config.homeBinds; serviceConfig.Type = "oneshot"; script = "chown -R ${config.mainUser} /home/${config.mainUser}"; }; }; }
2.6.2. The binds
These are the binds themselves, they change frequently
{ homeBinds = [ ".config/keybase" ".local/share/keybase" ".ssh" "Desktop" "Documents/uni-docs" "Documents/IdeaProjects" "Documents/java-jars" "Documents/notes" "Music" "Videos" ]; }
2.7. Visual stuff (wayland)
After all, why shouldn't I try wayland? 😈
{ programs.wayfire.enable = true; programs.wayfire.plugins = with pkgs.wayfirePlugins; [ wcm wf-shell wayfire-plugins-extra ]; sound.enable = true; fonts.packages = with pkgs; [ noto-fonts noto-fonts-cjk noto-fonts-emoji liberation_ttf fira-code fira-code-symbols mplus-outline-fonts.githubRelease dina-font proggyfonts ]; environment.systemPackages = with pkgs; [ wofi waypipe ]; }
2.8. Networking
Some default network settings for my laptop
{ networking.networkmanager.enable = true; # Enables wireless support via NetworkManager }
2.9. packages
2.9.1. Core packages
These are the normal packages that I use for core maintenance. I use a special hardened version of firefox that takes in some addons as well Hardened firefox source
{ environment.systemPackages = let myFirefox = with pkgs; wrapFirefox librewolf-unwrapped { nixExtensions = builtins.filter lib.isDerivation (builtins.attrValues nur.repos.crazazy.firefox-addons); libName = "librewolf"; extraPolicies = { CaptivePortal = false; DisableFirefoxStudies = true; DisablePocket = true; DisableTelemetry = true; DisableFirefoxAccounts = true; DontCheckDefaultBrowser = true; FirefoxHome = { Pocket = false; Snippets = false; }; UserMessaging = { ExtensionRecommendations = false; SkipOnboarding = true; }; }; extraPrefs = '' // Show more ssl cert infos lockPref("security.identityblock.show_extended_validation", true); // Enable userchrome css lockPref("toolkit.legacyUserProfileCustomizations.stylesheets", true); // Enable light dev tools lockPref("devtools.theme","light"); // Misc other settings lockPref("extensions.autoDisableScopes", 0); lockPref("browser.uidensity", 1); lockPref("browser.search.openintab", true); lockPref("extensions.update.enabled", false); lockPref("identity.fxaccounts.enabled", false); lockPref("signon.rememberSignons", false); lockPref("signon.rememberSignons.visibilityToggle", false); lockPref("media.eme.enabled", true); lockPref("browser.eme.ui.enabled", true); lockPref("xpinstall.signatures.required",false); lockPref("browser.shell.checkDefaultBrowser", false ); ''; }; in with pkgs; [ bun # compcert curl # deno discord gitFull graalvm-ce libreoffice # krdc mpv # nur.repos.crazazy.seamonkey myFirefox unzip zip vim # vieb (wine.override { wineBuild = "wineWow"; }) ]; # persistent directory for my browser details homeBinds = [ # ".mozilla/firefox" ".config/discord" ".wine" ]; }
2.9.2. Researchware
I am doing a research project and I need certain software to make that happen
{ virtualisation.vswitch.enable = true; environment.systemPackages = with pkgs; [ mininet # not universal for all pythons but it works for now (python3.withPackages (p: [(p.mininet-python.overrideAttrs (_: { postInstall = "cp $py/bin/mn $py/lib/python3.10/site-packages/mininet/__main__.py"; }))])) opam bindfs ]; }
2.9.3. Steam
I like to play videogames sometimes, however steam also requires a little more special attention
{ imports = [ # nurModules.repos.crazazy.modules.private.steam-config ]; programs.steam.enable = true; homeBinds = [ ".local/share/Steam" ]; environment.systemPackages = with pkgs; [ steam ]; }
2.9.4. Emacs
Emacs needs to be integrated into the rest of the system. We are going to do that via a emacs daemon
{ services.emacs = { # package = import ./emacs.nix; package = pkgs.emacs29-pgtk; defaultEditor = true; enable = true; }; homeBinds = [ ".config/emacs" ]; }
2.9.5. QEMU & frens
I also sometimes run qemu vms. The qemu's manager will be libvirtd, but not sure if I will even use that
{ virtualisation.libvirtd.enable = true; }