NixOS en Raspberry Pi


Instalando NixOS en una Pi 3 B+

[!NOTE] Debes tener raspbian instalado.

Aumentar RAM con SWAP

[!NOTE] Esto no es indispensable pero en el caso de la Raspberry Pi 3 B +, que solo viene con 1GB de RAM es recomendable aumentarlo.

sudo dphys-swapfile swapoff
sudo nano /etc/dphys-swapfile

Cada 1024 es 1GB.

CONF_SWAPSIZE=1024
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
sudo reboot

Generando .img de NixOS para Raspberry

sudo apt install curl xz-utils git
curl -L https://nixos.org/nix/install | sh
  1. Copiamos el comando que nos aparece al final de la instalación de nix:
. /home/wilovy/.nix-profile/etc/profile.d/nix.sh
  1. Creamos un archivo ~/.config/nix/nix.conf con el contenido:
experimental-features = nix-command flakes
  1. Creamos un archivo flake.nix (se puede crear donde sea, recomiendo que sea en ~) con el siguiente contenido:
{
  description = "Base system for raspberry pi";
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    nixos-generators = {
      url = "github:nix-community/nixos-generators";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = {
    self,
    nixpkgs,
    nixos-generators,
    ...
  }: {
    nixosModules = {
      system = {
        disabledModules = [
          "profiles/base.nix"
        ];

        system.stateVersion = "24.11";
      };
      users = {
        users.users = {
        # Aqui podemos cambiar el nombre de nuestro usuario que queremos crear.
          admin = {
            # Esta contraseña da igual, se cambiara al final solo sirve al inicio
            password = "admin123";
            isNormalUser = true;
            extraGroups = ["wheel" "networkmanager"];
          };
        };
      };
    };

    packages.aarch64-linux = {
      sdcard = nixos-generators.nixosGenerate {
        system = "aarch64-linux";
        format = "sd-aarch64";
        modules = [
          ./extra-config.nix
          self.nixosModules.system
          self.nixosModules.users
        ];
      };
    };
  };
}
  1. Creamos otro archivo extra-config.nix
{pkgs, ...}: {
  networking.firewall.enable = false;
  networking.networkmanager.enable = true;
  networking.firewall.allowedTCPPorts = [22];

  nix.settings.experimental-features = ["nix-command" "flakes"];
  nixpkgs.config.allowUnfree = true;
  environment.systemPackages = with pkgs; [
    openssh
    vim
  ];

  security.polkit.enable = true;
  services.dbus = {
    enable = true;
  };

  swapDevices = [
    {
      device = "/swapfile";
      size = 2 * 1024;
    }
  ];

  services.openssh = {
    enable = true;
    ports = [22];
  };
}
  1. Ahora si corremos el siguiente comando a la altura de nuestro flake.nix
NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nix build --impure .#packages.aarch64-linux.sdcard
  1. Ahora tenemos que cargar ese .img que se genero en nuestra micro sd e iniciar la raspberry pi
nix-channel --update
nixos-generate-config

[!NOTE] Si ocupamos conectarnos con wifi lo hacemos con nmtui.

  1. Actualizamos
sudo nix-channel --upgrade

[!NOTE] Esto puede tardar varios minutos

sudo nixos-rebuild switch -I nixos-config=/etc/nixos/configuration.nix
  1. Modificamos la configuración de nix
{pkgs, ...}: {
  imports = [
    ./hardware-configuration.nix
  ];

  boot.loader.grub.enable = false;
  boot.loader.generic-extlinux-compatible.enable = true;

  networking.hostName = "nixrpi";
  networking.networkmanager.enable = true;

  time.timeZone = "America/Monterrey";

  # El nombre del usuario debe ser el mismo que habiamos asignado al inicio
  users.users.admin = {
    isNormalUser = true;
    extraGroups = ["wheel" "networkmanager" "docker"];
  };

  i18n.defaultLocale = "en_US.UTF-8";

  networking.firewall.allowedTCPPorts = [22];
  services.openssh = {
    enable = true;
    ports = [22];
  };

  security.polkit.enable = true;
  services.dbus = {
    enable = true;
  };

  swapDevices = [
    {
      device = "/swapfile";
      size = 3 * 1024;
    }
  ];

  nix.settings.experimental-features = ["nix-command" "flakes"];
  nixpkgs.config.allowUnfree = true;
  environment.systemPackages = with pkgs; [
    vim
    curl
    git
    gh
  ];

  system.stateVersion = "25.05";
}
  1. Rebuildeamos
sudo nixos-rebuild switch -I nixos-config=/etc/nixos/configuration.nix
  1. Cambiamos la contraseña de nuestro nuevo usuario
passwd USER_DEFINIDO