diff --git a/src/unix_distributions/index.rst b/src/unix_distributions/index.rst index 2b212d7..6b6c33f 100644 --- a/src/unix_distributions/index.rst +++ b/src/unix_distributions/index.rst @@ -9,5 +9,6 @@ fedora kazetaos macos + nixos raspberry_pi_os steamos diff --git a/src/unix_distributions/nixos.rst b/src/unix_distributions/nixos.rst new file mode 100644 index 0000000..67bfda6 --- /dev/null +++ b/src/unix_distributions/nixos.rst @@ -0,0 +1,275 @@ +NixOS +===== + +.. contents:: Table of Contents + +Introduction +------------ + +NixOS is a declarative Linux distribution. It is recommended for advanced Linux users. + +Features [1][2]: + +- Declarative configuration for files, packages, and services +- Builds are reproducible and easily shareable +- Install two or more versions of the same program +- Automatic operating system backups called "generations" +- Optional rolling release updates + +Releases +-------- + +Every 6 months, a new NixOS major update is released and promoted to the "stable" branch. This happens in May (``YY.05``) and November (``YY.11``). They are tagged with the year and month. Each major release gets bug and security updates for 7 months. There is also an "unstable" rolling release branch of NixOS with the latest packages. [3] + +Global Configuration +-------------------- + +Introduction +~~~~~~~~~~~~ + +The NixOS configuration is defined in ``/etc/nixos/configuration.nix``. After editing this file, run the command ``sudo nixos-rebuild switch``. + +- Configure a unique hostname (the default is ``nixos``). + + :: + + { config, pkgs, ... }: + { + networking.hostName = ""; + } + +- Configure the time zone (for example, ``America/New_York``). + + :: + + { config, pkgs, ... }: + { + time.timeZone = "/"; + } + +- Configure the locale (for example, ``en_US.UTF-8``). + + :: + + { config, pkgs, ... }: + { + i18n.defaultLocale = ""; + i18n.extraLocaleSettings = { + LC_ADDRESS = ""; + LC_IDENTIFICATION = ""; + LC_MEASUREMENT = ""; + LC_MONETARY = ""; + LC_NAME = ""; + LC_NUMERIC = ""; + LC_PAPER = ""; + LC_TELEPHONE = ""; + LC_TIME = ""; + }; + } + +- Allow proprietary software. + + :: + + { config, pkgs, ... }: + { + nixpkgs.config.allowUnfree = true; + } + +- Install NVIDIA proprietary grahpics driver. It is important to note that NixOS uses ``services.xserver`` to configure graphical settings regardless of if Xorg X11 or Wayland is used. [5] + + :: + + { config, pkgs, ... }: + { + nixpkgs.config.allowUnfree = true; + # Latest driver. + services.xserver.videoDrivers = [ "nvidia" ]; + # Or use a legacy driver. + #hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_470; + #hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_390; + #hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_340; + } + +- Enable 32-bit graphics drivers. + + :: + + { config, pkgs, ... }: + { + hardware.graphics.enable32Bit = true; + } + +- Enable SSH access. Optionally configure a list of authorized public SSH keys and disable root access entirely. + + :: + + { config, pkgs, ... }: + { + services.openssh.enable = true; + #users.users..openssh.authorizedKeys.keys = [ "" ]; + #services.openssh.settings.PermitRootLogin = "no"; + } + +- Install a specific version of the Linux kernel. Otherwise, the latest long-term support (LTS) kernel is installed by default. [6] + + :: + + { config, pkgs, ... }: + { + boot.kernelPackages = pkgs.linuxKernel.packages.linux_6_13; + } + +[4] + +Experimental Nix Features +~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are a lot of experimental features for Nixpkg. The two most commonly used are ``flakes`` and ``nix-command``. `View the full list here `__. + +- Enable the most common experimental features using ``/etc/nixos/configuration.nix``. + + :: + + { config, pkgs, ... }: + { + nix.settings = { + experimental-features = [ + "flakes" + "nix-command" + ]; + }; + } + +Packages +~~~~~~~~ + +Search for packages with either ``nix search nixpkgs`` (where ``nixpkgs`` is the repository) or use the `official NixOS package search website `__. The website also shows useful configuration options. + +- View all available packages and what repository they come from. + + .. code-block:: sh + + $ nix-env -qaP '*' --description + +- Define packages to install globally. + + :: + + { config, pkgs, ... }: + { + environment.systemPackages = with pkgs; [ + + + ]; + } + +- Some packages are installed automatically if they support an ``enable`` configuration option. This is most useful for systemd services which will be installed and then enabled automatically. + + :: + + { config, pkgs, ... }: + { + environment.systemPackages = with pkgs; [ + firefox + ]; + } + + :: + + { config, pkgs, ... }: + { + programs.firefox.enable = true; + } + +- Install packages based on the CPU architecture. + + :: + + { config, pkgs, ... } + { + environment.systemPacks = with pkgs; [ + firefox + ] ++ lib.optionals stdenv.isx86_64 [ + thermald + ] ++ lib.optionals stdenv.isAarch64 [ + box64 + ]; + } + + :: + + { config, pkgs, ... } + { + programs.firefox.enable = true; + services.thermald.enable = pkgs.stdenv.isx86_64; + } + +- `Enable AppImage support. `__ + + :: + + { config, pkgs, ... } + { + programs.appimage.enable = true; + programs.appimage.binfmt = true; + } + +- `Enable Flatpak support. `__ + + :: + + { config, pkgs, ... } + { + services.flatpak.enable = true; + xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; + xdg.portal.config.common.default = "gtk"; + } + + .. code-block:: sh + + $ flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + $ flatpak update + +[4] + +- Enable support for non-NixOS Linux binaries. The list of packages to get libraries from needs to be defined and is separate from the system packages. It is recommended to start with ``steam-run`` which includes many common libraries. + + :: + + { config, pkgs, ... } + { + services.envfs.enable = true; + programs.nix-ld = { + enable = true; + libraries = pkgs.steam-run.args.multiPkgs pkgs; + }; + } + + - If a library is still missing, search to see if a NixOS package provides it. For example, search for the ``libzstd.so.1`` Zstandard library file. [7] + + .. code-block:: sh + + $ nix run github:nix-community/nix-index-database lib/ + + .. code-block:: sh + + $ nix run github:nix-community/nix-index-database lib/libzstd.so.1 + zstd.out 0 s /nix/store/9nizcmvz2699nkrbzxx8xsp5d8jp686w-zstd-1.5.7/lib/libzstd.so.1 + zstd.out 905,672 x /nix/store/9nizcmvz2699nkrbzxx8xsp5d8jp686w-zstd-1.5.7/lib/libzstd.so.1.5.7 + +History +------- + +- `Latest `__ + +Bibliography +------------ + +1. "Declarative builds & deployments." Nix & NixOS. Accessed July 29, 2026. https://nixos.org/ +2. "Introduction to NixOS." Medium - Omkar Chandorkar. May 27, 2020. Accessed July 29, 2026. https://medium.com/the-script-group/introduction-to-nixos-a9dac91399a7 +3. "NixOS." endoflife.date. May 28, 2026. Accessed July 29, 2026. https://endoflife.date/nixos +4. "Version 26.05." NixOS Manual. Accessed August 7, 2026. https://nixos.org/manual/nixos/stable/ +5. "services.xserver naming is confusing #94799." GitHub NixOS/nixpkgs. June 23, 2026. Accessed August 7, 2026. https://github.com/NixOS/nixpkgs/issues/94799 +6. "Linux kernel." NixOS Wiki. Accessed August 7, 2026. https://nixos.wiki/wiki/Linux_kernel +7. "Nix-ld." Official NixOS Wiki. June 16, 2026. Accessed August 12, 2026. https://wiki.nixos.org/wiki/Nix-ld