at 22.05-pre 2.9 kB view raw
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}