1{ config, lib, pkgs, ... }:
2
3with lib;
4let
5 cfg = config.services.lvm;
6in {
7 options.services.lvm = {
8 package = mkOption {
9 type = types.package;
10 default = if cfg.dmeventd.enable then pkgs.lvm2_dmeventd else pkgs.lvm2;
11 internal = true;
12 defaultText = literalExpression "pkgs.lvm2";
13 description = ''
14 This option allows you to override the LVM package that's used on the system
15 (udev rules, tmpfiles, systemd services).
16 Defaults to pkgs.lvm2, or pkgs.lvm2_dmeventd if dmeventd is enabled.
17 '';
18 };
19 dmeventd.enable = mkEnableOption "the LVM dmevent daemon";
20 boot.thin.enable = mkEnableOption "support for booting from ThinLVs";
21 };
22
23 config = mkMerge [
24 ({
25 # minimal configuration file to make lvmconfig/lvm2-activation-generator happy
26 environment.etc."lvm/lvm.conf".text = "config {}";
27 })
28 (mkIf (!config.boot.isContainer) {
29 systemd.tmpfiles.packages = [ cfg.package.out ];
30 environment.systemPackages = [ cfg.package ];
31 systemd.packages = [ cfg.package ];
32
33 # TODO: update once https://github.com/NixOS/nixpkgs/pull/93006 was merged
34 services.udev.packages = [ cfg.package.out ];
35 })
36 (mkIf cfg.dmeventd.enable {
37 systemd.sockets."dm-event".wantedBy = [ "sockets.target" ];
38 systemd.services."lvm2-monitor".wantedBy = [ "sysinit.target" ];
39
40 environment.etc."lvm/lvm.conf".text = ''
41 dmeventd/executable = "${cfg.package}/bin/dmeventd"
42 '';
43 })
44 (mkIf cfg.boot.thin.enable {
45 boot.initrd = {
46 kernelModules = [ "dm-snapshot" "dm-thin-pool" ];
47
48 extraUtilsCommands = ''
49 for BIN in ${pkgs.thin-provisioning-tools}/bin/*; do
50 copy_bin_and_libs $BIN
51 done
52 '';
53
54 extraUtilsCommandsTest = ''
55 ls ${pkgs.thin-provisioning-tools}/bin/ | grep -v pdata_tools | while read BIN; do
56 $out/bin/$(basename $BIN) --help > /dev/null
57 done
58 '';
59 };
60
61 environment.etc."lvm/lvm.conf".text = concatMapStringsSep "\n"
62 (bin: "global/${bin}_executable = ${pkgs.thin-provisioning-tools}/bin/${bin}")
63 [ "thin_check" "thin_dump" "thin_repair" "cache_check" "cache_dump" "cache_repair" ];
64 })
65 (mkIf (cfg.dmeventd.enable || cfg.boot.thin.enable) {
66 boot.initrd.preLVMCommands = ''
67 mkdir -p /etc/lvm
68 cat << EOF >> /etc/lvm/lvm.conf
69 ${optionalString cfg.boot.thin.enable (
70 concatMapStringsSep "\n"
71 (bin: "global/${bin}_executable = $(command -v ${bin})")
72 [ "thin_check" "thin_dump" "thin_repair" "cache_check" "cache_dump" "cache_repair" ]
73 )
74 }
75 ${optionalString cfg.dmeventd.enable ''
76 dmeventd/executable = "$(command -v false)"
77 activation/monitoring = 0
78 ''}
79 EOF
80 '';
81 })
82 ];
83
84}