diff options
Diffstat (limited to 'nixos.org')
-rw-r--r-- | nixos.org | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/nixos.org b/nixos.org index e69de29..ac4ad81 100644 --- a/nixos.org +++ b/nixos.org @@ -0,0 +1,248 @@ +#+TITLE:Nixos Config +#+AUTHOR: Crazazy + +This is the nixos config. Right now it is a bit of a hack because I don't have a [[https://github.com/rasendubi/dotfiles#patch-ob-tangle][ob-tangle patch]] but that can come +later + +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 +* 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 + #+begin_src nix :tangle configuration.nix + { config, lib, pkgs, ... }: + let + sources = import ./nix/sources.nix; + nur = import sources.nur { inherit pkgs; }; + nurModules = import sources.nur { }; + in + { + imports = [ + #+end_src +* Configuration +** 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 + #+begin_src nix :tangle configuration.nix + ./hardware-configuration.nix + #+end_src +** personal stuff + First, some personal stuff, so that I can tel people my computer is mine + #+begin_src nix :tangle configuration.nix + { + options.mainUser = with lib; mkOption { + type = types.str; + default = builtins.getEnv "USER"; + }; + } + #+end_src + + and then the actual info: + #+begin_src nix :tangle configuration.nix + { + mainUser = "erik"; + networking.hostName = "RACEMONSTER"; + time.timeZone = "Europe/Amsterdam"; + } + #+end_src +** Init system + nixos is started with systemd-boot, since we don't run any other distros + #+begin_src nix + { + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + } + #+end_src +** Networking + Some default network settings for my laptop + #+begin_src nix + { + networking.networkmanager.enable = true; # Enables wireless support via wpa_supplicant. + networking.useDHCP = false; + networking.interfaces.enp0s31f6.useDHCP = true; + networking.interfaces.wlp1s0.useDHCP = true; + } + #+end_src +** nixpkgs setup + not much info here right now. emacs itself now refers to emacsng + #+begin_src nix :tangle configuration.nix + { + nix.package = pkgs.nixFlakes; + nixpkgs.config.allowUnfree = true; + nixpkgs.overlays = [ + (final: prev: { + emacs = sources.emacs-ng.outputs.defaultPackage."x86_64-linux"; + }) + ]; + } + #+end_src +*** 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 + #+begin_src nix :tangle configuration.nix + { + options.nix.cacheAttrs = with lib; mkOption { + type = with types; attrsOf str; + default = {}; + + }; + config = with lib; { + nix.binaryCaches = builtins.attrNames config.nix.cacheAttrs; + nix.binaryCachePublicKeys = builtins.attrValues config.nix.cacheAttrs; + }; + } + #+end_src + With the config in hand, we can now quickly and easily declare our substitute servers + #+begin_src nix :tangle configuration.nix + { + 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="; + }; + } + #+end_src +** 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 +*** 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 + #+begin_src nix :tangle configuration.nix + { + 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}"; + }; + }; + } + #+end_src +*** The binds + These are the binds themselves, they change frequently + #+begin_src nix :tangle configuration.nix + { + homeBinds = [ + ".config/keybase" + ".local/share/Steam" + ".local/share/keybase" + ".mozilla/seamonkey" + ".ssh" + ".wine" + "Desktop" + "Documents" + "Music" + "Videos" + "workbench/browsing" + "workbench/EMACS" + ]; + } + #+end_src +** packages +*** Core packages + These are the normal packages that I use for core maintenance + #+begin_src nix :tangle configuration.nix + environment.systemPackages = with pkgs; [ + gitFull + curl + vim + nur.repos.crazazy.seamonkey + (wine.override { wineBuild = "wineWow"; }) + ]; + #+end_src +*** Steam + I like to play videogames sometimes, however steam also requires a little more special attention + #+begin_src nix :tangle configuration.nix + { + imports = [ + nurModules.repos.crazazy.private.steam-config + ]; + environment.systemPackages = with pkgs; [ + steam + ]; + } + #+end_src +*** Emacs + Emacs needs to be integrated into the rest of the system. We are going to do that via a emacs daemon + #+begin_src nix :tangle configuration.nix + { + services.emacs = { + package = import ./emacsconfig.nix; + enable = true; + }; + } + #+end_src +*** qemu & frens + I also sometimes run qemu vms. The qemu's +** Main user config + This sets up a (secret) default password for the main user and also sets some default groups + #+begin_src nix :tangle configuration.nix + { + 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; + } + #+end_src +** Visual stuff + I don't acutally literally live in the terminal. So we have to implement some xorg and other stuff +*** Basics + Enable printing, sound and a good keyboard, along with x11 itself + #+begin_src nix :tangle configuration.nix + { + # Enable CUPS to print documents. + services.printing.enable = true; + + # Enable sound. + sound.enable = true; + hardware.pulseaudio.enable = true; + + # Enable the X11 windowing system. + services.xserver.enable = true; + services.xserver.layout = "us"; + services.xserver.xkbVariant = "altgr-intl"; + services.xserver.xkbOptions = "eurosign:e"; + # touchpad controls + services.xserver.libinput.enable = true; + } + #+end_src +*** XFCE + I have decided to be lazy and not install a fancy window manager or whatever into the system. Thats headache + #+begin_src nix :tangle configration.nix + { + services.xserver.displayManager.lightdm.enable = true; + services.xserver.desktopManager.xfce.enable = true; + } + #+end_src +* Postfix + We need to remember to close our main module that we started off with + #+begin_src nix :tangle configuration.nix + ]; + } + #+end_src |