2023-08-15 19:13:43 +02:00
# NixOS
2023-09-02 15:17:42 +02:00
For each host (server, laptop, etc.), there is a subdirectory inside [hosts ](hosts ).
2023-08-15 21:04:44 +02:00
2023-09-05 17:54:40 +02:00
## NixOS installation
2023-09-02 15:17:42 +02:00
For beginners, NixOS can be installed with a graphical installer.
Getting the ISO:
2023-09-01 17:59:01 +02:00
* There is no official torrent as they are not needed due to CDN.
* ISO and checksum are available here: https://nixos.org/download#nixos-iso
* There are unofficial torrents. If the checksum is compared with the one from the official website, these can be used as well: https://github.com/AnimMouse/NixOS-ISO-Torrents/releases
2023-09-02 15:17:42 +02:00
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
2023-09-06 13:03:25 +02:00
## Update, build and switch
2023-08-15 20:55:27 +02:00
2023-09-06 13:03:25 +02:00
### Update
* Updating NixOS. https://superuser.com/a/1604695
2023-08-16 17:35:19 +02:00
2023-09-06 13:03:25 +02:00
Update channel and configuration:
2023-08-15 19:13:43 +02:00
```shell
2023-09-06 13:03:25 +02:00
sudo nix-channel --update & & niv update
2023-08-15 19:13:43 +02:00
```
2023-08-15 20:55:27 +02:00
2023-09-06 13:03:25 +02:00
To apply the updates, continue with "Build and switch".
### Build and switch
* https://nixos.wiki/wiki/Nixos-rebuild
* https://discourse.nixos.org/t/how-to-get-this-pending-updates-notification-in-gnome/16344/3
* https://discourse.nixos.org/t/how-to-get-this-pending-updates-notification-in-gnome/16344/6
2023-09-11 16:09:44 +02:00
#### Option I: Build new config and activate it:
```shell
sudo nixos-rebuild -I nixos-config=hosts/$(hostname)/configuration.nix switch
```
2023-09-15 10:42:28 +02:00
To view changes, see section "Compare two versions of NixOS system profile".
2023-09-11 16:09:44 +02:00
#### Option II: Build new config and activate it during next boot:
```shell
sudo nixos-rebuild -I nixos-config=hosts/$(hostname)/configuration.nix boot
```
#### Option III: Build config and view changes:
2023-09-05 18:51:45 +02:00
```shell
2023-09-06 13:03:25 +02:00
# This leaves a symlink named `result` in the current directory.
sudo nixos-rebuild -I nixos-config=hosts/$(hostname)/configuration.nix build
nix --extra-experimental-features nix-command store diff-closures /run/current-system ./result
2023-09-06 14:59:09 +02:00
#=> ...
#=> linux: 6.1.47, 6.1.47-modules → 6.1.51, 6.1.51-modules, -11.8 KiB
2023-09-05 18:51:45 +02:00
```
2023-09-06 13:03:25 +02:00
Depending on if there are large kernel changes, either switch to it directly or wait until next boot:
2023-08-22 14:25:18 +02:00
```shell
2023-09-11 16:09:44 +02:00
# TODO: This is not persistent (after reboot).
2023-09-06 13:03:25 +02:00
sudo ./result/bin/switch-to-configuration switch
# or
2023-09-06 14:59:09 +02:00
# TODO: This does not work. There is no new boot menu entry :/
2023-09-06 13:03:25 +02:00
sudo ./result/bin/switch-to-configuration boot
2023-08-22 14:25:18 +02:00
```
2023-09-06 14:41:21 +02:00
### Failed services
If there are e.g. file conflicts due to preexisting dotfiles, the Home Manager user service might fail. To list all failed services, run:
```shell
systemctl --failed
```
2023-09-05 17:54:40 +02:00
## Garbage collection
2023-08-24 14:00:59 +02:00
* https://nixos.org/manual/nix/stable/package-management/garbage-collection.html
2023-08-28 12:53:00 +02:00
* https://discourse.nixos.org/t/why-doesnt-nix-collect-garbage-remove-old-generations-from-efi-menu/17592/4
For all profiles:
```shell
sudo nix-collect-garbage --delete-older-than 14d
```
Remove old generations from EFI:
2023-08-24 14:00:59 +02:00
```shell
2023-08-28 12:53:00 +02:00
sudo /run/current-system/bin/switch-to-configuration boot
2023-08-24 14:00:59 +02:00
```
2023-09-14 13:01:21 +02:00
## Dependency management with niv
2023-08-15 20:55:27 +02:00
2023-09-14 13:10:27 +02:00
* https://nix.dev/tutorials/first-steps/towards-reproducibility-pinning-nixpkgs#dependency-management-with-niv
2023-08-21 16:30:34 +02:00
niv:
2023-08-17 10:52:06 +02:00
> 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
2023-08-21 16:30:34 +02:00
> describe and update remote dependencies (URLs, GitHub repos, etc). It is a simple, practical alternative to Nix
> flakes.
2023-08-17 10:52:06 +02:00
>
> https://github.com/nmattia/niv
2023-08-21 16:30:34 +02:00
> Niv is an easy dependency management for Nix projects with package pinning.
>
> https://github.com/mikeroyal/NixOS-Guide
2023-09-14 13:01:21 +02:00
Initialize:
```shell
niv init
```
Change the tracking branch of nixpkgs from unstable to 23.05:
```shell
niv modify nixpkgs --branch nixos-23.05
```
2023-09-14 13:10:27 +02:00
Pinning Nixpkgs. At the top of your `configuration.nix` file, replace
```nix
{ config, pkgs, ... }:
{}
```
with
```nix
{ config, sources ? import ../../nix/sources.nix, pkgs ? import sources.nixpkgs {}, ... }:
{}
```
2023-09-15 21:57:33 +02:00
TODO: This does not yet work.
2023-09-14 13:01:21 +02:00
## Add Home Manager with niv
2023-08-21 16:30:34 +02:00
Home Manager:
> [Home Manager] allows declarative configuration of user specific (non-global) packages and dotfiles.
2023-08-17 10:52:06 +02:00
>
2023-08-16 18:28:19 +02:00
> To avoid breaking users' configurations, Home Manager is released in branches corresponding to NixOS releases (
> e.g. `release-23.05`).
2023-08-17 10:52:06 +02:00
>
2023-08-15 20:55:27 +02:00
> Home Manager provides both the channel-based setup and the flake-based one.
2023-08-17 10:52:06 +02:00
>
> https://github.com/nix-community/home-manager
2023-08-15 20:55:27 +02:00
Check your channel:
```shell
sudo nix-channel --list
#=> nixos https://nixos.org/channels/nixos-23.05
```
Use the corresponding branch:
```shell
2023-09-02 15:12:08 +02:00
niv add nix-community/home-manager -n home-manager -b release-23.05
2023-08-15 20:55:27 +02:00
```
2023-09-12 12:43:51 +02:00
## Add NUR with niv
> The Nix User Repository (NUR) is community-driven meta repository for Nix packages.
>
> ... packages are built from source and are not reviewed by any Nixpkgs member.
>
> https://github.com/nix-community/NUR
```shell
niv add nix-community/NUR -n NUR
```
2023-08-16 17:35:19 +02:00
## disko and nixos-anywhere
2023-08-21 16:30:34 +02:00
* Introductory presentation: https://pad.lassul.us/cccamp-workshop
2023-08-16 17:35:19 +02:00
* disko: https://github.com/nix-community/disko
* nixos-anywhere: https://github.com/numtide/nixos-anywhere/
2023-08-18 19:57:09 +02:00
```shell
# TODO (!)
```
2023-09-17 16:59:42 +02:00
## Deployment and secrets
2023-09-18 15:30:47 +02:00
* https://github.com/zhaofengli/colmena#colmena
> Colmena is a simple, stateless NixOS deployment tool modeled after NixOps and morph, written in Rust.
Alternative: Deployment with Morph: https://xeiaso.net/blog/morph-setup-2021-04-25
2023-09-17 16:59:42 +02:00
Configuration is done inside [hive.nix ](hive.nix ).
Build config:
```shell
colmena build
```
Apply to all non-local nodes:
```shell
colmena apply switch
#colmena apply boot
```
Apply to local node:
```shell
colmena apply-local --sudo switch
#colmena apply-local --sudo boot
```
Filtering:
- You can filter hosts by tags with `--on @tag-a,@tag-b` .
- You can use globs in tag matching as well: `colmena apply --on '@infra-*'`
2023-08-28 15:50:16 +02:00
## BTRFS Swap file
* https://nixos.wiki/wiki/Btrfs#Swap_file
* https://wiki.archlinux.org/title/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`
2023-09-07 18:54:46 +02:00
* Regenerate hardware-configuration: `sudo nixos-generate-config --dir hosts/$(hostname)`
2023-08-28 15:50:16 +02:00
* Add `swapDevices = [ { device = "/swap/swapfile"; } ];` to hardware configuration and run `nixos-rebuild switch` (see above).
2023-09-05 17:54:40 +02:00
## Automount encrypted drive
2023-08-18 19:57:09 +02:00
* Generate and add keyfile to LUKS device
* luksOpen and mount drive, e.g. to `/mnt/data1`
* Re-generate hardware configuration:
```shell
2023-09-05 14:40:08 +02:00
sudo nixos-generate-config --dir hosts/$(hostname)
2023-08-18 19:57:09 +02:00
```
2023-08-16 17:35:19 +02:00
2023-08-18 20:31:09 +02:00
## GNOME extensions
* https://github.com/nix-community/home-manager/issues/284#issuecomment-531384656
* https://github.com/nix-community/home-manager/issues/284#issuecomment-1321199263
2023-08-21 16:30:34 +02:00
* Search for packaged
extensions: https://search.nixos.org/packages?channel=23.05& from=0& size=50& sort=relevance& type=packages& query=gnomeExtensions
* One has to re-login after
changes: https://github.com/nix-community/home-manager/issues/284#issuecomment-1328269433
2023-08-18 20:31:09 +02:00
```shell
# TODO
```
2023-08-22 19:03:39 +02:00
## Run an AppImage
* https://nixos.wiki/wiki/Appimage
```shell
# Note how your shell prefix changes.
nix-shell --packages appimage-run
2023-08-24 13:17:43 +02:00
```
```shell
2023-08-22 19:03:39 +02:00
# Inside the shell, you can run an AppImage:
appimage-run ~/Downloads/ubports-installer_0.10.0_linux_x86_64.AppImage
```
2023-09-06 19:29:19 +02:00
## System information
```shell
nix-info -m
```
```
- system: `"x86_64-linux"`
- host os: `Linux 6.1.51, NixOS, 23.05 (Stoat), 23.05.3242.da5adce0ffaf`
- multi-user?: `yes`
- sandbox: `yes`
- version: `nix-env (Nix) 2.13.5`
- channels(root): `"nixos-23.05"`
- nixpkgs: `/nix/var/nix/profiles/per-user/root/channels/nixos`
```
2023-08-16 17:35:19 +02:00
## General Notes
2023-08-22 14:30:39 +02:00
* There is controversy about flakes, rather use channels (e.g. with niv)
2023-08-29 12:22:31 +02:00
* Prins, P., Suresh, J. and Dolstra, E., "Nix fixes dependency hell on all Linux distributions," [Archived ](https://web.archive.org/web/20081226010942/http://www.linux.com/feature/155922 ) December 26, 2008, at the Wayback Machine linux.com, December 22, 2008
2023-08-22 14:30:39 +02:00
2023-08-16 18:28:19 +02:00
### Nix Pills
* https://nixos.org/guides/nix-pills/pr01
It provides a tutorial introduction into the Nix package manager and Nixpkgs package collection, in the form of short
chapters called 'pills'.
2023-08-29 12:22:31 +02:00
### Papers
2023-08-16 17:35:19 +02:00
2023-08-29 12:22:31 +02:00
Papers about Nix:
* The Purely Functional Software Deployment Model (2006). http://nixos.org/~eelco/pubs/phd-thesis.pdf, https://edolstra.github.io/pubs/phd-thesis.pdf, https://github.com/edolstra/edolstra.github.io/blob/master/pubs/phd-thesis.pdf
* May 2023: Some insights from the thesis in short form. https://jonathanlorimer.dev/posts/nix-thesis.html
* NixOS: A Purely Functional Linux Distribution (2008): https://github.com/edolstra/edolstra.github.io/blob/master/pubs/nixos-icfp2008-final.pdf, https://github.com/edolstra/edolstra.github.io/blob/master/pubs/nixos-jfp-final.pdf
* Nix: A Safe and Policy-Free System for Software Deployment (2004): https://edolstra.github.io/pubs/nspfssd-lisa2004-final.pdf
2023-08-16 17:35:19 +02:00
### Search for packages
* https://search.nixos.org/packages?channel=23.05
2023-08-18 19:45:49 +02:00
### Search for options
* https://search.nixos.org/options?channel=23.05
2023-08-21 16:30:34 +02:00
* Or `man configuration.nix`
2023-08-18 19:45:49 +02:00
* https://mipmip.github.io/home-manager-option-search
2023-08-21 16:30:34 +02:00
* Or `man home-configuration.nix`
2023-08-18 19:45:49 +02:00
2023-08-24 13:17:43 +02:00
### Search wich package owns a file
```shell
# Note how your shell prefix changes.
nix-shell --packages nix-index
```
```shell
2023-09-07 12:37:30 +02:00
# Either build the index manually (requires >12GB RAM):
2023-08-24 13:17:43 +02:00
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'
```
2023-09-05 16:18:11 +02:00
### List files of package
* https://discourse.nixos.org/t/list-files-of-package/25830/2?u=langfingaz
Example for `nano` :
```shell
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
```
2023-08-24 13:17:43 +02:00
2023-09-06 13:03:25 +02:00
### Compare two versions of NixOS system profile
2023-09-15 10:42:28 +02:00
Get latest system profile. This is the profile (usually) being active after booting the system:
```shell
ls -1 /nix/var/nix/profiles/ | sort -t'-' -n -k2 | tail -n 1
#=> 120
```
Compare current with previous profile:
```shell
# https://stackoverflow.com/a/36641298
prev="$(ls -1 /nix/var/nix/profiles/ | sort -t'-' -n -k2 | tail -n 2 | head -n 1)"
curr="$(ls -1 /nix/var/nix/profiles/ | sort -t'-' -n -k2 | tail -n 1)"
nix --extra-experimental-features nix-command store diff-closures /nix/var/nix/profiles/"${prev}" /nix/var/nix/profiles/"${curr}"
```
Compare two arbitrary system profiles:
2023-09-06 13:03:25 +02:00
```shell
nix --extra-experimental-features nix-command store diff-closures /nix/var/nix/profiles/system-110-link /nix/var/nix/profiles/system-116-link
```
```
cpupower: 6.1.47 → 6.1.51
element-desktop: 1.11.38 → 1.11.40, +2218.9 KiB
element-web: 1.11.38 → 1.11.40, -73.1 KiB
exempi: 2.6.3 → 2.6.4
firefox: 116.0.3 → 117.0
firefox-unwrapped: 116.0.3 → 117.0, -292.6 KiB
gnome-shell-extension-openweather: ∅ → 121, +590.5 KiB
hm_fontconfigconf.d10hmfonts.conf: ∅ → ε
initrd: ∅ → ε
initrd-linux: 6.1.47 → 6.1.51
libcap: 2.68 → 2.69
linux: 6.1.47, 6.1.47-modules → 6.1.51, 6.1.51-modules, -11.8 KiB
meld: ∅ → 3.22.0, +3858.5 KiB
net-snmp: 5.9.3 → 5.9.4
nixos-system-yodaTab: 23.05.3085.2ab91c8d65c0 → 23.05.3242.da5adce0ffaf
openjdk: +19.5 KiB
python3.10-pygobject: +27.0 KiB
stage: ∅ → 1-init.sh, +29.5 KiB
tor-browser-bundle-bin: 12.5.2 → 12.5.3, +18.1 KiB
user: +2885.0 KiB
```
2023-09-05 17:54:40 +02:00
### NixOS configuration debugging
* https://nixos.wiki/wiki/Nix_command/repl
Evaluating parts of the configuration.
First, start `nix repl` :
```shell
nix repl --file '< nixpkgs / nixos > ' -I nixos-config=hosts/$(hostname)/configuration.nix
```
Example: `config.home-manager`
```shell
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:
```shell
config.home-manager.users.yoda.home
```
Example: The value of one config option
```shell
# 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
* https://discourse.nixos.org/t/can-i-run-nix-instantiate-eval-strict-on-my-configuration-nix/7105/4
This evaluates `configuration.nix` (single module):
```shell
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 ](evaluated-config.json ).
2023-08-18 19:57:09 +02:00
### References
2023-08-16 17:35:19 +02:00
2023-08-18 19:57:09 +02:00
Some references to websites that helped me create this repository:
2023-08-18 19:18:47 +02:00
2023-08-18 19:57:09 +02:00
* https://github.com/Misterio77/nix-starter-configs
2023-08-21 16:30:34 +02:00
* https://github.com/mikeroyal/NixOS-Guide#getting-started
2023-08-18 19:18:47 +02:00
2023-08-18 20:32:06 +02:00
## TODOs
2023-08-18 19:18:47 +02:00
2023-08-30 16:17:29 +02:00
* Yubikey FDE: https://github.com/georgewhewell/nixos-host/blob/master/profiles/luks-yubi.nix
2023-09-11 18:16:05 +02:00
* Impermanence, opt-in to persistence:
https://github.com/Misterio77/nix-starter-configs/tree/main#try-opt-in-persistance
2023-08-22 19:12:20 +02:00
* nix-shell / lorri
* https://ghedam.at/15978/an-introduction-to-nix-shell
* docker-compose.yml for services and nix-shell to run the code