✦ For everyone, free.

Practical knowledge for real and everyday life

Home

Nix Profiles

Nix Profiles are system-specific configurations that manage software packages and environments in a reproducible and isolated manner.

Nix Profiles are user or system-specific collections of installed packages managed by the Nix package manager. Each profile represents a distinct environment that contains a set of packages and their dependencies, allowing multiple independent or overlapping sets of software to coexist on the same system without conflicts. Profiles enable atomic upgrades, rollbacks, and reproducibility of software environments by tracking different "generations" of installed packages. This approach provides a robust mechanism to manage software states, isolate environments, and maintain consistency across installations.


Structure and Storage of Nix Profiles

Profile Location

Nix Profiles are stored as directories within the user’s home directory or system-wide paths. For users, profiles typically reside under ~/.nix-profile or within the multi-profile directory ~/.nix-profile/ as symlinks pointing to specific versions of installed packages. System-wide profiles are located under /nix/var/nix/profiles/.

Profile Directories and Symlinks

Each profile is a symlink to a specific "generation" stored in the Nix store (/nix/store). Generations are numbered snapshots representing the state of the profile after a package installation, upgrade, or removal. This structure enables atomic switching between generations and safe rollbacks.


Generations and Rollbacks in Profiles

Generations

A generation is a snapshot of the profile at a particular point in time. When a user installs or modifies packages via Nix, a new generation is created. Each generation directory contains symlinks to the exact package versions and dependencies resolved by the Nix store.

Rollbacks

Because each generation is preserved, a user can roll back to a previous generation, effectively reverting the profile to an earlier state. Rollbacks are performed by changing the profile symlink to point to an older generation directory. This is a reliable way to undo package updates or changes without affecting other generations.


Managing Nix Profiles

Creating and Switching Profiles

Profiles can be managed using the nix-env command or through newer Nix commands like nix profile. Users can create multiple profiles to separate environments, for example, one profile for stable tools and another for experimental software.

nix-env -p ~/.nix-profile-stable -iA nixpkgs.hello
nix-env -p ~/.nix-profile-experimental -iA nixpkgs.git

Switching between profiles involves adjusting the environment variables such as PATH to point to the desired profile's bin directory or using shell-specific profiles.

Profile Namespaces and Multi-profile Support

Nix supports multiple named profiles, each with independent package sets and generations. This facilitates complex workflows, such as having development, testing, and production profiles on the same machine.

Environment Isolation

Profiles isolate package environments, preventing global package conflicts. Since each profile has its own set of packages and dependencies, different projects or users can maintain distinct software stacks without interference.


Interaction with Nix Store and Package Management

Relationship to the Nix Store

The Nix store (/nix/store) contains all package builds and their dependencies, identified by cryptographic hashes. Profiles act as curated views or subsets of the store, composed of symlinks pointing to the required store paths. This separation maintains immutability and reproducibility.

Package Additions and Removals

When packages are added to a profile, Nix creates a new generation that includes the new package symlinks alongside existing ones. Removing a package creates a new generation without the package’s symlinks. The old generations remain intact, enabling easy rollback.


Practical Usage and Benefits

Atomic Upgrades

Profile updates are atomic because they replace the symlink to the current generation only after the new generation is fully prepared. This prevents partial or broken states during upgrades.

Reproducibility

By tracking exact package versions and configurations in generations, profiles ensure reproducible environments, essential for development, deployment, and system administration.

User-level Customization

Users can maintain personal profiles distinct from system-wide installations, allowing customized software stacks without requiring administrative privileges.


Summary of Nix Profiles Characteristics

FeatureDescription
LocationUser: ~/.nix-profile; System: /nix/var/nix/profiles/
StructureSymlinks to generations stored in the Nix store
GenerationsNumbered snapshots of profile states
RollbacksSwitching symlink to previous generation
Multiple ProfilesSupport for multiple named profiles per user/system
IsolationIndependent environments to avoid package conflicts
AtomicitySafe, all-or-nothing updates
ReproducibilityExact package versions and dependencies tracked

Nix Profiles serve as the foundational mechanism in Nix package management for organizing installed packages into manageable, isolated, and reproducible environments that support atomic upgrades and rollbacks. This design enables flexible and reliable software management across users and systems.