summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--example/tmpfs.nix48
-rw-r--r--tests/tmpfs.nix10
-rw-r--r--types.nix87
3 files changed, 140 insertions, 5 deletions
diff --git a/example/tmpfs.nix b/example/tmpfs.nix
new file mode 100644
index 0000000..fb45f8a
--- /dev/null
+++ b/example/tmpfs.nix
@@ -0,0 +1,48 @@
+{ disks ? [ "/dev/vdb" ], ... }: {
+ disk = {
+ vdb = {
+ device = builtins.elemAt disks 0;
+ type = "disk";
+ content = {
+ type = "table";
+ format = "gpt";
+ partitions = [
+ {
+ type = "partition";
+ name = "ESP";
+ start = "1MiB";
+ end = "100MiB";
+ bootable = true;
+ content = {
+ type = "filesystem";
+ format = "vfat";
+ mountpoint = "/boot";
+ };
+ }
+ {
+ name = "root";
+ type = "partition";
+ start = "100MiB";
+ end = "100%";
+ part-type = "primary";
+ bootable = true;
+ content = {
+ type = "filesystem";
+ format = "ext4";
+ mountpoint = "/";
+ };
+ }
+ ];
+ };
+ };
+ };
+ nodev = {
+ "/tmp" = {
+ fsType = "tmpfs";
+ mountOptions = [
+ "size=200M"
+ ];
+ };
+ };
+}
+
diff --git a/tests/tmpfs.nix b/tests/tmpfs.nix
new file mode 100644
index 0000000..10da055
--- /dev/null
+++ b/tests/tmpfs.nix
@@ -0,0 +1,10 @@
+{ pkgs ? (import <nixpkgs> { })
+, makeDiskoTest ? (pkgs.callPackage ./lib.nix { }).makeDiskoTest
+}:
+makeDiskoTest {
+ disko-config = ../example/tmpfs.nix;
+ extraTestScript = ''
+ machine.succeed("mountpoint /");
+ machine.succeed("mountpoint /tmp");
+ '';
+}
diff --git a/types.nix b/types.nix
index 87a34a9..fa24607 100644
--- a/types.nix
+++ b/types.nix
@@ -119,6 +119,7 @@ rec {
meta :: types.devices -> AttrSet
*/
meta = devices: diskoLib.deepMergeMap (dev: dev._meta) (flatten (map attrValues (attrValues devices)));
+
/* Takes a disko device specification and returns a string which formats the disks
create :: types.devices -> str
@@ -215,7 +216,7 @@ rec {
};
};
- /* topLevel type of the disko config, takes attrsets of disks mdadms zpools and lvm vgs.
+ /* topLevel type of the disko config, takes attrsets of disks, mdadms, zpools, nodevs, and lvm vgs.
*/
devices = types.submodule {
options = {
@@ -235,9 +236,82 @@ rec {
type = types.attrsOf lvm_vg;
default = {};
};
+ nodev = mkOption {
+ type = types.attrsOf nodev;
+ default = {};
+ };
};
};
+ nodev = types.submodule ({ config, ... }: {
+ options = {
+ type = mkOption {
+ type = types.enum [ "nodev" ];
+ default = "nodev";
+ internal = true;
+ };
+ fsType = mkOption {
+ type = types.str;
+ };
+ device = mkOption {
+ type = types.str;
+ default = "none";
+ };
+ mountpoint = mkOption {
+ type = optionTypes.absolute-pathname;
+ default = config._module.args.name;
+ };
+ mountOptions = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ };
+ _meta = mkOption {
+ internal = true;
+ readOnly = true;
+ type = diskoLib.jsonType;
+ default = {
+ };
+ };
+ _create = mkOption {
+ internal = true;
+ readOnly = true;
+ type = types.str;
+ default = "";
+ };
+ _mount = mkOption {
+ internal = true;
+ readOnly = true;
+ type = diskoLib.jsonType;
+ default = {
+ fs.${config.mountpoint} = ''
+ if ! findmnt ${config.fsType} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
+ mount -t ${config.fsType} ${config.device} "/mnt${config.mountpoint}" \
+ ${concatMapStringsSep " " (opt: "-o ${opt}") config.mountOptions} \
+ -o X-mount.mkdir
+ fi
+ '';
+ };
+ };
+ _config = mkOption {
+ internal = true;
+ readOnly = true;
+ default = [{
+ fileSystems.${config.mountpoint} = {
+ device = config.device;
+ fsType = config.fsType;
+ options = config.mountOptions;
+ };
+ }];
+ };
+ _pkgs= mkOption {
+ internal = true;
+ readOnly = true;
+ type = types.functionTo (types.listOf types.package);
+ default = pkgs: [];
+ };
+ };
+ });
+
btrfs = types.submodule ({ config, ... }: {
options = {
type = mkOption {
@@ -286,7 +360,7 @@ rec {
fs.${config.mountpoint} = ''
if ! findmnt ${dev} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount ${dev} "/mnt${config.mountpoint}" \
- ${concatStringsSep " " config.mountOptions} \
+ ${concatMapStringsSep " " (opt: "-o ${opt}") config.mountOptions} \
-o X-mount.mkdir
fi
'';
@@ -360,7 +434,7 @@ rec {
fs.${config.mountpoint} = ''
if ! findmnt ${dev} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount ${dev} "/mnt${config.mountpoint}" \
- ${toString config.mountOptions} \
+ ${concatMapStringsSep " " (opt: "-o ${opt}") config.mountOptions} \
-o X-mount.mkdir
fi
'';
@@ -834,6 +908,7 @@ rec {
};
type = mkOption {
type = types.enum [ "zpool" ];
+ default = "zpool";
internal = true;
};
mode = mkOption {
@@ -895,7 +970,7 @@ rec {
if ! findmnt ${config.name} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount ${config.name} "/mnt${config.mountpoint}" \
${optionalString ((config.options.mountpoint or "") != "legacy") "-o zfsutil"} \
- ${toString config.mountOptions} \
+ ${concatMapStringsSep " " (opt: "-o ${opt}") config.mountOptions} \
-o X-mount.mkdir \
-t zfs
fi
@@ -993,7 +1068,7 @@ rec {
if ! findmnt ${zpool}/${config.name} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount ${zpool}/${config.name} "/mnt${config.mountpoint}" \
-o X-mount.mkdir \
- ${toString config.mountOptions} \
+ ${concatMapStringsSep " " (opt: "-o ${opt}") config.mountOptions} \
${optionalString ((config.options.mountpoint or "") != "legacy") "-o zfsutil"} \
-t zfs
fi
@@ -1212,6 +1287,8 @@ rec {
};
type = mkOption {
type = types.enum [ "disk" ];
+ default = "disk";
+ internal = true;
};
device = mkOption {
type = optionTypes.absolute-pathname; # TODO check if subpath of /dev ? - No! eg: /.swapfile