diff options
Diffstat (limited to 'nixos.org')
| -rw-r--r-- | nixos.org | 248 | 
1 files changed, 248 insertions, 0 deletions
| @@ -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 | 
