up:: operating-system jump:: down::
NixOS is based on Nix, a purely functional package management system. Nix stores all packages in isolation from each other under paths such as /nix/store
. This let’s the system reuse the same packages across configurations, dependencies, etc.
Default config: /etc/nixos/configuration.nix
Add packages to environment/systemPackages
After editing,
sudo nixos-rebuild switch
to load the latest version and add an entry to the grub bootloader
sudo nixos-rebuild test
to load the latest version, without saving to grub
sudo nix-collect-grabage --delete-older-than 15d
to remove older system versions/packages
Updating packages - by default nixpkgs
is pinned to certain channels
(upstream, unstable, and LTS e.g. 23.11). Nix Flakes makes managing deps easier by pinning certain deps outside of he current channel. Makng resolving deps easier. Think npm/yarn/bun link or something.
Add "flakes"
to the nix.settings.experimental-features
option to enable. Rebuild.
Run cd /etc/nixos && sudo nix flake init --template github.com/vimjoyer/flake-starter-config
to init a basic flakes file.
To rebuild with flakes enabled, you need to run sudo nixos-rebuild switch --flake /etc/nixos#default
where the path is to the flakes directory
A good configuration structure:
/etc/nixos
|-flake.nix
|-flake.lock
|-modules/
|-nixos/
|-home-manager/
|-hosts/
|-default/
|-configuration.nix
|-hardware-configuration.nix
|-home.nix
|-srv/
|-configuration.nix
|-hardware-configuration.nix
|-home.nix
Now you can change config using cmd like sudo nixos-rebuild switch --flake /etc/nixos#srv
Modules
Nix code to extend configuration by setting options or providing new ones
fn(inputs) -> map[options]
Every modules imported has access to all other options from all other modules.
Home Manager
A module enable editing a user’s home directory.