Add support for partitioning btrfs volumes

This commit is contained in:
Manuel Thalmann 2024-12-07 21:14:58 +01:00
parent 4dfeb4f26a
commit d0dbae683d
3 changed files with 138 additions and 18 deletions

View file

@ -105,6 +105,7 @@ in
'' ''
])} ])}
${cfg.diskSetup.scripts.partition} ${cfg.diskSetup.scripts.partition}
${cfg.btrfs.script}
${mountScript} ${mountScript}
${cfg.diskSetup.scripts.swap} ${cfg.diskSetup.scripts.swap}
''; '';

View file

@ -0,0 +1,108 @@
{ lib, config, ... }:
let
inherit (lib) types mkOption;
cfg = config.valhalla.fileSystems.btrfs;
profileType = types.enum [
"raid0"
"raid1"
"raid1c3"
"raid1c4"
"raid5"
"raid6"
"raid10"
"dup"
"single"
];
volumeType = types.submodule (
{ config, name, ... }: {
options = {
mountPoint = mkOption {
type = types.nullOr types.str;
description = "The path to mount the volume to.";
default = null;
};
devices = mkOption {
type = types.listOf types.str;
description = "The devices of the btrfs volume.";
};
label = mkOption {
type = types.nullOr types.str;
description = "The label of the volume.";
default = name;
};
dataProfile = mkOption {
type = types.nullOr profileType;
description = "The data profile.";
default = null;
};
metadataProfile = mkOption {
type = types.nullOr profileType;
description = "The metadata profile.";
default = null;
};
};
}
);
in
{
options = {
valhalla = {
fileSystems.btrfs = {
volumes = mkOption {
type = types.attrsOf volumeType;
description = "The btrfs volumes of the system.";
default = { };
};
script = mkOption {
type = types.str;
description = "The script for creating the btrfs volumes.";
default = lib.strings.concatLines (
builtins.map
(
_: builtins.concatStringsSep " " (
[ "mkfs.btrfs" ] ++
(lib.optionals (_.metadataProfile != null) [ "--metadata" "${_.metadataProfile}" ]) ++
(lib.optionals (_.dataProfile != null) [ "--data" "${_.dataProfile}" ]) ++
(lib.optionals (_.label != null) [ "--label" "${_.label}" ]) ++
_.devices
)
)
(builtins.attrValues cfg.volumes)
);
};
};
};
};
config = {
valhalla = {
linux.programs.btrfs = lib.optionalAttrs
(builtins.any
(_: (builtins.length _.devices) > 1)
(builtins.attrValues cfg.volumes))
{
enable = true;
pools = true;
};
fileSystems.mounts = lib.attrsets.concatMapAttrs
(
name: volume:
if (volume.mountPoint != null) then {
${volume.mountPoint} = {
device = builtins.elemAt volume.devices 0;
fsType = "btrfs";
};
} else { }
)
cfg.volumes;
};
};
}

View file

@ -5,8 +5,11 @@ in {
config = { config = {
valhalla = { valhalla = {
fileSystems.diskSetup.devices = { fileSystems = {
diskSetup.devices = {
OS = { OS = {
path = "/dev/sda";
partitions = { partitions = {
Boot = { Boot = {
index = 1; index = 1;
@ -25,8 +28,16 @@ in {
index = 3; index = 3;
label = lib.mkDefault config.valhalla.boot.label; label = lib.mkDefault config.valhalla.boot.label;
type = "linux"; type = "linux";
format = fs.ext4; };
};
};
};
btrfs = {
volumes = {
OS = {
mountPoint = "/"; mountPoint = "/";
devices = [ "/dev/sda3" "/dev/sdb" ];
}; };
}; };
}; };