From 1a1e7237de905ecbc990d17af8ff87a667aa312c Mon Sep 17 00:00:00 2001 From: ajs124 Date: Mon, 25 May 2020 03:55:32 +0200 Subject: [PATCH] nixos/tasks/lvm: add dmeventd and lvmthin support Introduce a pkgs.lvm2_dmeventd that contains dmeventd support, and enable if services.lvm.dmeventd.enable is true. --- nixos/modules/tasks/lvm.nix | 75 ++++++++++++++++++++++++++++----- pkgs/top-level/all-packages.nix | 6 ++- 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/nixos/modules/tasks/lvm.nix b/nixos/modules/tasks/lvm.nix index d56a8a2f63a..b8f7a01e44e 100644 --- a/nixos/modules/tasks/lvm.nix +++ b/nixos/modules/tasks/lvm.nix @@ -1,17 +1,70 @@ { config, lib, pkgs, ... }: with lib; - -{ - - ###### implementation - - config = mkIf (!config.boot.isContainer) { - - environment.systemPackages = [ pkgs.lvm2 ]; - - services.udev.packages = [ pkgs.lvm2 ]; - +let + cfg = config.services.lvm; +in { + options.services.lvm = { + package = mkOption { + type = types.package; + default = if cfg.dmeventd.enable then pkgs.lvm2_dmeventd else pkgs.lvm2; + internal = true; + defaultText = "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. + ''; + }; + dmeventd.enable = mkEnableOption "the LVM dmevent daemon"; + boot.thin.enable = mkEnableOption "support for booting from ThinLVs"; }; + config = mkMerge [ + (mkIf (!config.boot.isContainer) { + environment.etc."tmpfiles.d/lvm2.conf".source = "${cfg.package}/lib/tmpfiles.d/lvm2.conf"; + environment.systemPackages = [ cfg.package ]; + systemd.packages = [ cfg.package ]; + + # TODO: update once https://github.com/NixOS/nixpkgs/pull/93006 was merged + services.udev.packages = [ cfg.package.out ]; + }) + (mkIf cfg.dmeventd.enable { + systemd.sockets."dm-event".wantedBy = [ "sockets.target" ]; + systemd.services."lvm2-monitor".wantedBy = [ "sysinit.target" ]; + + environment.etc."lvm/lvm.conf".text = '' + dmeventd/executable = "${cfg.package}/bin/dmeventd" + ''; + }) + (mkIf cfg.boot.thin.enable { + boot.initrd = { + kernelModules = [ "dm-snapshot" "dm-thin-pool" ]; + + extraUtilsCommands = '' + copy_bin_and_libs ${pkgs.thin-provisioning-tools}/bin/pdata_tools + copy_bin_and_libs ${pkgs.thin-provisioning-tools}/bin/thin_check + ''; + }; + + environment.etc."lvm/lvm.conf".text = '' + global/thin_check_executable = "${pkgs.thin-provisioning-tools}/bin/thin_check" + ''; + }) + (mkIf (cfg.dmeventd.enable || cfg.boot.thin.enable) { + boot.initrd.preLVMCommands = '' + mkdir -p /etc/lvm + cat << EOF >> /etc/lvm/lvm.conf + ${optionalString cfg.boot.thin.enable '' + global/thin_check_executable = "$(command -v thin_check)" + ''} + ${optionalString cfg.dmeventd.enable '' + dmeventd/executable = "$(command -v false)" + activation/monitoring = 0 + ''} + EOF + ''; + }) + ]; + } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 5bcff8c58c2..b6d506a8e7d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -16817,7 +16817,7 @@ in directvnc = callPackage ../os-specific/linux/directvnc { }; - dmraid = callPackage ../os-specific/linux/dmraid { }; + dmraid = callPackage ../os-specific/linux/dmraid { lvm2 = lvm2_dmeventd; }; drbd = callPackage ../os-specific/linux/drbd { }; @@ -17520,6 +17520,10 @@ in lsscsi = callPackage ../os-specific/linux/lsscsi { }; lvm2 = callPackage ../os-specific/linux/lvm2 { }; + lvm2_dmeventd = callPackage ../os-specific/linux/lvm2 { + enable_dmeventd = true; + enable_cmdlib = true; + }; mbpfan = callPackage ../os-specific/linux/mbpfan { };