feat: fixed more missing datasets
This commit is contained in:
parent
1145703cfe
commit
2f7bbf3e1c
5 changed files with 65 additions and 4 deletions
|
|
@ -3,5 +3,6 @@
|
||||||
imports = [
|
imports = [
|
||||||
./configuration.nix
|
./configuration.nix
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
|
./legacy-storage.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
51
configurations/nixos/emergent/legacy-storage.nix
Normal file
51
configurations/nixos/emergent/legacy-storage.nix
Normal 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;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue