feat: fixed more missing datasets

This commit is contained in:
Leyla Becker 2026-03-07 14:33:08 -06:00
parent 1145703cfe
commit 2f7bbf3e1c
5 changed files with 65 additions and 4 deletions

View file

@ -3,5 +3,6 @@
imports = [ imports = [
./configuration.nix ./configuration.nix
./hardware-configuration.nix ./hardware-configuration.nix
./legacy-storage.nix
]; ];
} }

View file

@ -0,0 +1,51 @@
# Legacy storage configuration for emergent
# This file manually defines ZFS datasets matching the existing on-disk layout
# to allow incremental migration to the new storage module (generateBase = true).
#
# Current on-disk dataset layout:
# rpool/local/ - parent (canmount=off)
# rpool/local/system/nix - nix store
# rpool/local/system/root - root filesystem
#
# Migration plan:
# Phase 1: Rename datasets on disk (boot from live USB)
# zfs rename -p rpool/local/system/nix rpool/persist/local/nix
# zfs rename rpool/local rpool/persist/local
# # This moves: local/system/root -> persist/local/root (need to rename after)
# # Actually, since local/system/root needs to become persist/local/root:
# zfs rename rpool/persist/local/system/root rpool/persist/local/root
# zfs destroy rpool/persist/local/system # now empty
# # Recreate blank snapshot:
# zfs destroy rpool/persist/local/root@blank
# zfs snapshot rpool/persist/local/root@blank
#
# Phase 2: Delete this file, remove its import from default.nix, rebuild.
{...}: {
# Disable automatic base dataset generation so we can define them manually
storage.generateBase = false;
# Manually define ZFS datasets matching the existing on-disk layout
storage.zfs.datasets = {
"local" = {
type = "zfs_fs";
mount = null;
};
"local/system/nix" = {
type = "zfs_fs";
mount = "/nix";
atime = "off";
relatime = "off";
snapshot = {
autoSnapshot = false;
};
};
"local/system/root" = {
type = "zfs_fs";
mount = "/";
snapshot = {
blankSnapshot = true;
autoSnapshot = true;
};
};
};
}

View file

@ -153,7 +153,7 @@ in {
config.storage.datasets.replicate) config.storage.datasets.replicate)
]; ];
}) })
(lib.mkIf (config.storage.zfs.enable && !config.storage.impermanence.enable) { (lib.mkIf (config.storage.zfs.enable && !config.storage.impermanence.enable && config.storage.generateBase) {
storage.datasets = { storage.datasets = {
# Base organizational datasets (only needed when impermanence is disabled) # Base organizational datasets (only needed when impermanence is disabled)
local = { local = {

View file

@ -9,6 +9,12 @@ args @ {
# Hash function for disk names (max 27 chars to fit GPT limitations) # Hash function for disk names (max 27 chars to fit GPT limitations)
hashDisk = drive: (builtins.substring 0 27 (builtins.hashString "sha256" drive)); hashDisk = drive: (builtins.substring 0 27 (builtins.hashString "sha256" drive));
# Map "stripe" to "" for disko compatibility (disko uses "" for stripe mode)
diskoPoolMode =
if config.storage.zfs.pool.mode == "stripe"
then ""
else config.storage.zfs.pool.mode;
# Helper to flatten vdevs into list of devices with names # Helper to flatten vdevs into list of devices with names
allVdevDevices = lib.lists.flatten (builtins.map ( allVdevDevices = lib.lists.flatten (builtins.map (
vdev: vdev:
@ -260,7 +266,7 @@ in {
type = "topology"; type = "topology";
vdev = vdev =
builtins.map (vdev: { builtins.map (vdev: {
mode = config.storage.zfs.pool.mode; mode = diskoPoolMode;
members = builtins.map (device: hashDisk device.device) vdev; members = builtins.map (device: hashDisk device.device) vdev;
}) })
config.storage.zfs.pool.vdevs; config.storage.zfs.pool.vdevs;

View file

@ -409,10 +409,13 @@ in {
); );
# Post resume commands to rollback user home datasets to blank snapshots # Post resume commands to rollback user home datasets to blank snapshots
boot.initrd.postResumeCommands = lib.mkAfter ( # Only add these when generateBase is true -- when false, the legacy
# storage config is responsible for providing rollback commands with
# the correct (old) dataset paths.
boot.initrd.postResumeCommands = lib.mkIf config.storage.generateBase (lib.mkAfter (
lib.strings.concatLines (builtins.map (user: "zfs rollback -r rpool/ephemeral/home/${user.name}@blank") lib.strings.concatLines (builtins.map (user: "zfs rollback -r rpool/ephemeral/home/${user.name}@blank")
normalUsers) normalUsers)
); ));
# TODO: I don't think we need this anymore but I have not tested it # TODO: I don't think we need this anymore but I have not tested it
# Create persist home directories with proper permissions # Create persist home directories with proper permissions