Wie installiert man NixOS?

Mo, 6. Dezember 2021, @foxit:opensync.info

Die Installation von NixOS ähnelt der von Arch Linux. Daher sollten Personen, die schon einmal Arch Linux installiert haben, keine grösseren Probleme damit haben. Ich zeige hier alle Befehle, welche ich für die Installation verwendet habe. Die Installation verwendet eine LUKS Verschlüsselung mit LVM und UEFI.



Ein paar Punkte sind speziell zu beachten, daher machen wir das alles Schritt für Schritt. Ich werde die Installation via SSH von meinem Hauptrechner aus starten. Daher muss ich nach dem Start der Live-CD einige zusätzliche Schritte durchführen, damit ich mich per SSH auf die Live-CD verbinden kann. Es spielt keine Rolle, welches ISO man dafür wählt. Die nachfolgende Installation verhält sich bei jedem ISO gleich.

Ich logge mich also zuerst auf der Konsole ein und werde erlange Root-Rechte. Ich setze das Tastaturlayout auf Schweizerdeutsch und definiere ein Passwort für den User nixos. Jetzt noch SSH via systemd startet und die IP-Adresse auslesen:

sudo -i
loadkeys de_CH-latin1
passwd nixos
systemctl start sshd
ss -tlpen
ip -br add

Gab es bis hierher keine Probleme, sollte es möglich sein, sich per SSH mit der Live-CD zu verbinden:

ssh nixos@<IP>

Wir starten die Installation

Ich gehe davon aus, dass die ganze Festplatte bzw. SSD für die Installation zur Verfügung steht. Sämtliche Befehle, müssen als Root ausgeführt werden. Wir löschen im ersten Schritt sämtliche Partitionen auf dem Datenträger:

blkdiscard -v /dev/sda
wipefs -a /dev/sda
gdisk -l /dev/sda

Wir markieren die SSD mit einem GPT-Label und erstellen zwei Partitionen. Die erste Partition ist für das das Booten notwendig und enthält den Kernel. Den restlichen Platz verwenden wir für das LVM:

parted /dev/sda -- mklabel gpt
sgdisk -n 1:0:+1024M -c 1:"EFI System Partition" -t 1:EF00 /dev/sda
sgdisk -n 2:0:0 -c 2:"Linux LVM" -t 2:8e00 /dev/sda
parted /dev/sda -- set 1 boot on

Wir aktivieren LUKS auf der zweiten Partition. Hierfür müssen wir die Eingabe mit: YES bestätigen und ein sicheres Passwort definieren:

cryptsetup -c aes-xts-plain64 -y -s 512 luksFormat /dev/sda2
cryptsetup --allow-discards luksOpen /dev/sda2 lvm

Bei dem LVM Layout kann jeder seine eigenen Ansprüche definieren. Die Grösse der einzelnen Partitionen muss man natürlich an die vorhandene Hardware anpassen. NixOS hat gern eine etwas grössere Root Partitionen für `/nix`. Ein Wert von 20 - 40 GB hat bei mir aber immer genügt:

pvcreate /dev/mapper/lvm
vgcreate main /dev/mapper/lvm
lvcreate -L 2G -n swap main
lvcreate -L 40G -n root main
lvcreate -L 100G -n home main

Wir formatieren die Partitionen und aktivieren SWAP:

mkfs.fat -F 32 -n EFIBOOT /dev/sda1
mkfs.ext4 -L root /dev/mapper/main-root
mkfs.ext4 -L home /dev/mapper/main-home
mkswap /dev/mapper/main-swap

Mounten diese nach /mnt und erstellen die Ordner boot und home:

mount /dev/mapper/main-root /mnt/
mkdir /mnt/boot
mkdir /mnt/home
mount /dev/sda1 /mnt/boot/
mount /dev/mapper/main-home /mnt/home/
swapon /dev/mapper/main-swap

Dann kommt der letzte Schritt. Wir generieren eine passende configuration.nix für unser System und können dort noch weitere Anpassungen durchführen.

nixos-generate-config --root /mnt
vim /mnt/etc/nixos/configuration.nix

Hier als Beispiel eine einfache Konfiguration:

{ config, pkgs, ... }:

{
  imports =
    [
      ./hardware-configuration.nix
    ];

  # Use the systemd-boot EFI boot loader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # Set hostname.
  networking.hostName = "nixos1-1"; # Define your hostname.

  # Set your time zone.
  time.timeZone = "Europe/Zurich";

  # The global useDHCP flag is deprecated, therefore explicitly set to false here.
  # Per-interface useDHCP will be mandatory in the future, so this generated config
  # replicates the default behaviour.
  networking.useDHCP = false;
  networking.interfaces.enp0s3.useDHCP = true;

  # Set console.
  console = {
    font = "Lat2-Terminus16";
    keyMap = "sg";
  };

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.sysadmin = {
    isNormalUser = true;
    extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
  };

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    curl
    htop
    tmux
    vim
    wget
  ];

  # Enable the OpenSSH daemon.
  services.openssh.enable = true;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "21.11"; # Did you read the comment?
}

Es kann vorkommen, dass man in der Datei hardware-configuration.nix noch die UUID der LUKS Partition manuell hinzufügen (Die UUID kann man mit dem Kommando: blkid /dev/sda2 auslesen) muss:

boot.initrd.luks.devices."lvm".device = "/dev/disk/by-uuid/585865c9-cf08-4d5d-9475-ad5d29c9469f";

Die komplette Datei ist hier zu sehen:

# Do not modify this file!  It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations.  Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:

{
  imports = [ ];

  boot.initrd.availableKernelModules = [ "ata_piix" "ohci_pci" "sd_mod" "sr_mod" ];
  boot.initrd.kernelModules = [ "dm-snapshot" ];
  boot.kernelModules = [ ];
  boot.extraModulePackages = [ ];

  boot.initrd.luks.devices."lvm".device = "/dev/disk/by-uuid/585865c9-cf08-4d5d-9475-ad5d29c9469f";

  fileSystems."/" =
    { device = "/dev/disk/by-uuid/c563c3d8-e99b-4f80-ac5b-25875128edc2";
      fsType = "ext4";
    };

  fileSystems."/boot" =
    { device = "/dev/disk/by-uuid/3EA7-6F46";
      fsType = "vfat";
    };

  fileSystems."/home" =
    { device = "/dev/disk/by-uuid/fc7b5095-dfda-453f-b9c2-349b085dc830";
      fsType = "ext4";
    };

  swapDevices =
    [ { device = "/dev/disk/by-uuid/43ed4cc9-29cf-4f61-a4ca-39d9ef7b3fc3"; }
    ];

  hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
  virtualisation.virtualbox.guest.enable = true;
}

Zum Schluss starten wir die finale Installation:

nixos-install

Während der Installation wird man aufgefordert, ein Passwort für den Benutzer root zu definieren. Mit diesem Passwort kann man sich nach dem Neustart am System anmelden. Kommt es zu keinen Fehlern, ist die Installation damit abgeschlossen und das System kann gebootet werden:

reboot

Hat man einen zusätzlichen Benutzer in der configuration.nix gesetzt, setzt man dessen Passwort am einfachsten nach dem Neustart über den Benutzer root:

passwd <USER>

Weitere nützliche Tipps gibt es in der Datei configuration.nix oder auch im Handbuch.

Links:

https://nixos.org/nixos/manual/index.html#sec-installation