diff --git a/example/bcachefs.nix b/example/bcachefs.nix index e1df20e..d400b6b 100644 --- a/example/bcachefs.nix +++ b/example/bcachefs.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "100MiB"; @@ -22,7 +21,6 @@ } { name = "root"; - type = "partition"; start = "100MiB"; end = "100%"; part-type = "primary"; diff --git a/example/boot-raid1.nix b/example/boot-raid1.nix index 139922d..43d68c5 100644 --- a/example/boot-raid1.nix +++ b/example/boot-raid1.nix @@ -10,14 +10,12 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; part-type = "primary"; flags = [ "bios_grub" ]; } { - type = "partition"; name = "ESP"; start = "1MiB"; end = "128MiB"; @@ -29,7 +27,6 @@ }; } { - type = "partition"; name = "mdadm"; start = "128MiB"; end = "100%"; @@ -50,14 +47,12 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; part-type = "primary"; flags = [ "bios_grub" ]; } { - type = "partition"; name = "ESP"; start = "1MiB"; end = "128MiB"; @@ -69,7 +64,6 @@ }; } { - type = "partition"; name = "mdadm"; start = "128MiB"; end = "100%"; @@ -101,7 +95,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "primary"; start = "1MiB"; end = "100%"; diff --git a/example/btrfs-subvolumes.nix b/example/btrfs-subvolumes.nix index 7484961..f08d00b 100644 --- a/example/btrfs-subvolumes.nix +++ b/example/btrfs-subvolumes.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "128MiB"; @@ -23,7 +22,6 @@ } { name = "root"; - type = "partition"; start = "128MiB"; end = "100%"; content = { diff --git a/example/complex.nix b/example/complex.nix index e222339..ad57ef1 100644 --- a/example/complex.nix +++ b/example/complex.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "128MiB"; @@ -32,7 +31,6 @@ format = "gpt"; partitions = [ { - type = "partition"; start = "1M"; end = "100%"; name = "luks"; @@ -60,7 +58,6 @@ format = "gpt"; partitions = [ { - type = "partition"; start = "1M"; end = "100%"; name = "luks"; @@ -90,7 +87,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "bla"; start = "1MiB"; end = "100%"; diff --git a/example/gpt-bios-compat.nix b/example/gpt-bios-compat.nix index c64930e..2bdd6d8 100644 --- a/example/gpt-bios-compat.nix +++ b/example/gpt-bios-compat.nix @@ -11,7 +11,6 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; part-type = "primary"; @@ -19,7 +18,6 @@ } { name = "root"; - type = "partition"; # leave space for the grub aka BIOS boot start = "1M"; end = "100%"; diff --git a/example/hybrid-tmpfs-on-root.nix b/example/hybrid-tmpfs-on-root.nix index 8eef875..7a4ef8f 100644 --- a/example/hybrid-tmpfs-on-root.nix +++ b/example/hybrid-tmpfs-on-root.nix @@ -9,13 +9,11 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; flags = [ "bios_grub" ]; } { - type = "partition"; name = "ESP"; start = "1M"; end = "512M"; @@ -28,7 +26,6 @@ } { name = "nix"; - type = "partition"; start = "512M"; end = "100%"; part-type = "primary"; diff --git a/example/hybrid.nix b/example/hybrid.nix index 92aacf3..aeef6b8 100644 --- a/example/hybrid.nix +++ b/example/hybrid.nix @@ -10,13 +10,11 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; flags = [ "bios_grub" ]; } { - type = "partition"; name = "ESP"; start = "1M"; end = "512M"; @@ -28,7 +26,6 @@ }; } { - type = "partition"; name = "root"; start = "512M"; end = "100%"; diff --git a/example/luks-lvm.nix b/example/luks-lvm.nix index 733333e..e9a8b32 100644 --- a/example/luks-lvm.nix +++ b/example/luks-lvm.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "100MiB"; @@ -24,7 +23,6 @@ }; } { - type = "partition"; name = "luks"; start = "100MiB"; end = "100%"; diff --git a/example/lvm-raid.nix b/example/lvm-raid.nix index cf20b21..aa7490b 100644 --- a/example/lvm-raid.nix +++ b/example/lvm-raid.nix @@ -10,7 +10,6 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "100M"; fs-type = "fat32"; @@ -21,7 +20,6 @@ }; } { - type = "partition"; name = "primary"; start = "100M"; end = "100%"; @@ -42,7 +40,6 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "100M"; fs-type = "fat32"; @@ -53,7 +50,6 @@ }; } { - type = "partition"; name = "primary"; start = "100M"; end = "100%"; diff --git a/example/mdadm.nix b/example/mdadm.nix index efe95c6..ccabe5c 100644 --- a/example/mdadm.nix +++ b/example/mdadm.nix @@ -10,14 +10,12 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; part-type = "primary"; flags = [ "bios_grub" ]; } { - type = "partition"; name = "mdadm"; start = "1MiB"; end = "100%"; @@ -38,14 +36,12 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; part-type = "primary"; flags = [ "bios_grub" ]; } { - type = "partition"; name = "mdadm"; start = "1MiB"; end = "100%"; @@ -67,7 +63,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "primary"; start = "1MiB"; end = "100%"; diff --git a/example/multi-device-no-deps.nix b/example/multi-device-no-deps.nix index a01644b..09b0839 100644 --- a/example/multi-device-no-deps.nix +++ b/example/multi-device-no-deps.nix @@ -10,7 +10,6 @@ partitions = [ { name = "nix"; - type = "partition"; part-type = "primary"; start = "0%"; end = "100%"; @@ -33,7 +32,6 @@ partitions = [ { name = "root"; - type = "partition"; part-type = "primary"; start = "0%"; end = "100%"; diff --git a/example/negative-size.nix b/example/negative-size.nix index 9ec27ab..89d8754 100644 --- a/example/negative-size.nix +++ b/example/negative-size.nix @@ -10,7 +10,6 @@ partitions = [ { name = "nix"; - type = "partition"; part-type = "primary"; start = "0%"; end = "-10MiB"; diff --git a/example/simple-efi.nix b/example/simple-efi.nix index 0a5f2d1..459fdec 100644 --- a/example/simple-efi.nix +++ b/example/simple-efi.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "100MiB"; @@ -22,7 +21,6 @@ } { name = "root"; - type = "partition"; start = "100MiB"; end = "100%"; part-type = "primary"; diff --git a/example/stand-alone/configuration.nix b/example/stand-alone/configuration.nix index 973f3f2..6161cea 100644 --- a/example/stand-alone/configuration.nix +++ b/example/stand-alone/configuration.nix @@ -25,7 +25,6 @@ let partitions = [ { name = "root"; - type = "partition"; part-type = "primary"; start = "1M"; end = "100%"; diff --git a/example/swap.nix b/example/swap.nix index e442b9c..14ec861 100644 --- a/example/swap.nix +++ b/example/swap.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "100MiB"; @@ -22,7 +21,6 @@ } { name = "root"; - type = "partition"; start = "100MiB"; end = "-1G"; part-type = "primary"; @@ -34,7 +32,6 @@ } { name = "swap"; - type = "partition"; start = "-1G"; end = "100%"; part-type = "primary"; diff --git a/example/tmpfs.nix b/example/tmpfs.nix index 8942e9f..cc43115 100644 --- a/example/tmpfs.nix +++ b/example/tmpfs.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "100MiB"; @@ -22,7 +21,6 @@ } { name = "root"; - type = "partition"; start = "100MiB"; end = "100%"; part-type = "primary"; diff --git a/example/with-lib.nix b/example/with-lib.nix index 4500f3e..ed3c19d 100644 --- a/example/with-lib.nix +++ b/example/with-lib.nix @@ -10,7 +10,6 @@ partitions = [ { name = "boot"; - type = "partition"; start = "0"; end = "1M"; part-type = "primary"; @@ -18,7 +17,6 @@ } { name = "root"; - type = "partition"; # leave space for the grub aka BIOS boot start = "1M"; end = "100%"; diff --git a/example/zfs-over-legacy.nix b/example/zfs-over-legacy.nix index 9ca67a8..25d0f02 100644 --- a/example/zfs-over-legacy.nix +++ b/example/zfs-over-legacy.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "1MiB"; end = "100MiB"; @@ -24,7 +23,6 @@ }; } { - type = "partition"; start = "100MiB"; end = "100%"; name = "primary"; diff --git a/example/zfs.nix b/example/zfs.nix index aebb6a3..3700018 100644 --- a/example/zfs.nix +++ b/example/zfs.nix @@ -9,7 +9,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "ESP"; start = "0"; end = "64MiB"; @@ -22,7 +21,6 @@ }; } { - type = "partition"; name = "zfs"; start = "128MiB"; end = "100%"; @@ -42,7 +40,6 @@ format = "gpt"; partitions = [ { - type = "partition"; name = "zfs"; start = "128MiB"; end = "100%"; diff --git a/types/default.nix b/types/default.nix index f0e1909..647eb1e 100644 --- a/types/default.nix +++ b/types/default.nix @@ -342,7 +342,6 @@ rec { btrfs_subvol = ./btrfs_subvol.nix; filesystem = ./filesystem.nix; table = ./table.nix; - partition = ./partition.nix; swap = ./swap.nix; lvm_pv = ./lvm_pv.nix; lvm_vg = ./lvm_vg.nix; diff --git a/types/partition.nix b/types/partition.nix deleted file mode 100644 index 03d585f..0000000 --- a/types/partition.nix +++ /dev/null @@ -1,100 +0,0 @@ -{ config, options, lib, diskoLib, ... }: -{ - options = { - type = lib.mkOption { - type = lib.types.enum [ "partition" ]; - internal = true; - description = "Type"; - }; - part-type = lib.mkOption { - type = lib.types.enum [ "primary" "logical" "extended" ]; - default = "primary"; - description = "Partition type"; - }; - fs-type = lib.mkOption { - type = lib.types.nullOr (lib.types.enum [ "btrfs" "ext2" "ext3" "ext4" "fat16" "fat32" "hfs" "hfs+" "linux-swap" "ntfs" "reiserfs" "udf" "xfs" ]); - default = null; - description = "Filesystem type to use"; - }; - name = lib.mkOption { - type = lib.types.nullOr lib.types.str; - description = "Name of the partition"; - }; - start = lib.mkOption { - type = lib.types.str; - default = "0%"; - description = "Start of the partition"; - }; - end = lib.mkOption { - type = lib.types.str; - default = "100%"; - description = "End of the partition"; - }; - index = lib.mkOption { - type = lib.types.int; - # TODO find a better way to get the index - default = lib.toInt (lib.head (builtins.match ".*entry ([[:digit:]]+)]" config._module.args.name)); - description = "Index of the partition"; - }; - flags = lib.mkOption { - type = lib.types.listOf lib.types.str; - default = [ ]; - description = "Partition flags"; - }; - bootable = lib.mkOption { - type = lib.types.bool; - default = false; - description = "Whether to make the partition bootable"; - }; - content = diskoLib.partitionType; - _meta = lib.mkOption { - internal = true; - readOnly = true; - type = lib.types.functionTo diskoLib.jsonType; - default = dev: - lib.optionalAttrs (config.content != null) (config.content._meta dev); - description = "Metadata"; - }; - _create = diskoLib.mkCreateOption { - inherit config options; - default = { dev, type }: '' - ${lib.optionalString (type == "gpt") '' - parted -s ${dev} -- mkpart ${config.name} ${diskoLib.maybeStr config.fs-type} ${config.start} ${config.end} - ''} - ${lib.optionalString (type == "msdos") '' - parted -s ${dev} -- mkpart ${config.part-type} ${diskoLib.maybeStr config.fs-type} ${diskoLib.maybeStr config.fs-type} ${config.start} ${config.end} - ''} - # ensure /dev/disk/by-path/..-partN exists before continuing - udevadm trigger --subsystem-match=block; udevadm settle - ${lib.optionalString config.bootable '' - parted -s ${dev} -- set ${toString config.index} boot on - ''} - ${lib.concatMapStringsSep "" (flag: '' - parted -s ${dev} -- set ${toString config.index} ${flag} on - '') config.flags} - # ensure further operations can detect new partitions - udevadm trigger --subsystem-match=block; udevadm settle - ${lib.optionalString (config.content != null) (config.content._create {dev = diskoLib.deviceNumbering dev config.index;})} - ''; - }; - _mount = diskoLib.mkMountOption { - inherit config options; - default = { dev }: - lib.optionalAttrs (config.content != null) (config.content._mount { dev = diskoLib.deviceNumbering dev config.index; }); - }; - _config = lib.mkOption { - internal = true; - readOnly = true; - default = dev: - lib.optional (config.content != null) (config.content._config (diskoLib.deviceNumbering dev config.index)); - description = "NixOS configuration"; - }; - _pkgs = lib.mkOption { - internal = true; - readOnly = true; - type = lib.types.functionTo (lib.types.listOf lib.types.package); - default = pkgs: lib.optionals (config.content != null) (config.content._pkgs pkgs); - description = "Packages"; - }; - }; -} diff --git a/types/table.nix b/types/table.nix index b47ed29..0d9fb14 100644 --- a/types/table.nix +++ b/types/table.nix @@ -12,7 +12,51 @@ description = "The kind of partition table"; }; partitions = lib.mkOption { - type = lib.types.listOf subTypes.partition; + type = lib.types.listOf (lib.types.submodule ({ config, ... }: { + options = { + part-type = lib.mkOption { + type = lib.types.enum [ "primary" "logical" "extended" ]; + default = "primary"; + description = "Partition type"; + }; + fs-type = lib.mkOption { + type = lib.types.nullOr (lib.types.enum [ "btrfs" "ext2" "ext3" "ext4" "fat16" "fat32" "hfs" "hfs+" "linux-swap" "ntfs" "reiserfs" "udf" "xfs" ]); + default = null; + description = "Filesystem type to use"; + }; + name = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = "Name of the partition"; + }; + start = lib.mkOption { + type = lib.types.str; + default = "0%"; + description = "Start of the partition"; + }; + end = lib.mkOption { + type = lib.types.str; + default = "100%"; + description = "End of the partition"; + }; + index = lib.mkOption { + type = lib.types.int; + # TODO find a better way to get the index + default = lib.toInt (lib.head (builtins.match ".*entry ([[:digit:]]+)]" config._module.args.name)); + description = "Index of the partition"; + }; + flags = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "Partition flags"; + }; + bootable = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Whether to make the partition bootable"; + }; + content = diskoLib.partitionType; + }; + })); default = [ ]; description = "List of partitions to add to the partition table"; }; @@ -21,21 +65,43 @@ readOnly = true; type = lib.types.functionTo diskoLib.jsonType; default = dev: - diskoLib.deepMergeMap (partition: partition._meta dev) config.partitions; + lib.foldr lib.recursiveUpdate {} (lib.imap (index: partition: + lib.optionalAttrs (partition.content != null) (partition.content._meta dev) + ) config.partitions); description = "Metadata"; }; _create = diskoLib.mkCreateOption { inherit config options; default = { dev }: '' parted -s ${dev} -- mklabel ${config.format} - ${lib.concatMapStrings (partition: partition._create {inherit dev; type = config.format;} ) config.partitions} + ${lib.concatStrings (lib.imap (index: partition: '' + ${lib.optionalString (config.format == "gpt") '' + parted -s ${dev} -- mkpart ${partition.name} ${diskoLib.maybeStr partition.fs-type} ${partition.start} ${partition.end} + ''} + ${lib.optionalString (config.format == "msdos") '' + parted -s ${dev} -- mkpart ${partition.part-type} ${diskoLib.maybeStr partition.fs-type} ${diskoLib.maybeStr partition.fs-type} ${partition.start} ${partition.end} + ''} + # ensure /dev/disk/by-path/..-partN exists before continuing + udevadm trigger --subsystem-match=block; udevadm settle + ${lib.optionalString partition.bootable '' + parted -s ${dev} -- set ${toString index} boot on + ''} + ${lib.concatMapStringsSep "" (flag: '' + parted -s ${dev} -- set ${toString index} ${flag} on + '') partition.flags} + # ensure further operations can detect new partitions + udevadm trigger --subsystem-match=block; udevadm settle + ${lib.optionalString (partition.content != null) (partition.content._create { dev = diskoLib.deviceNumbering dev index; })} + '') config.partitions)} ''; }; _mount = diskoLib.mkMountOption { inherit config options; default = { dev }: let - partMounts = diskoLib.deepMergeMap (partition: partition._mount { inherit dev; }) config.partitions; + partMounts = lib.foldr lib.recursiveUpdate {} (lib.imap (index: partition: + lib.optionalAttrs (partition.content != null) (partition.content._mount { dev = diskoLib.deviceNumbering dev index; }) + ) config.partitions); in { dev = partMounts.dev or ""; @@ -46,7 +112,9 @@ internal = true; readOnly = true; default = dev: - map (partition: partition._config dev) config.partitions; + lib.imap (index: partition: + lib.optional (partition.content != null) (partition.content._config (diskoLib.deviceNumbering dev index)) + ) config.partitions; description = "NixOS configuration"; }; _pkgs = lib.mkOption { @@ -54,7 +122,9 @@ readOnly = true; type = lib.types.functionTo (lib.types.listOf lib.types.package); default = pkgs: - [ pkgs.parted pkgs.systemdMinimal ] ++ lib.flatten (map (partition: partition._pkgs pkgs) config.partitions); + [ pkgs.parted pkgs.systemdMinimal ] ++ lib.flatten (map (partition: + lib.optional (partition.content != null) (partition.content._pkgs pkgs) + ) config.partitions); description = "Packages"; }; };