nixos/zram: add writebackDevice option and corresponding test

Nick Cao cd3ffbdf d586805a

Changed files
+46 -8
nixos
modules
config
tests
+20
nixos/modules/config/zram.nix
···
{command}`cat /sys/class/block/zram*/comp_algorithm`
'';
};
+
+
writebackDevice = lib.mkOption {
+
default = null;
+
example = "/dev/zvol/tarta-zoot/swap-writeback";
+
type = lib.types.nullOr lib.types.path;
+
description = lib.mdDoc ''
+
Write incompressible pages to this device,
+
as there's no gain from keeping them in RAM.
+
'';
+
};
};
};
config = lib.mkIf cfg.enable {
+
+
assertions = [
+
{
+
assertion = cfg.writebackDevice == null || cfg.swapDevices <= 1;
+
message = "A single writeback device cannot be shared among multiple zram devices";
+
}
+
];
+
system.requiredKernelConfig = with config.lib.kernelConfig; [
(isModule "ZRAM")
···
zram-size = if cfg.memoryMax != null then "min(${size}, ${toString cfg.memoryMax} / 1024 / 1024)" else size;
compression-algorithm = cfg.algorithm;
swap-priority = cfg.priority;
+
} // lib.optionalAttrs (cfg.writebackDevice != null) {
+
writeback-device = cfg.writebackDevice;
};
})
devices));
+26 -8
nixos/tests/zram-generator.nix
···
import ./make-test-python.nix {
name = "zram-generator";
-
nodes.machine = { ... }: {
-
zramSwap = {
-
enable = true;
-
priority = 10;
-
algorithm = "lz4";
-
swapDevices = 2;
-
memoryPercent = 30;
-
memoryMax = 10 * 1024 * 1024;
+
nodes = {
+
single = { ... }: {
+
virtualisation = {
+
emptyDiskImages = [ 512 ];
+
};
+
zramSwap = {
+
enable = true;
+
priority = 10;
+
algorithm = "lz4";
+
swapDevices = 1;
+
memoryPercent = 30;
+
memoryMax = 10 * 1024 * 1024;
+
writebackDevice = "/dev/vdb";
+
};
+
};
+
machine = { ... }: {
+
zramSwap = {
+
enable = true;
+
priority = 10;
+
algorithm = "lz4";
+
swapDevices = 2;
+
memoryPercent = 30;
+
memoryMax = 10 * 1024 * 1024;
+
};
};
};
testScript = ''
+
single.wait_for_unit("systemd-zram-setup@zram0.service")
+
machine.wait_for_unit("systemd-zram-setup@zram0.service")
machine.wait_for_unit("systemd-zram-setup@zram1.service")
zram = machine.succeed("zramctl --noheadings --raw")