Compare commits

...

11 Commits

Author SHA1 Message Date
abff2a9acb fix deprecation warning 2026-03-26 23:34:37 +01:00
815401f900 fix module 2026-03-26 23:31:01 +01:00
fb4142d95d ta bort telegram från system 2026-03-26 23:22:39 +01:00
c0a4f309d6 remove comment 2026-03-26 23:19:28 +01:00
fe6800db1a reame + helper 2026-03-26 23:19:13 +01:00
acd6498875 bash wrapper 2026-03-26 22:58:45 +01:00
0dd59cb0ec 32bit and docker 2026-03-26 20:23:35 +01:00
1caf83fc3e add love to cd 2026-03-25 14:56:32 +01:00
8fd9d95f00 teeldear 2026-03-25 14:48:31 +01:00
3264826acb update 2026-03-25 12:08:45 +01:00
2062b1f76b Lolcat++ 2026-03-25 12:07:40 +01:00
9 changed files with 149 additions and 251 deletions

247
README.md
View File

@@ -3,67 +3,21 @@
Det här förrådet innehåller en flake-baserad NixOS-konfiguration för mina Det här förrådet innehåller en flake-baserad NixOS-konfiguration för mina
maskiner. maskiner.
Just nu finns hosten `kronos`, med: Just nu finns värden `kronos`.
- `Hyprland` Punktfiler förväntas att finns under `~/dotfiles`, och hanteras med home manager
- `ZFS` som root-filsystem
- `LUKS` under `ZFS`
- `TPM2` för automatisk upplåsning av LUKS
- `zram` i stället för swap-partition
- `systemd-networkd` och `systemd-resolved`
- `GRUB` med `os-prober` för Windows-stöd
- `NVIDIA` med `nvidia-open` för `kronos`
- `OpenSSH`
- automatiska `ZFS`-snapshots
Dotfiles hanteras inte av Nix i det här förrådet. De installeras separat med ## Flakes
`stow` från `~/dotfiles`.
## Struktur Vi lever i framtiden, därför används flakes exklusivt.
- `flake.nix` är startpunkten ## För att installera
- `hosts/kronos/default.nix` är huvudfilen för maskinen `kronos`
- `hosts/kronos/disko.nix` beskriver disk-layouten
- `hosts/kronos/hardware-configuration.nix` är hårdvaruspecifik och genereras på maskinen
- `modules/base.nix` innehåller grundsystem
- `modules/zfs-root.nix` innehåller boot, LUKS, TPM och ZFS-relaterade delar
- `modules/desktop-hyprland.nix` innehåller desktopmiljön och paketen
## Viktigt innan installation 1. Kontrollera att rätt disk (`installDisk`) är vald i `hosts/kronos/default.nix`
2. Generera en `hardware-configuration.nix`. Tag dock bort all information om filsystem. Disko sköter redan det åt oss.
3. Kontrollera `networking.hostId`. Bör vara unikt för nätverket.
Det finns några saker som måste ändras innan konfigurationen används på en ny maskin. ### Applicera konfiguration
1. Kontrollera att rätt disk är vald i `hosts/kronos/default.nix`
- just nu pekar `installDisk``/dev/disk/by-id/wwn-0x5001b444a9734c0e`
- det är tänkt att vara nuvarande Arch-disken på `kronos`
- ändra detta innan återanvändning på annan maskin
2. Generera riktig `hardware-configuration.nix`
- den nuvarande filen är bara en platshållare tills den genereras på målsystemet
3. Kontrollera `networking.hostId`
- ZFS kräver att den är satt
4. Tänk på att disken raderas
- `disko` partitionerar, formaterar och skapar LUKS/ZFS enligt konfigurationen
5. `kronos` antar `NVIDIA`
- hosten är nu konfigurerad för `nvidia-open` med modesetting
Disk-layouten är just nu:
- `EFI` för boot
- `LUKS` på resten av disken
- `ZFS pool` (`rpool`) ovanpå den upplåsta LUKS-enheten
- ingen vanlig swap-partition på disk
- `zram` används för swap i RAM
Bootloadern är `GRUB`, inte `systemd-boot`, eftersom `kronos` är satt upp för att
hitta andra installerade system via `os-prober`, till exempel Windows.
## Installation från minimal NixOS-installationsmedia
Om nätverket inte redan fungerar i installationsmediet:
```bash
nmtui
```
Sedan: Sedan:
@@ -75,29 +29,12 @@ git clone <repo-url> nixcfg
cd nixcfg cd nixcfg
``` ```
Redigera sedan rätt disk i `hosts/kronos/default.nix`:
```bash
vim hosts/kronos/default.nix
```
Applicera disk-layouten: Applicera disk-layouten:
```bash ```bash
nix run github:nix-community/disko -- --mode disko .#kronos nix run github:nix-community/disko -- --mode disko .#kronos
``` ```
Det kommandot gör i praktiken detta:
- partitionerar disken
- skapar EFI-partitionen
- skapar LUKS-enheten `cryptroot`
- skapar ZFS-poolen `rpool`
- skapar datasets
- monterar målsystemet under `/mnt`
Det är därför nästa steg använder `/mnt`.
Generera hårdvarufilen och kopiera in den i förrådet: Generera hårdvarufilen och kopiera in den i förrådet:
```bash ```bash
@@ -105,50 +42,41 @@ nixos-generate-config --root /mnt
cp /mnt/etc/nixos/hardware-configuration.nix ./hosts/kronos/hardware-configuration.nix cp /mnt/etc/nixos/hardware-configuration.nix ./hosts/kronos/hardware-configuration.nix
``` ```
Kom ihåg att ta bort alla filesystemkonfiguration från `hardware-configuration.nix`.
Disko sköter ju redan det.
Kopiera också över konfigurationen till målenheten
```bash
rm -rf /mnt/etc/nixos
cp -r /tmp/nixcfg /mnt/etc/nixos
```
Installera systemet: Installera systemet:
```bash ```bash
nixos-install --flake .#kronos nixos-install --flake .#kronos
``` ```
Enrolla sedan TPM-nyckeln innan omstart: Registrera TPM-nyckeln:
```bash ```bash
nixos-enter --root /mnt -c 'systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 /dev/disk/by-partlabel/cryptroot' nixos-enter --root /mnt
./systemd-cryptenroll.sh
``` ```
Och starta om: Starta om:
```bash ```bash
reboot reboot
``` ```
## Vad TPM-upplåsningen betyder
TPM ersätter inte ditt vanliga LUKS-lösenord. Den lägger till en extra väg för
upplåsning.
Det betyder:
- LUKS kan fortfarande låsas upp med recovery-lösenord/passphrase
- maskinen kan låsa upp automatiskt med TPM om boot-tillståndet matchar
- om firmware, Secure Boot eller PCR-värden ändras kan du behöva skriva lösenordet manuellt en gång och sedan enrolla om TPM
## Efter första uppstart ## Efter första uppstart
Kloning av dotfiles och installation med `stow` görs separat:
```bash ```bash
git clone <dotfiles-repo> ~/dotfiles git clone <dotfiles-repo> ~/dotfiles
cd ~/dotfiles
stow ghostty foot hyprland paru shell tmux wezterm
``` ```
Observera att dina nuvarande Hyprland-dotfiles fortfarande försöker starta
`nm-applet`. Eftersom systemet använder `systemd-networkd` i stället för
NetworkManager bör den raden tas bort eller ersättas efter att dotfiles har
stow:ats in.
## Vanligt underhåll ## Vanligt underhåll
När systemet väl är installerat jobbar man oftast så här. När systemet väl är installerat jobbar man oftast så här.
@@ -188,132 +116,3 @@ Kontrollera `ZFS`-snapshots:
```bash ```bash
zfs list -t snapshot zfs list -t snapshot
``` ```
Kontrollera `OpenSSH`:
```bash
systemctl status sshd
```
Bra arbetssätt är ofta:
- ändra Nix-filerna
- kör `nixos-rebuild test` eller `switch`
- verifiera att allt fungerar
- committa ändringen i förrådet
Eftersom NixOS sparar generationer är det också lättare att backa tillbaka än i
många traditionella distributioner.
## Flera maskiner i samma förråd
Det här upplägget är gjort för att flera maskiner ska kunna leva i samma förråd.
En vanlig struktur är:
- gemensamma moduler i `modules/`
- en mapp per maskin i `hosts/<namn>/`
För att lägga till en ny maskin kan du till exempel:
1. skapa en ny mapp, till exempel `hosts/atlas/`
2. lägga in en egen `default.nix`
3. lägga in en egen `disko.nix` om disk-layouten skiljer sig
4. generera en egen `hardware-configuration.nix` på den maskinen
5. lägga till hosten i `flake.nix`
Exempel i `flake.nix`:
```nix
nixosConfigurations = {
kronos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { inherit inputs; };
modules = [
disko.nixosModules.disko
./hosts/kronos
];
};
atlas = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { inherit inputs; };
modules = [
disko.nixosModules.disko
./hosts/atlas
];
};
};
```
Sedan kan varje maskin byggas separat:
```bash
sudo nixos-rebuild switch --flake .#kronos
sudo nixos-rebuild switch --flake .#atlas
```
Det fina med detta är att gemensamma delar, som `base.nix` eller
`desktop-hyprland.nix`, kan återanvändas, medan varje maskin ändå kan ha egen:
- disk-layout
- hostname
- hårdvarufil
- användare eller roller
- specialpaket eller tjänster
## Sammanfattning
Tanken med förrådet är:
- ett ställe för systemkonfiguration
- separata hostar per maskin
- återanvändbara moduler för gemensamma delar
- dotfiles separat via `stow`
- enkel reproducerbar installation från minimal NixOS-media
Observera att NVIDIA-delen just nu är hostspecifik för `kronos`. Om du lägger till
en annan maskin utan NVIDIA bör du inte kopiera den delen rakt av.
## Begrepp som kan vara bra att känna till
`sops-nix` och `agenix` är två vanliga sätt att hantera hemligheter i NixOS,
utan att lägga lösenord, tokens eller nycklar i klartext i förrådet.
- `sops-nix` bygger på Mozilla `sops`
- hemligheter krypteras i filer som kan committas till git
- dekryptering sker på rätt maskin vid aktivering, typiskt med `age` eller GPG
- bra när man vill ha ett centralt, versionshanterat sätt att hantera secrets
- `agenix` bygger i stället direkt på `age`
- det är ofta enklare och mer minimalt än `sops-nix`
- vanligt val om man bara vill ha några hemligheter och ett lättare upplägg
Typiska användningsfall är:
- Wi-Fi-hemligheter
- API-nycklar
- tokens
- privata SSH-nycklar för tjänster
- lösenord till systemtjänster
`impermanence` är ett upplägg där stora delar av systemet behandlas som
förbrukningsbara mellan boots.
Det brukar betyda att:
- root-filsystemet återställs till ett rent grundläge vid boot
- bara vissa kataloger sparas permanent, till exempel `/home`, `/var/lib` eller annat under `/persist`
- systemet blir lättare att hålla rent och reproducibelt
Det passar extra bra ihop med `ZFS`, eftersom snapshots och rollback redan finns
naturligt där.
Fördelar med `impermanence`:
- mindre konfigurationsdrift över tid
- lättare att veta vad som faktiskt är deklarativt
- enklare återställning efter experiment eller fel
Nackdelen är att det kräver att man tänker igenom vad som faktiskt ska sparas.
Det är ofta något man lägger till senare, när grundinstallationen redan känns stabil.

37
flake.lock generated
View File

@@ -30,8 +30,8 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1774430805, "lastModified": 1774564269,
"narHash": "sha256-fDescJvj4v7FteRhPIZEE1CRyAjRpfER/0kvntNNckM=", "narHash": "sha256-sdxUQJAc5t5hbQbG0SZ4B3YehTtNiRUqDNzvO/KakZk=",
"path": "/home/love/dotfiles", "path": "/home/love/dotfiles",
"type": "path" "type": "path"
}, },
@@ -47,11 +47,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1774371786, "lastModified": 1774561634,
"narHash": "sha256-ag1HUJv0SDBqKAYxwWlvAE2gBsEk3XYFvWtmdAHFz7E=", "narHash": "sha256-3q1xsREjqdVIIwQQDZQ9y0YdBzP8gAxdwKoKnZSzJtU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "b8cb89f2c4f7006b17b4aa5d8b39b95b93b559d8", "rev": "7c046c63ac3b467c1d589b99d531da5b6520825a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -60,13 +60,33 @@
"type": "github" "type": "github"
} }
}, },
"lolcat++": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1774436770,
"narHash": "sha256-l9geMRTQbPlnds+QFAPBywpZWRNH964zOvkeUMX3k9U=",
"owner": "lolcatpp",
"repo": "lolcatpp",
"rev": "619f2bb439bd28a6d77f31361b24c5f48832b067",
"type": "github"
},
"original": {
"owner": "lolcatpp",
"repo": "lolcatpp",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1774106199, "lastModified": 1774386573,
"narHash": "sha256-US5Tda2sKmjrg2lNHQL3jRQ6p96cgfWh3J1QBliQ8Ws=", "narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "6c9a78c09ff4d6c21d0319114873508a6ec01655", "rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -81,6 +101,7 @@
"disko": "disko", "disko": "disko",
"dotfiles": "dotfiles", "dotfiles": "dotfiles",
"home-manager": "home-manager", "home-manager": "home-manager",
"lolcat++": "lolcat++",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
} }
} }

View File

@@ -14,6 +14,11 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
"lolcat++" = {
url = "github:lolcatpp/lolcatpp";
inputs.nixpkgs.follows = "nixpkgs";
};
dotfiles = { dotfiles = {
url = "path:/home/love/dotfiles"; url = "path:/home/love/dotfiles";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
@@ -22,7 +27,13 @@
}; };
outputs = outputs =
inputs@{ nixpkgs, disko, home-manager, dotfiles, ... }: inputs@{
nixpkgs,
disko,
home-manager,
dotfiles,
...
}:
{ {
nixosConfigurations.kronos = nixpkgs.lib.nixosSystem { nixosConfigurations.kronos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";

View File

@@ -27,13 +27,20 @@ in
../../modules/base.nix ../../modules/base.nix
../../modules/zfs-root.nix ../../modules/zfs-root.nix
../../modules/desktop-hyprland.nix ../../modules/desktop-hyprland.nix
../../modules/bin-bash-wrapper.nix
]; ];
my.binBashWrapper.enable = true;
networking.hostName = hostName; networking.hostName = hostName;
networking.hostId = "ff0b8826"; networking.hostId = "ff0b8826";
services.xserver.videoDrivers = [ "nvidia" ]; services.xserver.videoDrivers = [ "nvidia" ];
hardware.nvidia = { hardware = {
graphics = {
enable32Bit = true;
};
nvidia = {
modesetting.enable = true; modesetting.enable = true;
powerManagement.enable = false; powerManagement.enable = false;
powerManagement.finegrained = false; powerManagement.finegrained = false;
@@ -41,6 +48,9 @@ in
nvidiaSettings = true; nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.stable; package = config.boot.kernelPackages.nvidiaPackages.stable;
}; };
};
virtualisation.docker.enable = true;
users.mutableUsers = true; users.mutableUsers = true;
users.users.${userName} = { users.users.${userName} = {
@@ -52,6 +62,8 @@ in
"render" "render"
"video" "video"
"wheel" "wheel"
"cdrom"
"docker"
]; ];
shell = pkgs.zsh; shell = pkgs.zsh;
}; };

View File

@@ -1,14 +1,24 @@
# Do not modify this file! It was generated by nixos-generate-config {
# and may be overwritten by future invocations. Please make changes config,
# to /etc/nixos/configuration.nix instead. lib,
{ config, lib, pkgs, modulesPath, ... }: modulesPath,
...
}:
{ {
imports = imports = [
[ (modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/installer/scan/not-detected.nix")
]; ];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "sr_mod" ]; boot.initrd.availableKernelModules = [
"nvme"
"xhci_pci"
"ahci"
"usbhid"
"usb_storage"
"sd_mod"
"sr_mod"
];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ]; boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];

View File

@@ -1,4 +1,5 @@
{ {
inputs,
pkgs, pkgs,
userName, userName,
... ...
@@ -99,10 +100,11 @@
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
inputs."lolcat++".packages.${pkgs.stdenv.hostPlatform.system}.default
file file
cowsay cowsay
fortune fortune
lolcat
bat bat
fastfetch fastfetch
curl curl
@@ -119,6 +121,7 @@
unzip unzip
wget wget
killall killall
tealdeer
efibootmgr efibootmgr

View File

@@ -0,0 +1,21 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.my.binBashWrapper;
bashWrapper = pkgs.writeShellScriptBin "bash" ''
exec /usr/bin/env bash "$@"
'';
in
{
options.my.binBashWrapper.enable = lib.mkEnableOption "create a /bin/bash wrapper";
config = lib.mkIf cfg.enable {
systemd.tmpfiles.rules = [
"L+ /bin/bash - - - - ${bashWrapper}/bin/bash"
];
};
}

View File

@@ -1,7 +1,10 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
programs.dconf.enable = true; programs.dconf.enable = true;
programs.hyprland.enable = true; programs.hyprland = {
enable = true;
xwayland.enable = true;
};
programs.thunar.enable = true; programs.thunar.enable = true;
programs.thunderbird.enable = true; programs.thunderbird.enable = true;
programs.xwayland.enable = true; programs.xwayland.enable = true;
@@ -49,6 +52,9 @@
noto-fonts noto-fonts
noto-fonts-cjk-sans noto-fonts-cjk-sans
noto-fonts-color-emoji noto-fonts-color-emoji
vista-fonts
corefonts
source-han-sans
]; ];
fonts.fontconfig.defaultFonts = { fonts.fontconfig.defaultFonts = {
@@ -94,7 +100,6 @@
rofi rofi
slurp slurp
socat socat
telegram-desktop
waybar waybar
wezterm wezterm
wl-clipboard wl-clipboard

16
systemd-cryptenroll.sh Normal file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
PASSWORD_FILE="$(mktemp /run/cryptroot.pass.XXXXXX)"
read -rsp "Lukslösenord: " LUKS_PASSWORD
echo
printf '%s' "$LUKS_PASSWORD" >"$PASSWORD_FILE"
trap 'rm -f "$PASSWORD_FILE"' EXIT INT TERM HUP
unset LUKS_PASSWORD
chmod 600 "$PASSWORD_FILE"
systemd-cryptenroll \
--unlock-key-file="$PASSWORD_FILE" \
--tpm-device=auto \
--tpm2-pcrs=7 \
/dev/disk/by-partlabel/cryptroot