Compare commits

...

19 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
2c4a59d5f1 systemdboot + fix console loading 2026-03-25 11:17:53 +01:00
a1a841f573 result 2026-03-25 11:17:44 +01:00
ade1fb0dec terminus font connrect 2026-03-25 10:23:51 +01:00
b01267f4b5 Home manager 2026-03-25 10:21:01 +01:00
18b0b2f69b locale 2026-03-24 19:16:44 +01:00
244d09e8ea bygg paket 2026-03-24 19:00:47 +01:00
6b2200ed16 nerdfont 2026-03-24 18:24:49 +01:00
a69f731cfe postinstall 2026-03-24 18:22:46 +01:00
10 changed files with 270 additions and 252 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
result

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
maskiner.
Just nu finns hosten `kronos`, med:
Just nu finns värden `kronos`.
- `Hyprland`
- `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
Punktfiler förväntas att finns under `~/dotfiles`, och hanteras med home manager
Dotfiles hanteras inte av Nix i det här förrådet. De installeras separat med
`stow` från `~/dotfiles`.
## Flakes
## Struktur
Vi lever i framtiden, därför används flakes exklusivt.
- `flake.nix` är startpunkten
- `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
## För att installera
## 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.
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
```
### Applicera konfiguration
Sedan:
@@ -75,29 +29,12 @@ git clone <repo-url> nixcfg
cd nixcfg
```
Redigera sedan rätt disk i `hosts/kronos/default.nix`:
```bash
vim hosts/kronos/default.nix
```
Applicera disk-layouten:
```bash
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:
```bash
@@ -105,50 +42,41 @@ nixos-generate-config --root /mnt
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:
```bash
nixos-install --flake .#kronos
```
Enrolla sedan TPM-nyckeln innan omstart:
Registrera TPM-nyckeln:
```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
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
Kloning av dotfiles och installation med `stow` görs separat:
```bash
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
När systemet väl är installerat jobbar man oftast så här.
@@ -188,132 +116,3 @@ Kontrollera `ZFS`-snapshots:
```bash
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.

69
flake.lock generated
View File

@@ -20,13 +20,73 @@
"type": "github"
}
},
"dotfiles": {
"inputs": {
"home-manager": [
"home-manager"
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1774564269,
"narHash": "sha256-sdxUQJAc5t5hbQbG0SZ4B3YehTtNiRUqDNzvO/KakZk=",
"path": "/home/love/dotfiles",
"type": "path"
},
"original": {
"path": "/home/love/dotfiles",
"type": "path"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1774561634,
"narHash": "sha256-3q1xsREjqdVIIwQQDZQ9y0YdBzP8gAxdwKoKnZSzJtU=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "7c046c63ac3b467c1d589b99d531da5b6520825a",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"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": {
"locked": {
"lastModified": 1774106199,
"narHash": "sha256-US5Tda2sKmjrg2lNHQL3jRQ6p96cgfWh3J1QBliQ8Ws=",
"lastModified": 1774386573,
"narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "6c9a78c09ff4d6c21d0319114873508a6ec01655",
"rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
"type": "github"
},
"original": {
@@ -39,6 +99,9 @@
"root": {
"inputs": {
"disko": "disko",
"dotfiles": "dotfiles",
"home-manager": "home-manager",
"lolcat++": "lolcat++",
"nixpkgs": "nixpkgs"
}
}

View File

@@ -8,16 +8,45 @@
url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
"lolcat++" = {
url = "github:lolcatpp/lolcatpp";
inputs.nixpkgs.follows = "nixpkgs";
};
dotfiles = {
url = "path:/home/love/dotfiles";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
};
outputs =
inputs@{ nixpkgs, disko, ... }:
inputs@{
nixpkgs,
disko,
home-manager,
dotfiles,
...
}:
{
nixosConfigurations.kronos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { inherit inputs; };
modules = [
disko.nixosModules.disko
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.backupFileExtension = "hm-backup";
home-manager.users.love = import "${dotfiles}/home.nix";
}
./hosts/kronos
];
};

View File

@@ -8,7 +8,7 @@ let
fullName = "Love";
hostName = "Kronos";
homeDir = "/home/${userName}";
installDisk = "/dev/disk/by-id/wwn-0x5001b444a9734c0e";
installDisk = "/dev/disk/by-id/ata-SanDisk_SD8SB8U-256G-1006_173702422853";
in
{
_module.args = {
@@ -27,21 +27,31 @@ in
../../modules/base.nix
../../modules/zfs-root.nix
../../modules/desktop-hyprland.nix
../../modules/bin-bash-wrapper.nix
];
my.binBashWrapper.enable = true;
networking.hostName = hostName;
networking.hostId = "ff0b8826";
services.xserver.videoDrivers = [ "nvidia" ];
hardware.nvidia = {
modesetting.enable = true;
powerManagement.enable = false;
powerManagement.finegrained = false;
open = true;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.stable;
hardware = {
graphics = {
enable32Bit = true;
};
nvidia = {
modesetting.enable = true;
powerManagement.enable = false;
powerManagement.finegrained = false;
open = true;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.stable;
};
};
virtualisation.docker.enable = true;
users.mutableUsers = true;
users.users.${userName} = {
isNormalUser = true;
@@ -52,6 +62,8 @@ in
"render"
"video"
"wheel"
"cdrom"
"docker"
];
shell = pkgs.zsh;
};

View File

@@ -1,3 +1,28 @@
{ ... }:
{
config,
lib,
modulesPath,
...
}:
{
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [
"nvme"
"xhci_pci"
"ahci"
"usbhid"
"usb_storage"
"sd_mod"
"sr_mod"
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -1,4 +1,5 @@
{
inputs,
pkgs,
userName,
...
@@ -26,24 +27,42 @@
};
};
boot.loader.systemd-boot.enable = false;
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.grub = {
boot.loader.systemd-boot = {
enable = true;
configurationLimit = 10;
device = "nodev";
efiSupport = true;
enableCryptodisk = true;
useOSProber = true;
zfsSupport = true;
edk2-uefi-shell.enable = true;
};
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.grub.enable = false;
i18n = rec {
defaultLocale = "en_US.UTF-8";
extraLocales = [ "sv_SE.UTF-8/UTF-8" ];
extraLocaleSettings = {
LC_ADDRESS = defaultLocale;
LC_CTYPE = defaultLocale;
LC_COLLATE = defaultLocale;
LC_IDENTIFICATION = defaultLocale;
LC_MEASUREMENT = defaultLocale;
LC_MESSAGES = defaultLocale;
LC_MONETARY = defaultLocale;
LC_NAME = defaultLocale;
LC_NUMERIC = defaultLocale;
LC_PAPER = defaultLocale;
LC_TELEPHONE = defaultLocale;
LC_TIME = defaultLocale;
};
};
services.xserver.xkb.layout = "se";
time.timeZone = "Europe/Stockholm";
i18n.defaultLocale = "sv_SE.UTF-8";
console = {
font = "Lat2-Terminus16";
earlySetup = true;
font = "ter-v16n";
keyMap = "sv-latin1";
packages = [ pkgs.terminus_font ];
};
networking.useNetworkd = true;
@@ -81,13 +100,19 @@
};
environment.systemPackages = with pkgs; [
inputs."lolcat++".packages.${pkgs.stdenv.hostPlatform.system}.default
file
cowsay
fortune
lolcat
bat
fastfetch
curl
eza
fzf
git
git-lfs
ripgrep
neovim
odt2txt
openssl
@@ -95,7 +120,23 @@
tpm2-tools
unzip
wget
zsh
killall
tealdeer
efibootmgr
nil
gcc
clang
gnumake
cmake
ninja
pkg-config
binutils
gdb
nodejs
rustup
];
security.sudo.wheelNeedsPassword = true;

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, ... }:
{
programs.dconf.enable = true;
programs.hyprland.enable = true;
programs.hyprland = {
enable = true;
xwayland.enable = true;
};
programs.thunar.enable = true;
programs.thunderbird.enable = true;
programs.xwayland.enable = true;
@@ -44,13 +47,21 @@
fonts.packages = with pkgs; [
jetbrains-mono
nerd-fonts.jetbrains-mono
nerd-fonts.symbols-only
noto-fonts
noto-fonts-cjk-sans
noto-fonts-color-emoji
vista-fonts
corefonts
source-han-sans
];
fonts.fontconfig.defaultFonts = {
monospace = [ "JetBrains Mono" ];
monospace = [
"JetBrainsMono Nerd Font"
"JetBrains Mono"
];
sansSerif = [ "Noto Sans" ];
serif = [ "Noto Serif" ];
emoji = [ "Noto Color Emoji" ];
@@ -79,6 +90,7 @@
libsForQt5.qt5ct
libsForQt5.qtstyleplugin-kvantum
mpv
networkmanagerapplet
pavucontrol
papirus-icon-theme
playerctl
@@ -88,7 +100,6 @@
rofi
slurp
socat
telegram-desktop
waybar
wezterm
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