Compare commits

...

11 Commits

Author SHA1 Message Date
Jan
12a4ba0482 Merge pull request 'Add disko support' (#2) from disko into main
Reviewed-on: Jan/dotfiles#2
2025-05-29 16:33:31 +00:00
Jan-Bulthuis
68c241f31a Changed location of some persistence files 2025-05-29 18:32:08 +02:00
Jan-Bulthuis
81c37abadd Fixed impermanence not mounting persist 2025-05-29 17:05:15 +02:00
Jan-Bulthuis
85c962fd6d Updated REAME.md 2025-05-29 17:04:58 +02:00
Jan-Bulthuis
b0a8874a93 Set up impermanence 2025-05-29 16:34:24 +02:00
Jan-Bulthuis
01021d179d Fixed hold command 2025-05-29 15:49:24 +02:00
Jan-Bulthuis
b8a607c3d0 Fixed hold command 2025-05-29 15:31:46 +02:00
Jan-Bulthuis
793015646d Updated base vm config 2025-05-29 15:10:10 +02:00
Jan-Bulthuis
43f472fe88 Fixed reference to incorrect zfs pool 2025-05-29 14:36:07 +02:00
Jan-Bulthuis
51ab89cd98 Better disko setup 2025-05-29 14:19:19 +02:00
Jan-Bulthuis
f0d56df191 Addid disko config for zfs 2025-05-29 13:06:13 +02:00
9 changed files with 234 additions and 18 deletions

View File

@ -2,6 +2,10 @@
My NixOS configuration.
## Usage
## Installation
Clone the repository to some directory. And build with `sudo nixos-rebuild switch --flake /directory/containing/flake.nix/`.
For disk configuration we use disko, this means that installing the system from the configuration is just a single command:
```
sudo nix --experimental-features "nix-command flakes" run "github:nix-community/disko/latest#disko-install" -- --flake git+https://git.bulthuis.dev/Jan/dotfiles#<hostname> --disk main /dev/sda
```

37
flake.lock generated
View File

@ -1,5 +1,25 @@
{
"nodes": {
"disko": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1748225455,
"narHash": "sha256-AzlJCKaM4wbEyEpV3I/PUq5mHnib2ryEy32c+qfj6xk=",
"owner": "nix-community",
"repo": "disko",
"rev": "a894f2811e1ee8d10c50560551e50d6ab3c392ba",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "disko",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
@ -54,6 +74,21 @@
"type": "github"
}
},
"impermanence": {
"locked": {
"lastModified": 1737831083,
"narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=",
"owner": "nix-community",
"repo": "impermanence",
"rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "impermanence",
"type": "github"
}
},
"nix-minecraft": {
"inputs": {
"flake-compat": "flake-compat",
@ -114,7 +149,9 @@
},
"root": {
"inputs": {
"disko": "disko",
"home-manager": "home-manager",
"impermanence": "impermanence",
"nix-minecraft": "nix-minecraft",
"nix-modpack": "nix-modpack",
"nixpkgs": "nixpkgs"

View File

@ -2,9 +2,15 @@
description = "System configuration for NixOS";
inputs = {
# General inputs
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
disko.url = "github:nix-community/disko";
disko.inputs.nixpkgs.follows = "nixpkgs";
impermanence.url = "github:nix-community/impermanence";
# For Minecraft VM
nix-minecraft.url = "github:Jan-Bulthuis/nix-minecraft";
nix-minecraft.inputs.nixpkgs.follows = "nixpkgs";
nix-modpack.url = "github:Jan-Bulthuis/nix-modpack";

View File

@ -0,0 +1,35 @@
{ lib, config, ... }:
with lib;
let
cfg = config.modules.impermanence;
in
{
options.modules.impermanence = {
enable = mkEnableOption "Impermanence";
directories = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
Directories that should be stored in persistent storage.
'';
};
files = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
Files that should be stored in persistent storage.
'';
};
};
config = mkIf cfg.enable {
home.persistence."/persist/home/${config.home.username}" = {
enable = true;
hideMounts = true;
allowOther = true;
directories = cfg.directories;
files = cfg.files;
};
};
}

24
modules/nixos/disko.nix Normal file
View File

@ -0,0 +1,24 @@
{
lib,
config,
inputs,
...
}:
with lib;
let
cfg = config.modules.disko;
profile = import "${inputs.self}/profiles/disko/${cfg.profile}.nix";
in
{
options.modules.disko = {
enable = mkEnableOption "Disko module";
profile = mkOption {
type = types.str;
default = null;
description = "The profile to use for the disko module.";
};
};
config = mkIf cfg.enable { disko.devices = profile.disko.devices; };
}

View File

@ -0,0 +1,46 @@
{ lib, config, ... }:
with lib;
let
cfg = config.modules.impermanence;
in
{
options.modules.impermanence = {
enable = mkEnableOption "Impermanence";
directories = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
Directories that should be stored in persistent storage.
'';
};
files = mkOption {
type = types.listOf types.str;
default = [ ];
description = ''
Files that should be stored in persistent storage.
'';
};
resetScript = mkOption {
type = types.lines;
description = ''
Script to run on boot that resets the root partition.
'';
};
};
config = mkIf cfg.enable {
fileSystems."/persist".neededForBoot = true;
boot.initrd.postResumeCommands = mkAfter cfg.resetScript;
# For home-manager persistence
programs.fuse.userAllowOther = true;
environment.persistence."/persist/system" = {
enable = true;
hideMounts = true;
directories = cfg.directories;
files = cfg.files;
};
};
}

56
profiles/disko/vm.nix Normal file
View File

@ -0,0 +1,56 @@
{
disko.devices = {
disk = {
main = {
type = "disk";
content = {
type = "gpt";
partitions = {
boot = {
size = "512M";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "umask=0077" ];
};
};
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "tank";
};
};
};
};
};
};
zpool = {
tank = {
type = "zpool";
rootFsOptions = {
compression = "zstd";
};
mountpoint = null;
postCreateHook = "zfs snapshot -r tank@blank && zfs hold -r blank tank@blank";
datasets = {
root = {
type = "zfs_fs";
mountpoint = "/";
};
nix = {
type = "zfs_fs";
mountpoint = "/nix";
};
persist = {
type = "zfs_fs";
mountpoint = "/persist";
};
};
};
};
};
}

View File

@ -19,6 +19,14 @@ in
modules = {
bootloader.enable = mkDefault true;
ssh.enable = mkDefault true;
# Setup sensible default persistent data
impermanence.directories = [
"/var/lib/nixos"
];
impermanence.files = [
"/etc/shadow"
];
};
# Localization

View File

@ -19,14 +19,26 @@ in
# Enabled modules
modules = {
profiles.base.enable = true;
disko = {
enable = true;
profile = "vm";
};
impermanence = {
enable = true;
resetScript = ''
# Revert to the blank state for the root directory
zfs rollback -r tank/root@blank
'';
};
ssh.enable = true;
};
# Admin users
users.users.local = {
initialPassword = "local";
extraGroups = [ "wheel" ];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKxoQSxfYqf9ITN8Fhckk8WbY4dwtBAXOhC9jxihJvq jan@bulthuis.dev"
"ssh-ed25519 jan@bulthuis.dev"
];
};
@ -36,6 +48,9 @@ in
# Machine platform
nixpkgs.hostPlatform = "x86_64-linux";
# Set hostid for ZFS
networking.hostId = "deadbeef";
# Hardware configuration
hardware.enableRedistributableFirmware = true;
boot.initrd.availableKernelModules = [
@ -51,21 +66,6 @@ in
boot.extraModulePackages = [ ];
hardware.cpu.intel.updateMicrocode = true;
# Filesystems
fileSystems."/" = {
device = "/dev/disk/by-partlabel/root";
fsType = "ext4";
};
fileSystems."/boot" = {
device = "/dev/disk/by-partlabel/EFI";
fsType = "vfat";
options = [
"fmask=0077"
"dmask=0077"
];
};
# Swapfile
swapDevices = [
{