From 88d2a7cbb59a26bb32e0a22e4ff27b4be8d6a81e Mon Sep 17 00:00:00 2001 From: ajs124 Date: Thu, 27 May 2021 00:08:33 +0200 Subject: [PATCH 1/9] vdo: init at 8.1.1.287 --- pkgs/os-specific/linux/vdo/default.nix | 64 ++++++++++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 + 2 files changed, 66 insertions(+) create mode 100644 pkgs/os-specific/linux/vdo/default.nix diff --git a/pkgs/os-specific/linux/vdo/default.nix b/pkgs/os-specific/linux/vdo/default.nix new file mode 100644 index 000000000000..522468c57e2f --- /dev/null +++ b/pkgs/os-specific/linux/vdo/default.nix @@ -0,0 +1,64 @@ +{ lib, stdenv +, fetchFromGitHub +, installShellFiles +, libuuid +, lvm2_dmeventd # +, zlib +, python3 +}: + +stdenv.mkDerivation rec { + pname = "vdo"; + version = "8.1.1.287"; # kvdo uses this! + + src = fetchFromGitHub { + owner = "dm-vdo"; + repo = pname; + rev = version; + sha256 = "1dmfz1rfc7hzqbqmhlk0x4vsp7jivww19gmj5z1gg4fsl9g26wn8"; + }; + + nativeBuildInputs = [ + installShellFiles + ]; + + buildInputs = [ + libuuid + lvm2_dmeventd + zlib + python3.pkgs.wrapPython + ]; + + propagatedBuildInputs = with python3.pkgs; [ + pyyaml + ]; + + pythonPath = propagatedBuildInputs; + + makeFlags = [ + "DESTDIR=${placeholder "out"}" + "INSTALLOWNER=" + # all of these paths are relative to DESTDIR and have defaults that don't work for us + "bindir=/bin" + "defaultdocdir=/share/doc" + "mandir=/share/man" + "python3_sitelib=${python3.sitePackages}" + ]; + + enableParallelBuilding = true; + + postInstall = '' + installShellCompletion --bash $out/bash_completion.d/* + rm -r $out/bash_completion.d + + wrapPythonPrograms + ''; + + meta = with lib; { + homepage = "https://github.com/dm-vdo/vdo"; + description = "A set of userspace tools for managing pools of deduplicated and/or compressed block storage"; + platforms = platforms.linux; + license = with licenses; [ gpl2Plus ]; + maintainers = with maintainers; [ ajs124 ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 65c5b9e133f0..d549f884e27b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -23554,6 +23554,8 @@ with pkgs; vndr = callPackage ../development/tools/vndr { }; + vdo = callPackage ../os-specific/linux/vdo { }; + windows = callPackages ../os-specific/windows {}; wirelesstools = callPackage ../os-specific/linux/wireless-tools { }; From 39b3db85f1a60be5a2c28d04bd0b9276e73b2ac3 Mon Sep 17 00:00:00 2001 From: ajs124 Date: Fri, 14 Jan 2022 05:07:11 +0100 Subject: [PATCH 2/9] lvm2_vdo: init --- pkgs/os-specific/linux/lvm2/common.nix | 7 ++++++- pkgs/top-level/all-packages.nix | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pkgs/os-specific/linux/lvm2/common.nix b/pkgs/os-specific/linux/lvm2/common.nix index 07e8c9cb02da..7ba08e7d9034 100644 --- a/pkgs/os-specific/linux/lvm2/common.nix +++ b/pkgs/os-specific/linux/lvm2/common.nix @@ -11,6 +11,7 @@ , enableDmeventd ? false , udevSupport ? !stdenv.hostPlatform.isStatic, udev ? null , onlyLib ? stdenv.hostPlatform.isStatic +, enableVDO ? false, vdo ? null , nixosTests }: @@ -18,7 +19,7 @@ assert enableDmeventd -> enableCmdlib; stdenv.mkDerivation rec { - pname = "lvm2" + lib.optionalString enableDmeventd "-with-dmeventd"; + pname = "lvm2" + lib.optionalString enableDmeventd "-with-dmeventd" + lib.optionalString enableVDO "-with-vdo"; inherit version; src = fetchurl { @@ -33,6 +34,8 @@ stdenv.mkDerivation rec { udev ] ++ lib.optionals (!onlyLib) [ libuuid + ] ++ lib.optionals enableVDO [ + vdo ]; configureFlags = [ @@ -58,6 +61,8 @@ stdenv.mkDerivation rec { "--enable-udev_sync" ] ++ lib.optionals stdenv.hostPlatform.isStatic [ "--enable-static_link" + ] ++ lib.optionals enableVDO [ + "--enable-vdo" ]; preConfigure = '' diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d549f884e27b..93e532580b7a 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -22978,6 +22978,9 @@ with pkgs; enableDmeventd = true; enableCmdlib = true; }; + lvm2_vdo = lvm2_dmeventd.override { + enableVDO = true; + }; maddy = callPackage ../servers/maddy { }; From 47240ce17480e1aa67ccedb39c9ed3fca419759c Mon Sep 17 00:00:00 2001 From: ajs124 Date: Fri, 14 Jan 2022 05:15:03 +0100 Subject: [PATCH 3/9] kvdo: init at 8.1.1.287 --- pkgs/os-specific/linux/kvdo/default.nix | 31 +++++++++++++++++++++++++ pkgs/top-level/linux-kernels.nix | 2 ++ 2 files changed, 33 insertions(+) create mode 100644 pkgs/os-specific/linux/kvdo/default.nix diff --git a/pkgs/os-specific/linux/kvdo/default.nix b/pkgs/os-specific/linux/kvdo/default.nix new file mode 100644 index 000000000000..88343e1c8b09 --- /dev/null +++ b/pkgs/os-specific/linux/kvdo/default.nix @@ -0,0 +1,31 @@ +{ stdenv, lib, fetchFromGitHub, vdo, kernel }: + +stdenv.mkDerivation rec { + inherit (vdo) version; + pname = "kvdo"; + + src = fetchFromGitHub { + owner = "dm-vdo"; + repo = "kvdo"; + rev = version; + sha256 = "1plzvw68x16q8a65cyy0pbycajrl03siyh3yh7qr8kmd2i1p1mxc"; + }; + + dontConfigure = true; + enableParallelBuilding = true; + + KSRC = "${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"; + INSTALL_MOD_PATH = placeholder "out"; + + preBuild = '' + makeFlags="$makeFlags -C ${KSRC} M=$(pwd)" +''; + installTargets = [ "modules_install" ]; + + meta = with lib; { + inherit (vdo.meta) license maintainers; + homepage = "https://github.com/dm-vdo/kvdo"; + description = "A pair of kernel modules which provide pools of deduplicated and/or compressed block storage"; + platforms = platforms.linux; + }; +} diff --git a/pkgs/top-level/linux-kernels.nix b/pkgs/top-level/linux-kernels.nix index bd7bacf30004..b0657b01a19b 100644 --- a/pkgs/top-level/linux-kernels.nix +++ b/pkgs/top-level/linux-kernels.nix @@ -317,6 +317,8 @@ in { ena = callPackage ../os-specific/linux/ena {}; + kvdo = callPackage ../os-specific/linux/kvdo {}; + liquidtux = callPackage ../os-specific/linux/liquidtux {}; v4l2loopback = callPackage ../os-specific/linux/v4l2loopback { }; From 397f065cb4cb8eba426d5719d75c45c24f5e05dc Mon Sep 17 00:00:00 2001 From: ajs124 Date: Tue, 1 Feb 2022 18:20:49 +0100 Subject: [PATCH 4/9] nixos/tasks/lvm: add vdo support --- nixos/modules/tasks/lvm.nix | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/nixos/modules/tasks/lvm.nix b/nixos/modules/tasks/lvm.nix index 35316603c38f..3d48ba492c47 100644 --- a/nixos/modules/tasks/lvm.nix +++ b/nixos/modules/tasks/lvm.nix @@ -7,17 +7,18 @@ in { options.services.lvm = { package = mkOption { type = types.package; - default = if cfg.dmeventd.enable then pkgs.lvm2_dmeventd else pkgs.lvm2; + default = pkgs.lvm2; internal = true; defaultText = literalExpression "pkgs.lvm2"; description = '' This option allows you to override the LVM package that's used on the system (udev rules, tmpfiles, systemd services). - Defaults to pkgs.lvm2, or pkgs.lvm2_dmeventd if dmeventd is enabled. + Defaults to pkgs.lvm2, pkgs.lvm2_dmeventd if dmeventd or pkgs.lvm2_vdo if vdo is enabled. ''; }; dmeventd.enable = mkEnableOption "the LVM dmevent daemon"; boot.thin.enable = mkEnableOption "support for booting from ThinLVs"; + boot.vdo.enable = mkEnableOption "support for booting from VDOLVs"; }; config = mkMerge [ @@ -40,6 +41,7 @@ in { environment.etc."lvm/lvm.conf".text = '' dmeventd/executable = "${cfg.package}/bin/dmeventd" ''; + services.lvm.package = mkDefault pkgs.lvm2_dmeventd; }) (mkIf cfg.boot.thin.enable { boot.initrd = { @@ -61,6 +63,32 @@ in { environment.etc."lvm/lvm.conf".text = concatMapStringsSep "\n" (bin: "global/${bin}_executable = ${pkgs.thin-provisioning-tools}/bin/${bin}") [ "thin_check" "thin_dump" "thin_repair" "cache_check" "cache_dump" "cache_repair" ]; + + environment.systemPackages = [ pkgs.thin-provisioning-tools ]; + }) + (mkIf cfg.boot.vdo.enable { + boot = { + initrd = { + kernelModules = [ "kvdo" ]; + + extraUtilsCommands = '' + for BIN in ${pkgs.vdo}/bin/*; do + copy_bin_and_libs $BIN + done + ''; + + extraUtilsCommandsTest = '' + ls ${pkgs.vdo}/bin/ | while read BIN; do + $out/bin/$(basename $BIN) --help > /dev/null + done + ''; + }; + extraModulePackages = [ config.boot.kernelPackages.kvdo ]; + }; + + services.lvm.package = mkOverride 999 pkgs.lvm2_vdo; # this overrides mkDefault + + environment.systemPackages = [ pkgs.vdo ]; }) (mkIf (cfg.dmeventd.enable || cfg.boot.thin.enable) { boot.initrd.preLVMCommands = '' From 29350716d490d390c04ba31a8967211f0f82455f Mon Sep 17 00:00:00 2001 From: ajs124 Date: Sun, 13 Feb 2022 15:29:24 +0100 Subject: [PATCH 5/9] (k)vdo: 8.1.1.287 -> 8.1.1.360 --- pkgs/os-specific/linux/kvdo/default.nix | 2 +- pkgs/os-specific/linux/vdo/default.nix | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/os-specific/linux/kvdo/default.nix b/pkgs/os-specific/linux/kvdo/default.nix index 88343e1c8b09..74895e11bd5a 100644 --- a/pkgs/os-specific/linux/kvdo/default.nix +++ b/pkgs/os-specific/linux/kvdo/default.nix @@ -8,7 +8,7 @@ stdenv.mkDerivation rec { owner = "dm-vdo"; repo = "kvdo"; rev = version; - sha256 = "1plzvw68x16q8a65cyy0pbycajrl03siyh3yh7qr8kmd2i1p1mxc"; + sha256 = "1xl7dwcqx00w1gbpb6vlkn8nchyfj1fsc8c06vgda0sgxp7qs5gn"; }; dontConfigure = true; diff --git a/pkgs/os-specific/linux/vdo/default.nix b/pkgs/os-specific/linux/vdo/default.nix index 522468c57e2f..1904445d4c2c 100644 --- a/pkgs/os-specific/linux/vdo/default.nix +++ b/pkgs/os-specific/linux/vdo/default.nix @@ -9,13 +9,13 @@ stdenv.mkDerivation rec { pname = "vdo"; - version = "8.1.1.287"; # kvdo uses this! + version = "8.1.1.360"; # kvdo uses this! src = fetchFromGitHub { owner = "dm-vdo"; repo = pname; rev = version; - sha256 = "1dmfz1rfc7hzqbqmhlk0x4vsp7jivww19gmj5z1gg4fsl9g26wn8"; + sha256 = "1zp8aaw0diramnlx5z96jcpbm6x0r204xf1vwq6k21rzcazczkwv"; }; nativeBuildInputs = [ From 6a8face381e3424aaa733ad183e5dc6a9fab7f98 Mon Sep 17 00:00:00 2001 From: ajs124 Date: Sun, 13 Feb 2022 15:41:14 +0100 Subject: [PATCH 6/9] nixos/tests/lvm2: don't try to add script from vdo to initrd --- nixos/modules/tasks/lvm.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nixos/modules/tasks/lvm.nix b/nixos/modules/tasks/lvm.nix index 3d48ba492c47..59711f90dce3 100644 --- a/nixos/modules/tasks/lvm.nix +++ b/nixos/modules/tasks/lvm.nix @@ -72,13 +72,13 @@ in { kernelModules = [ "kvdo" ]; extraUtilsCommands = '' - for BIN in ${pkgs.vdo}/bin/*; do - copy_bin_and_libs $BIN + ls ${pkgs.vdo}/bin/ | grep -v adaptLVMVDO | while read BIN; do + copy_bin_and_libs ${pkgs.vdo}/bin/$BIN done ''; extraUtilsCommandsTest = '' - ls ${pkgs.vdo}/bin/ | while read BIN; do + ls ${pkgs.vdo}/bin/ | grep -v adaptLVMVDO | while read BIN; do $out/bin/$(basename $BIN) --help > /dev/null done ''; From 6bbba3067440488cdc8edb22861e65fd7d905be4 Mon Sep 17 00:00:00 2001 From: ajs124 Date: Tue, 1 Feb 2022 18:21:11 +0100 Subject: [PATCH 7/9] nixos/tests/lvm2: init --- nixos/tests/all-tests.nix | 1 + nixos/tests/lvm2/default.nix | 26 ++++++++++++++++++++++++++ nixos/tests/lvm2/thinpool.nix | 32 ++++++++++++++++++++++++++++++++ nixos/tests/lvm2/vdo.nix | 27 +++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 nixos/tests/lvm2/default.nix create mode 100644 nixos/tests/lvm2/thinpool.nix create mode 100644 nixos/tests/lvm2/vdo.nix diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index dcbdf34e9441..799ce9b4017e 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -274,6 +274,7 @@ in login = handleTest ./login.nix {}; logrotate = handleTest ./logrotate.nix {}; loki = handleTest ./loki.nix {}; + lvm2 = handleTest ./lvm2 {}; lxd = handleTest ./lxd.nix {}; lxd-image = handleTest ./lxd-image.nix {}; lxd-nftables = handleTest ./lxd-nftables.nix {}; diff --git a/nixos/tests/lvm2/default.nix b/nixos/tests/lvm2/default.nix new file mode 100644 index 000000000000..285e14390410 --- /dev/null +++ b/nixos/tests/lvm2/default.nix @@ -0,0 +1,26 @@ +{ system ? builtins.currentSystem +, config ? { } +, pkgs ? import ../../.. { inherit system config; } +, lib ? pkgs.lib +, kernelVersionsToTest ? [ "4.19" "5.4" "5.10" "5.15" "latest" ] +}: + +let + tests = let callTest = p: lib.flip (import p) { inherit system pkgs; }; in { + thinpool = { test = callTest ./thinpool.nix; kernelFilter = lib.id; }; + # we would like to test all versions, but the kernel module currently does not compile against the other versions + vdo = { test = callTest ./vdo.nix; kernelFilter = lib.filter (v: v == "5.15"); }; + }; +in +lib.listToAttrs ( + lib.filter (x: x.value != {}) ( + lib.flip lib.concatMap kernelVersionsToTest (version: + let + v' = lib.replaceStrings [ "." ] [ "_" ] version; + in + lib.flip lib.mapAttrsToList tests (name: t: + lib.nameValuePair "lvm-${name}-linux-${v'}" (lib.optionalAttrs (builtins.elem version (t.kernelFilter kernelVersionsToTest)) (t.test { kernelPackages = pkgs."linuxPackages_${v'}"; })) + ) + ) + ) +) diff --git a/nixos/tests/lvm2/thinpool.nix b/nixos/tests/lvm2/thinpool.nix new file mode 100644 index 000000000000..82c6460a890a --- /dev/null +++ b/nixos/tests/lvm2/thinpool.nix @@ -0,0 +1,32 @@ +{ kernelPackages ? null }: +import ../make-test-python.nix ({ pkgs, ... }: { + name = "lvm2-thinpool"; + meta.maintainers = with pkgs.lib.maintainers; [ ajs124 ]; + + nodes.machine = { pkgs, lib, ... }: { + virtualisation.emptyDiskImages = [ 4096 ]; + services.lvm = { + boot.thin.enable = true; + dmeventd.enable = true; + }; + environment.systemPackages = with pkgs; [ xfsprogs ]; + environment.etc."lvm/lvm.conf".text = '' + activation/thin_pool_autoextend_percent = 10 + activation/thin_pool_autoextend_threshold = 80 + ''; + boot = lib.mkIf (kernelPackages != null) { inherit kernelPackages; }; + }; + + testScript = '' + machine.succeed("vgcreate test_vg /dev/vdb") + machine.succeed("lvcreate -L 512M -T test_vg/test_thin_pool") + machine.succeed("lvcreate -n test_lv -V 16G --thinpool test_thin_pool test_vg") + machine.succeed("mkfs.xfs /dev/test_vg/test_lv") + machine.succeed("mkdir /mnt; mount /dev/test_vg/test_lv /mnt") + assert "/dev/mapper/test_vg-test_lv" == machine.succeed("findmnt -no SOURCE /mnt").strip() + machine.succeed("dd if=/dev/zero of=/mnt/empty.file bs=1M count=1024") + machine.succeed("journalctl -u dm-event.service | grep \"successfully resized\"") + machine.succeed("umount /mnt") + machine.succeed("vgchange -a n") + ''; +}) diff --git a/nixos/tests/lvm2/vdo.nix b/nixos/tests/lvm2/vdo.nix new file mode 100644 index 000000000000..49548d895ca0 --- /dev/null +++ b/nixos/tests/lvm2/vdo.nix @@ -0,0 +1,27 @@ +{ kernelPackages ? null }: +import ../make-test-python.nix ({ pkgs, ... }: { + name = "lvm2-thinpool"; + meta.maintainers = with pkgs.lib.maintainers; [ ajs124 ]; + + nodes.machine = { pkgs, lib, ... }: { + # Minimum required size for VDO volume: 5063921664 bytes + virtualisation.emptyDiskImages = [ 8192 ]; + services.lvm = { + boot.vdo.enable = true; + dmeventd.enable = true; + }; + environment.systemPackages = with pkgs; [ xfsprogs ]; + boot = lib.mkIf (kernelPackages != null) { inherit kernelPackages; }; + }; + + testScript = '' + machine.succeed("vgcreate test_vg /dev/vdb") + machine.succeed("lvcreate --type vdo -n vdo_lv -L 6G -V 12G test_vg/vdo_pool_lv") + machine.succeed("mkfs.xfs -K /dev/test_vg/vdo_lv") + machine.succeed("mkdir /mnt; mount /dev/test_vg/vdo_lv /mnt") + assert "/dev/mapper/test_vg-vdo_lv" == machine.succeed("findmnt -no SOURCE /mnt").strip() + machine.succeed("umount /mnt") + machine.succeed("vdostats") + machine.succeed("vgchange -a n") + ''; +}) From c532fcdd96bf74dd1ed3864d41b367c227f0d978 Mon Sep 17 00:00:00 2001 From: ajs124 Date: Mon, 4 Apr 2022 14:29:20 +0100 Subject: [PATCH 8/9] nixos/tests/lvm2/vdo: fix machine name --- nixos/tests/lvm2/vdo.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/tests/lvm2/vdo.nix b/nixos/tests/lvm2/vdo.nix index 49548d895ca0..5b014c2f7222 100644 --- a/nixos/tests/lvm2/vdo.nix +++ b/nixos/tests/lvm2/vdo.nix @@ -1,6 +1,6 @@ { kernelPackages ? null }: import ../make-test-python.nix ({ pkgs, ... }: { - name = "lvm2-thinpool"; + name = "lvm2-vdo"; meta.maintainers = with pkgs.lib.maintainers; [ ajs124 ]; nodes.machine = { pkgs, lib, ... }: { From 4b3ebfb126c3652dda4a1ca9d43647d88fe6ae1d Mon Sep 17 00:00:00 2001 From: ajs124 Date: Tue, 5 Apr 2022 11:46:09 +0100 Subject: [PATCH 9/9] nixos/tests/lvm2: add comment recommending a test --- nixos/tests/lvm2/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nixos/tests/lvm2/default.nix b/nixos/tests/lvm2/default.nix index 285e14390410..2ba17809569a 100644 --- a/nixos/tests/lvm2/default.nix +++ b/nixos/tests/lvm2/default.nix @@ -5,6 +5,7 @@ , kernelVersionsToTest ? [ "4.19" "5.4" "5.10" "5.15" "latest" ] }: +# For quickly running a test, the nixosTests.lvm2.lvm-thinpool-linux-latest attribute is recommended let tests = let callTest = p: lib.flip (import p) { inherit system pkgs; }; in { thinpool = { test = callTest ./thinpool.nix; kernelFilter = lib.id; };