NixOS - Wie installiert man NixOS?
Vor kurzem sah ich hier auf Gnu/Linux.ch die Artikelserie über NixOS. Da ich in meiner Dokumentation noch eine Anleitung für eine detaillierte Installation hatte, dachte ich mir ich könnte diese doch hier veröffentlichen, damit der Einstieg mit NixOS noch leichter fällt.
Allgemeine Infos
Die Installation von NixOS ist sehr ähnlich wie die 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 “root”. 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-40GB 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 einfach 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 Tips gibt es in der Datei configuration.nix
oder auch im Handbuch.