mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-09-29 15:43:00 +00:00
Merge pull request #154981 from helsinki-systems/feat/lvm2-vdo
(k)vdo: init
This commit is contained in:
commit
e2fd601514
@ -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 = ''
|
||||
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/ | grep -v adaptLVMVDO | 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 = ''
|
||||
|
@ -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 {};
|
||||
|
27
nixos/tests/lvm2/default.nix
Normal file
27
nixos/tests/lvm2/default.nix
Normal file
@ -0,0 +1,27 @@
|
||||
{ system ? builtins.currentSystem
|
||||
, config ? { }
|
||||
, pkgs ? import ../../.. { inherit system config; }
|
||||
, lib ? pkgs.lib
|
||||
, 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; };
|
||||
# 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'}"; }))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
32
nixos/tests/lvm2/thinpool.nix
Normal file
32
nixos/tests/lvm2/thinpool.nix
Normal file
@ -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")
|
||||
'';
|
||||
})
|
27
nixos/tests/lvm2/vdo.nix
Normal file
27
nixos/tests/lvm2/vdo.nix
Normal file
@ -0,0 +1,27 @@
|
||||
{ kernelPackages ? null }:
|
||||
import ../make-test-python.nix ({ pkgs, ... }: {
|
||||
name = "lvm2-vdo";
|
||||
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")
|
||||
'';
|
||||
})
|
31
pkgs/os-specific/linux/kvdo/default.nix
Normal file
31
pkgs/os-specific/linux/kvdo/default.nix
Normal file
@ -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 = "1xl7dwcqx00w1gbpb6vlkn8nchyfj1fsc8c06vgda0sgxp7qs5gn";
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
}
|
@ -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 = ''
|
||||
|
64
pkgs/os-specific/linux/vdo/default.nix
Normal file
64
pkgs/os-specific/linux/vdo/default.nix
Normal file
@ -0,0 +1,64 @@
|
||||
{ lib, stdenv
|
||||
, fetchFromGitHub
|
||||
, installShellFiles
|
||||
, libuuid
|
||||
, lvm2_dmeventd # <libdevmapper-event.h>
|
||||
, zlib
|
||||
, python3
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "vdo";
|
||||
version = "8.1.1.360"; # kvdo uses this!
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "dm-vdo";
|
||||
repo = pname;
|
||||
rev = version;
|
||||
sha256 = "1zp8aaw0diramnlx5z96jcpbm6x0r204xf1vwq6k21rzcazczkwv";
|
||||
};
|
||||
|
||||
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 ];
|
||||
};
|
||||
}
|
@ -22940,6 +22940,9 @@ with pkgs;
|
||||
enableDmeventd = true;
|
||||
enableCmdlib = true;
|
||||
};
|
||||
lvm2_vdo = lvm2_dmeventd.override {
|
||||
enableVDO = true;
|
||||
};
|
||||
|
||||
maddy = callPackage ../servers/maddy { };
|
||||
|
||||
@ -23527,6 +23530,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 { };
|
||||
|
@ -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 { };
|
||||
|
Loading…
Reference in New Issue
Block a user