summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlassulus <lassulus@lassul.us>2022-08-29 11:45:19 +0200
committerlassulus <lassulus@lassul.us>2022-09-02 11:14:58 +0200
commitdcb0c42857a2ada8754d4514d4b8c4c1d67ab3f5 (patch)
treed4c0f34db5bb060d9133fc03f57e68e46fdb86ff
parentadf901d58155ca268d15351fff164d3ef38a0890 (diff)
reimplement disko using the nixos type system
This should make the code cleaner, more robust and errors should be clearer. we also changed the configuration format a bit.
-rw-r--r--default.nix326
-rw-r--r--example/btrfs-subvolumes.nix43
-rw-r--r--example/complex.nix194
-rw-r--r--example/luks-lvm.nix130
-rw-r--r--example/lvm-raid.nix112
-rw-r--r--example/mdadm.nix72
-rw-r--r--example/zfs-over-legacy.nix63
-rw-r--r--example/zfs.nix53
-rw-r--r--tests/complex.nix20
-rw-r--r--tests/lib.nix2
-rw-r--r--types.nix1058
11 files changed, 1542 insertions, 531 deletions
diff --git a/default.nix b/default.nix
index 51b70f5..9febd80 100644
--- a/default.nix
+++ b/default.nix
@@ -1,312 +1,22 @@
-{ lib ? import <nixpkgs/lib> }:
-with lib;
-with builtins;
-
+{ lib ? import <nixpkgs/lib>
+, pkgs ? import <nixpkgs> {}
+}:
let
-
- helper.find-device = device:
- let
- environment = helper.device-id device;
- in
- # DEVICE points already to /dev/disk, so we don't handle it via /dev/disk/by-path
- if hasPrefix "/dev/disk" device then
- "${environment}='${device}'"
- else ''
- ${environment}=$(for x in $(find /dev/disk/{by-path,by-id}/); do
- dev=$x
- if [ "$(readlink -f $x)" = "$(readlink -f '${device}')" ]; then
- target=$dev
- break
- fi
- done
- if test -z ''${target+x}; then
- echo 'unable to find path of disk: ${device}, bailing out' >&2
- exit 1
- else
- echo $target
- fi)
- '';
-
- helper.device-id = device: "DEVICE${builtins.substring 0 5 (builtins.hashString "sha1" device)}";
-
- config-f = q: x: config.${x.type} q x;
-
- config.filesystem = q: x: {
- fileSystems.${x.mountpoint} = {
- device = q.device;
- fsType = x.format;
- ${if x ? options then "options" else null} = x.options;
- };
- };
-
- config.zfs_filesystem = q: x: {
- fileSystems.${x.mountpoint} = {
- device = q.device;
- fsType = "zfs";
+ types = import ./types.nix { inherit pkgs; };
+ eval = cfg: lib.evalModules {
+ modules = lib.singleton {
+ # _file = toString input;
+ imports = lib.singleton { topLevel.devices = cfg; };
+ options = {
+ topLevel = lib.mkOption {
+ type = types.topLevel;
+ };
+ };
};
};
-
- config.devices = q: x:
- foldl' recursiveUpdate { } (mapAttrsToList (name: config-f { device = "/dev/${name}"; }) x.content);
-
- config.luks = q: x: {
- boot.initrd.luks.devices.${x.name}.device = q.device;
- } // config-f { device = "/dev/mapper/${x.name}"; } x.content;
-
- config.lvm_lv = q: x:
- config-f { device = "/dev/${q.vgname}/${q.name}"; } x.content;
-
- config.lvm_vg = q: x:
- foldl' recursiveUpdate { } (mapAttrsToList (name: config-f { inherit name; vgname = x.name; }) x.lvs);
-
- config.noop = q: x: { };
-
- config.partition = q: x:
- config-f { device = q.device + toString q.index; } x.content;
-
- config.table = q: x:
- foldl' recursiveUpdate { } (imap (index: config-f (q // { inherit index; })) x.partitions);
-
-
- create-f = q: x: create.${x.type} q x;
-
- create.btrfs = q: x: ''
- mkfs.btrfs ${q.device}
- ${lib.optionalString (!isNull x.subvolumes or null) ''
- MNTPOINT=$(mktemp -d)
- (
- mount ${q.device} "$MNTPOINT"
- trap 'umount $MNTPOINT; rm -rf $MNTPOINT' EXIT
- ${concatMapStringsSep "\n" (subvolume: "btrfs subvolume create \"$MNTPOINT\"/${subvolume}") x.subvolumes}
- )
- ''}
- '';
-
- create.filesystem = q: x: ''
- mkfs.${x.format} \
- ${lib.optionalString (!isNull x.extraArgs or null) x.extraArgs} \
- ${q.device}
- '';
-
- create.devices = q: x:
- let
- raid-devices = lib.filterAttrs (_: dev: dev.type == "mdadm" || dev.type == "zpool" || dev.type == "lvm_vg") x.content;
- other-devices = lib.filterAttrs (_: dev: dev.type != "mdadm" && dev.type != "zpool" && dev.type != "lvm_vg") x.content;
- in
- ''
- ${concatStrings (mapAttrsToList (name: create-f { device = "/dev/${name}"; }) other-devices)}
- ${concatStrings (mapAttrsToList (name: create-f { device = "/dev/${name}"; name = name; }) raid-devices)}
- '';
-
- create.mdraid = q: x: ''
- RAIDDEVICES_N_${x.name}=$((''${RAIDDEVICES_N_${x.name}:-0}+1))
- RAIDDEVICES_${x.name}="''${RAIDDEVICES_${x.name}:-}${q.device} "
- '';
-
- create.mdadm = q: x: ''
- echo 'y' | mdadm --create /dev/md/${q.name} --level=${toString x.level or 1} --raid-devices=''${RAIDDEVICES_N_${q.name}} ''${RAIDDEVICES_${q.name}}
- udevadm trigger --subsystem-match=block; udevadm settle
- ${create-f { device = "/dev/md/${q.name}"; } x.content}
- '';
-
- create.luks = q: x: ''
- cryptsetup -q luksFormat ${q.device} ${if builtins.hasAttr "keyfile" x then x.keyfile else ""} ${toString (x.extraArgs or [])}
- cryptsetup luksOpen ${q.device} ${x.name} ${if builtins.hasAttr "keyfile" x then "--key-file " + x.keyfile else ""}
- ${create-f { device = "/dev/mapper/${x.name}"; } x.content}
- '';
-
- create.lvm_pv = q: x: ''
- pvcreate ${q.device}
- LVMDEVICES_${x.vg}="''${LVMDEVICES_${x.vg}:-}${q.device} "
- '';
-
- create.lvm_lv = q: x: ''
- lvcreate \
- ${if hasInfix "%" x.size then "-l" else "-L"} ${x.size} \
- -n ${q.name} \
- ${lib.optionalString (!isNull x.lvm_type or null) "--type=${x.lvm_type}"} \
- ${lib.optionalString (!isNull x.extraArgs or null) x.extraArgs} \
- ${q.vgname}
- ${create-f { device = "/dev/${q.vgname}/${q.name}"; } x.content}
- '';
-
- create.lvm_vg = q: x: ''
- vgcreate ${q.name} $LVMDEVICES_${q.name}
- ${concatStrings (mapAttrsToList (name: create-f { inherit name; vgname = q.name; }) x.lvs)}
- '';
-
- create.noop = q: x: "";
-
- create.partition = q: x:
- let
- env = helper.device-id q.device;
- in
- ''
- parted -s "''${${env}}" mkpart ${x.part-type} ${x.fs-type or ""} ${x.start} ${x.end}
- # ensure /dev/disk/by-path/..-partN exists before continuing
- udevadm trigger --subsystem-match=block; udevadm settle
- ${optionalString (x.bootable or false) ''
- parted -s "''${${env}}" set ${toString q.index} boot on
- ''}
- ${concatMapStringsSep "" (flag: ''
- parted -s "''${${env}}" set ${toString q.index} ${flag} on
- '') (x.flags or [])}
- ${create-f { device = "\"\${${env}}\"-part" + toString q.index; } x.content}
- '';
-
- create.table = q: x: ''
- ${helper.find-device q.device}
- parted -s "''${${helper.device-id q.device}}" mklabel ${x.format}
- ${concatStrings (imap (index: create-f (q // { inherit index; })) x.partitions)}
- '';
-
- create.zfs = q: x: ''
- ZFSDEVICES_${x.pool}="''${ZFSDEVICES_${x.pool}:-}${q.device} "
- '';
-
- create.zfs_filesystem = q: x: ''
- zfs create ${q.pool}/${x.name} \
- ${lib.optionalString (isAttrs x.options or null) (concatStringsSep " " (mapAttrsToList (n: v: "-o ${n}=${v}") x.options))}
- '';
-
- create.zfs_volume = q: x: ''
- zfs create ${q.pool}/${x.name} \
- -V ${x.size} \
- ${lib.optionalString (isAttrs x.options or null) (concatStringsSep " " (mapAttrsToList (n: v: "-o ${n}=${v}") x.options))}
- udevadm trigger --subsystem-match=block; udevadm settle
- ${create-f { device = "/dev/zvol/${q.pool}/${x.name}"; } x.content}
- '';
-
- create.zpool = q: x: ''
- zpool create ${q.name} \
- ${lib.optionalString (!isNull (x.mode or null) && x.mode != "stripe") x.mode} \
- ${lib.optionalString (isAttrs x.options or null) (concatStringsSep " " (mapAttrsToList (n: v: "-o ${n}=${v}") x.options))} \
- ${lib.optionalString (isAttrs x.rootFsOptions or null) (concatStringsSep " " (mapAttrsToList (n: v: "-O ${n}=${v}") x.rootFsOptions))} \
- ''${ZFSDEVICES_${q.name}}
- ${concatMapStrings (create-f (q // { pool = q.name; })) x.datasets}
- '';
-
-
- mount-f = q: x: mount.${x.type} q x;
-
- mount.filesystem = q: x: {
- fs.${x.mountpoint} = ''
- if ! findmnt ${q.device} "/mnt${x.mountpoint}" > /dev/null 2>&1; then
- mount ${q.device} "/mnt${x.mountpoint}" \
- -o X-mount.mkdir \
- ${lib.optionalString (isList x.mountOptions or null) (concatStringsSep " " x.mountOptions)}
- fi
- '';
- };
-
- mount.zfs_filesystem = q: x:
- optionalAttrs ((x.options.mountpoint or "") != "none")
- (mount.filesystem (q // { device = q.dataset; }) (x // { mountOptions = [
- (lib.optionalString ((x.options.mountpoint or "") != "legacy") "-o zfsutil")
- "-t zfs"
- ]; }));
-
- mount.btrfs = mount.filesystem;
-
- mount.devices = q: x:
- let
- z = foldl' recursiveUpdate { } (mapAttrsToList (name: mount-f { device = "/dev/${name}"; inherit name; }) x.content);
- # attrValues returns values sorted by name. This is important, because it
- # ensures that "/" is processed before "/foo" etc.
- in
- ''
- ${optionalString (hasAttr "table" z) (concatStringsSep "\n" (attrValues z.table))}
- ${optionalString (hasAttr "luks" z) (concatStringsSep "\n" (attrValues z.luks))}
- ${optionalString (hasAttr "lvm" z) (concatStringsSep "\n" (attrValues z.lvm))}
- ${optionalString (hasAttr "zpool" z) (concatStringsSep "\n" (attrValues z.zpool))}
- ${optionalString (hasAttr "zfs" z) (concatStringsSep "\n" (attrValues z.zfs))}
- ${optionalString (hasAttr "fs" z) (concatStringsSep "\n" (attrValues z.fs))}
- '';
-
- mount.luks = q: x: (
- recursiveUpdate
- (mount-f { device = "/dev/mapper/${x.name}"; } x.content)
- {
- luks.${q.device} = ''
- cryptsetup status ${x.name} >/dev/null 2>/dev/null || cryptsetup luksOpen ${q.device} ${x.name} ${if builtins.hasAttr "keyfile" x then "--key-file " + x.keyfile else ""}
- '';
- }
- );
-
- mount.lvm_lv = q: x:
- mount-f { device = "/dev/${q.vgname}/${q.name}"; } x.content;
-
- mount.lvm_vg = q: x: (
- recursiveUpdate
- (foldl' recursiveUpdate { } (mapAttrsToList (name: mount-f { inherit name; vgname = q.name; }) x.lvs))
- {
- lvm.${q.device} = ''
- vgchange -a y
- '';
- }
- );
-
- mount.lvm_pv = mount.noop;
-
- mount.noop = q: x: { };
-
- mount.mdadm = q: x:
- mount-f { device = "/dev/md/${q.name}"; } x.content;
- mount.mdraid = mount.noop;
-
- mount.partition = q: x:
- mount-f { device = "\"\${${q.device}}\"-part" + toString q.index; } x.content;
-
- mount.table = q: x: (
- recursiveUpdate
- (foldl' recursiveUpdate { } (imap (index: mount-f (q // { inherit index; device = helper.device-id q.device; })) x.partitions))
- { table.${q.device} = helper.find-device q.device; }
- );
-
- mount.zfs = mount.noop;
-
- mount.zpool = q: x:
- let
- datasets = [{
- inherit (q) name;
- type = "zfs_filesystem";
- dataset = q.name;
- mountpoint = x.mountpoint or "/${q.name}";
- options = q.rootFsOptions or { };
- }] ++ x.datasets;
- in
- recursiveUpdate
- (foldl' recursiveUpdate { }
- (
- (map
- (x: mount-f
- ({
- dataset = x.dataset or "${q.name}/${x.name}";
- mountpoint = x.mountpoint or "/${q.name}/${x.name}";
- } // q)
- x)
- datasets)
- )
- )
- {
- zpool.${q.device} = ''
- zpool list '${q.name}' >/dev/null 2>/dev/null || zpool import '${q.name}'
- '';
- };
-
- mount.zfs_volume = q: x:
- mount-f { device = "/dev/zvol/${q.dataset}"; } x.content;
-
-in
-{
- config = config-f { };
- create = cfg: ''
- set -efux
- ${create-f {} cfg}
- '';
- mount = cfg: ''
- set -efux
- ${mount-f {} cfg}
- '';
-
+in {
+ types = types;
+ create = cfg: (eval cfg).config.topLevel.create;
+ mount = cfg: (eval cfg).config.topLevel.mount;
+ config = cfg: (eval cfg).config.topLevel.config;
}
diff --git a/example/btrfs-subvolumes.nix b/example/btrfs-subvolumes.nix
index 0124c86..83ea71e 100644
--- a/example/btrfs-subvolumes.nix
+++ b/example/btrfs-subvolumes.nix
@@ -1,25 +1,28 @@
{
- type = "devices";
- content = {
+ disk = {
vdb = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- part-type = "primary";
- start = "0%";
- end = "100%";
- content = {
- type = "btrfs";
- mountpoint = "/";
- subvolumes = [
- "/home"
- "/test"
- ];
- };
- }
- ];
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ name = "root";
+ type = "partition";
+ start = "0%";
+ end = "100%";
+ content = {
+ type = "btrfs";
+ mountpoint = "/";
+ subvolumes = [
+ "/home"
+ "/test"
+ ];
+ };
+ }
+ ];
+ };
};
};
}
diff --git a/example/complex.nix b/example/complex.nix
new file mode 100644
index 0000000..078f9c5
--- /dev/null
+++ b/example/complex.nix
@@ -0,0 +1,194 @@
+{
+ disk = {
+ disk1 = {
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ start = "0";
+ end = "1M";
+ name = "grub";
+ flags = ["bios_grub"];
+ }
+ {
+ type = "partition";
+ start = "1M";
+ end = "100%";
+ name = "luks";
+ bootable = true;
+ content = {
+ type = "luks";
+ name = "crypted1";
+ keyFile = "/tmp/secret.key";
+ extraArgs = [
+ "--hash sha512"
+ "--iter-time 5000"
+ ];
+ content = {
+ type = "lvm_pv";
+ vg = "pool";
+ };
+ };
+ }
+ ];
+ };
+ };
+ disk2 = {
+ type = "disk";
+ device = "/dev/vdc";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ start = "0";
+ end = "1M";
+ name = "grub";
+ flags = ["bios_grub"];
+ }
+ {
+ type = "partition";
+ start = "1M";
+ end = "100%";
+ name = "luks";
+ bootable = true;
+ content = {
+ type = "luks";
+ name = "crypted2";
+ keyFile = "/tmp/secret.key";
+ extraArgs = [
+ "--hash sha512"
+ "--iter-time 5000"
+ ];
+ content = {
+ type = "lvm_pv";
+ vg = "pool";
+ };
+ };
+ }
+ ];
+ };
+ };
+ };
+ mdadm = {
+ raid1 = {
+ type = "mdadm";
+ level = 1;
+ content = {
+ type = "table";
+ format = "msdos";
+ partitions = [
+ {
+ type = "partition";
+ name = "xfs";
+ start = "1MiB";
+ end = "100%";
+ content = {
+ type = "filesystem";
+ format = "xfs";
+ mountpoint = "/xfs_mdadm_lvm";
+ };
+ }
+ ];
+ };
+ };
+ };
+ lvm_vg = {
+ pool = {
+ type = "lvm_vg";
+ lvs = {
+ root = {
+ type = "lvm_lv";
+ size = "10M";
+ lvm_type = "mirror";
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/ext4_on_lvm";
+ options = [
+ "defaults"
+ ];
+ };
+ };
+ raid1 = {
+ type = "lvm_lv";
+ size = "30M";
+ lvm_type = "raid0";
+ content = {
+ type = "mdraid";
+ name = "raid1";
+ };
+ };
+ raid2 = {
+ type = "lvm_lv";
+ size = "30M";
+ lvm_type = "raid0";
+ content = {
+ type = "mdraid";
+ name = "raid1";
+ };
+ };
+ zfs1 = {
+ type = "lvm_lv";
+ size = "128M";
+ lvm_type = "raid0";
+ content = {
+ type = "zfs";
+ pool = "zroot";
+ };
+ };
+ zfs2 = {
+ type = "lvm_lv";
+ size = "128M";
+ lvm_type = "raid0";
+ content = {
+ type = "zfs";
+ pool = "zroot";
+ };
+ };
+ };
+ };
+ };
+ zpool = {
+ zroot = {
+ type = "zpool";
+ mode = "mirror";
+ rootFsOptions = {
+ compression = "lz4";
+ "com.sun:auto-snapshot" = "false";
+ };
+ mountpoint = "/";
+
+ datasets = {
+ zfs_fs = {
+ zfs_type = "filesystem";
+ mountpoint = "/zfs_fs";
+ options."com.sun:auto-snapshot" = "true";
+ };
+ zfs_unmounted_fs = {
+ zfs_type = "filesystem";
+ options.mountpoint = "none";
+ };
+ zfs_legacy_fs = {
+ zfs_type = "filesystem";
+ options.mountpoint = "legacy";
+ mountpoint = "/zfs_legacy_fs";
+ };
+ zfs_testvolume = {
+ zfs_type = "volume";
+ size = "10M";
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/ext4onzfs";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/example/luks-lvm.nix b/example/luks-lvm.nix
index 22c029e..17e18a2 100644
--- a/example/luks-lvm.nix
+++ b/example/luks-lvm.nix
@@ -1,81 +1,81 @@
{
- type = "devices";
- content = {
+ disk = {
vdb = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- part-type = "ESP";
- start = "1MiB";
- end = "100MiB";
- fs-type = "FAT32";
- bootable = true;
- content = {
- type = "filesystem";
- format = "vfat";
- mountpoint = "/boot";
- options = [
- "defaults"
- ];
- };
- }
- {
- type = "partition";
- part-type = "primary";
- start = "100MiB";
- end = "100%";
- content = {
- type = "luks";
- algo = "aes-xts...";
- name = "crypted";
- keyfile = "/tmp/secret.key";
- extraArgs = [
- "--hash sha512"
- "--iter-time 5000"
- ];
- content = {
- type = "lvm_pv";
- vg = "pool";
- };
- };
- }
- ];
- };
- pool = {
- type = "lvm_vg";
- lvs = {
- root = {
- type = "lvm_lv";
- size = "100M";
- mountpoint = "/";
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ name = "ESP";
+ # fs-type = "FAT32";
+ start = "1MiB";
+ end = "100MiB";
+ bootable = true;
content = {
type = "filesystem";
- format = "ext4";
- mountpoint = "/";
+ format = "vfat";
+ mountpoint = "/boot";
options = [
"defaults"
];
};
- };
- home = {
- type = "lvm_lv";
- size = "10M";
+ }
+ {
+ type = "partition";
+ name = "luks";
+ start = "100MiB";
+ end = "100%";
content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/home";
+ type = "luks";
+ name = "crypted";
+ keyFile = "/tmp/secret.key";
+ extraArgs = [
+ "--hash sha512"
+ "--iter-time 5000"
+ ];
+ content = {
+ type = "lvm_pv";
+ vg = "pool";
+ };
};
+ }
+ ];
+ };
+ };
+ };
+ lvm_vg = {
+ pool = {
+ type = "lvm_vg";
+ lvs = {
+ root = {
+ type = "lvm_lv";
+ size = "100M";
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/";
+ options = [
+ "defaults"
+ ];
};
- raw = {
- type = "lvm_lv";
- size = "10M";
- content = {
- type = "noop";
- };
+ };
+ home = {
+ type = "lvm_lv";
+ size = "10M";
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/home";
};
};
+ raw = {
+ type = "lvm_lv";
+ size = "10M";
+ };
+ };
};
};
}
diff --git a/example/lvm-raid.nix b/example/lvm-raid.nix
index 48930ec..3c5ee69 100644
--- a/example/lvm-raid.nix
+++ b/example/lvm-raid.nix
@@ -1,66 +1,74 @@
{
- type = "devices";
- content = {
+ disk = {
vdb = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- part-type = "primary";
- start = "0%";
- end = "100%";
- content = {
- type = "lvm_pv";
- vg = "pool";
- };
- }
- ];
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ name = "primary";
+ start = "0%";
+ end = "100%";
+ content = {
+ type = "lvm_pv";
+ vg = "pool";
+ };
+ }
+ ];
+ };
};
vdc = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- part-type = "primary";
- start = "0%";
- end = "100%";
- content = {
- type = "lvm_pv";
- vg = "pool";
- };
- }
- ];
+ type = "disk";
+ device = "/dev/vdc";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ name = "primary";
+ start = "0%";
+ end = "100%";
+ content = {
+ type = "lvm_pv";
+ vg = "pool";
+ };
+ }
+ ];
+ };
};
+ };
+ lvm_vg = {
pool = {
type = "lvm_vg";
- lvs = {
- root = {
- type = "lvm_lv";
- size = "100M";
+ lvs = {
+ root = {
+ type = "lvm_lv";
+ size = "100M";
+ lvm_type = "mirror";
+ content = {
+ type = "filesystem";
+ format = "ext4";
mountpoint = "/";
- lvm_type = "mirror";
- content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/";
- options = [
- "defaults"
- ];
- };
+ options = [
+ "defaults"
+ ];
};
- home = {
- type = "lvm_lv";
- size = "10M";
- lvm_type = "raid0";
- content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/home";
- };
+ };
+ home = {
+ type = "lvm_lv";
+ size = "10M";
+ lvm_type = "raid0";
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/home";
};
};
+ };
};
};
}
diff --git a/example/mdadm.nix b/example/mdadm.nix
index cb0ad91..094499d 100644
--- a/example/mdadm.nix
+++ b/example/mdadm.nix
@@ -1,39 +1,47 @@
-# usage: nix-instantiate --eval --json --strict example/config.nix | jq .
{
- type = "devices";
- content = {
+ disk = {
vdb = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- part-type = "primary";
- start = "1MiB";
- end = "100%";
- content = {
- type = "mdraid";
- name = "raid1";
- };
- }
- ];
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ name = "mdadm";
+ start = "1MiB";
+ end = "100%";
+ content = {
+ type = "mdraid";
+ name = "raid1";
+ };
+ }
+ ];
+ };
};
vdc = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- part-type = "primary";
- start = "1MiB";
- end = "100%";
- content = {
- type = "mdraid";
- name = "raid1";
- };
- }
- ];
+ type = "disk";
+ device = "/dev/vdc";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ name = "mdadm";
+ start = "1MiB";
+ end = "100%";
+ content = {
+ type = "mdraid";
+ name = "raid1";
+ };
+ }
+ ];
+ };
};
+ };
+ mdadm = {
raid1 = {
type = "mdadm";
level = 1;
@@ -43,7 +51,7 @@
partitions = [
{
type = "partition";
- part-type = "primary";
+ name = "primary";
start = "1MiB";
end = "100%";
content = {
diff --git a/example/zfs-over-legacy.nix b/example/zfs-over-legacy.nix
index 8f5a8bc..81a5975 100644
--- a/example/zfs-over-legacy.nix
+++ b/example/zfs-over-legacy.nix
@@ -1,41 +1,46 @@
{
- type = "devices";
- content = {
+ disk = {
vdb = {
- type = "table";
- format = "gpt";
- partitions = [
- {
- type = "partition";
- # leave space for the grub aka BIOS boot
- start = "0%";
- end = "100%";
- part-type = "primary";
- bootable = true;
- content = {
- type = "filesystem";
- format = "ext4";
- mountpoint = "/";
- };
- }
- ];
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ start = "0%";
+ end = "100%";
+ name = "primary";
+ bootable = true;
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/";
+ };
+ }
+ ];
+ };
};
vdc = {
- type = "zfs";
- pool = "zroot";
+ type = "disk";
+ device = "/dev/vdc";
+ content = {
+ type = "zfs";
+ pool = "zroot";
+ };
};
+ };
+ zpool = {
zroot = {
type = "zpool";
- mountpoint = "/";
-
- datasets = [
- {
- type = "zfs_filesystem";
- name = "zfs_fs";
+ datasets = {
+ zfs_fs = {
+ zfs_type = "filesystem";
mountpoint = "/zfs_fs";
options."com.sun:auto-snapshot" = "true";
- }
- ];
+ };
+ };
};
};
}
diff --git a/example/zfs.nix b/example/zfs.nix
index 60e4700..16da367 100644
--- a/example/zfs.nix
+++ b/example/zfs.nix
@@ -1,14 +1,23 @@
{
- type = "devices";
- content = {
+ disk = {
vdb = {
- type = "zfs";
- pool = "zroot";
+ type = "disk";
+ device = "/dev/vdb";
+ content = {
+ type = "zfs";
+ pool = "zroot";
+ };
};
vdc = {
- type = "zfs";
- pool = "zroot";
+ type = "disk";
+ device = "/dev/vdc";
+ content = {
+ type = "zfs";
+ pool = "zroot";
+ };
};
+ };
+ zpool = {
zroot = {
type = "zpool";
mode = "mirror";
@@ -18,35 +27,31 @@
};
mountpoint = "/";
- datasets = [
- {
- type = "zfs_filesystem";
- name = "zfs_fs";
+ datasets = {
+ zfs_fs = {
+ zfs_type = "filesystem";
mountpoint = "/zfs_fs";
options."com.sun:auto-snapshot" = "true";
- }
- {
- type = "zfs_filesystem";
- name = "zfs_unmounted_fs";
+ };
+ zfs_unmounted_fs = {
+ zfs_type = "filesystem";
options.mountpoint = "none";
- }
- {
- type = "zfs_filesystem";
- name = "zfs_legacy_fs";
+ };
+ zfs_legacy_fs = {
+ zfs_type = "filesystem";
options.mountpoint = "legacy";
mountpoint = "/zfs_legacy_fs";
- }
- {
- type = "zfs_volume";
- name = "zfs_testvolume";
+ };
+ zfs_testvolume = {
+ zfs_type = "volume";
size = "10M";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/ext4onzfs";
};
- }
- ];
+ };
+ };
};
};
}
diff --git a/tests/complex.nix b/tests/complex.nix
new file mode 100644
index 0000000..3fa861e
--- /dev/null
+++ b/tests/complex.nix
@@ -0,0 +1,20 @@
+{ pkgs ? (import <nixpkgs> { })
+, makeDiskoTest ? (pkgs.callPackage ./lib.nix { }).makeDiskoTest
+}:
+makeDiskoTest {
+ disko-config = import ../example/complex.nix;
+ extraTestScript = ''
+ machine.succeed("test -b /dev/zroot/zfs_testvolume");
+ machine.succeed("test -b /dev/md/raid1p1");
+
+
+ machine.succeed("mou