My NixOS configuration and deployment.
Go to file
2023-09-05 18:51:45 +02:00
assets refactor: folder structure 2023-09-02 15:12:08 +02:00
hosts refactor 2023-09-05 16:23:31 +02:00
modules use Home Manager config variable 2023-09-05 17:59:32 +02:00
nix refactor: folder structure 2023-09-02 15:12:08 +02:00
.gitignore add .gitignore 2023-08-16 14:23:51 +02:00
README.md update README 2023-09-05 18:51:45 +02:00

NixOS

For each host (server, laptop, etc.), there is a subdirectory inside hosts.

NixOS installation

For beginners, NixOS can be installed with a graphical installer.

Getting the ISO:

During installation, select manual partitioning:

  • One 512MB (or larger) Fat32 partition, mounted at /boot, "boot" flag enabled
  • Another partition (e.g. BTRFS) covering the rest of the drive, mounted at /, encryption enabled

Build and switch

Build new config, activate it and make it default:

sudo nixos-rebuild -I nixos-config=hosts/$(hostname)/configuration.nix switch

Or activate during next boot:

sudo nixos-rebuild -I nixos-config=hosts/$(hostname)/configuration.nix boot

System updates

sudo nix-channel --update
niv update

Then run nixos-rebuild switch, see above.

Garbage collection

For all profiles:

sudo nix-collect-garbage --delete-older-than 14d

Remove old generations from EFI:

sudo /run/current-system/bin/switch-to-configuration boot

Install Home Manager with niv

niv:

Easy dependency management for Nix projects.

Nix is a very powerful tool for building code and setting up environments. niv complements it by making it easy to describe and update remote dependencies (URLs, GitHub repos, etc). It is a simple, practical alternative to Nix flakes.

https://github.com/nmattia/niv

Niv is an easy dependency management for Nix projects with package pinning.

https://github.com/mikeroyal/NixOS-Guide

Home Manager:

[Home Manager] allows declarative configuration of user specific (non-global) packages and dotfiles.

To avoid breaking users' configurations, Home Manager is released in branches corresponding to NixOS releases ( e.g. release-23.05).

Home Manager provides both the channel-based setup and the flake-based one.

https://github.com/nix-community/home-manager

Check your channel:

sudo nix-channel --list
#=> nixos https://nixos.org/channels/nixos-23.05

Use the corresponding branch:

niv add nix-community/home-manager -n home-manager -b release-23.05

disko and nixos-anywhere

# TODO (!)

BTRFS Swap file

Summary:

  • Create subvolume @swap directly below top-level subvolume.
  • Mount at /swap
  • Create swapfile: sudo btrfs filesystem mkswapfile --size 8g --uuid clear /swap/swapfile
  • Regenerate hardware-configuration: sudo nixos-generate-config --dir $(hostname)
  • Add swapDevices = [ { device = "/swap/swapfile"; } ]; to hardware configuration and run nixos-rebuild switch (see above).

Automount encrypted drive

  • Generate and add keyfile to LUKS device
  • luksOpen and mount drive, e.g. to /mnt/data1
  • Re-generate hardware configuration:
sudo nixos-generate-config --dir hosts/$(hostname)

GNOME extensions

# TODO

Run an AppImage

# Note how your shell prefix changes.
nix-shell --packages appimage-run
# Inside the shell, you can run an AppImage:
appimage-run ~/Downloads/ubports-installer_0.10.0_linux_x86_64.AppImage

General Notes

  • There is controversy about flakes, rather use channels (e.g. with niv)
  • Prins, P., Suresh, J. and Dolstra, E., "Nix fixes dependency hell on all Linux distributions," Archived December 26, 2008, at the Wayback Machine linux.com, December 22, 2008

Nix Pills

It provides a tutorial introduction into the Nix package manager and Nixpkgs package collection, in the form of short chapters called 'pills'.

Papers

Papers about Nix:

Search for packages

Search for options

Search wich package owns a file

# Note how your shell prefix changes.
nix-shell --packages nix-index
# Inside the shell:

# Either build the index manually (requires >8GB RAM)
nix-index
# Or download weekly build:
mkdir -p ~/.cache/nix-index/ && wget -q -N https://github.com/nix-community/nix-index-database/releases/latest/download/index-x86_64-linux -O ~/.cache/nix-index/files

# Then search for a file
nix-locate -w '/bash'

List files of package

Example for nano:

find $(nix-build '<nixpkgs>' -A nano --no-link)

Excerpt of the result:

/nix/store/jqvxmx65mfinbsm6db9kmcqmphl44xhp-nano-7.2/share/nano
/nix/store/jqvxmx65mfinbsm6db9kmcqmphl44xhp-nano-7.2/share/nano/asm.nanorc
/nix/store/jqvxmx65mfinbsm6db9kmcqmphl44xhp-nano-7.2/share/nano/autoconf.nanorc

NixOS configuration debugging

Evaluating parts of the configuration.

First, start nix repl:

nix repl --file '<nixpkgs/nixos>' -I nixos-config=hosts/$(hostname)/configuration.nix

Example: config.home-manager

config.home-manager.
# Press `TAB`
#=> config.home-manager.backupFileExtension  config.home-manager.useUserPackages
#=> config.home-manager.extraSpecialArgs     config.home-manager.users
#=> config.home-manager.sharedModules        config.home-manager.verbose
#=> config.home-manager.useGlobalPkgs

Example: The home variable:

config.home-manager.users.yoda.home

Example: The value of one config option

# The following option is set to `"${config.xdg.dataHome}/.histfile";`
# where `config` is the Home Manager configuration.

config.home-manager.users.yoda.programs.zsh.history.path
#=> "/home/yoda/.local/share/.histfile"

Evaluate NixOS configuration to JSON

See also section "NixOS Configuration Debugging"!

TODO: https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-show-config.html

This evaluates configuration.nix (single module):

NIXPKGS_ALLOW_UNFREE=1 nix-instantiate --strict --json --eval -E '
import ./hosts/yodaTab/configuration.nix  {
  config = {};
  pkgs = import <nixpkgs> {};
  lib = import <nixpkgs/lib>;
}
' > evaluated-config.json

Then open evaluated-config.json.

References

Some references to websites that helped me create this repository:

TODOs