at 21.11-pre 2.5 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 = "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 copy_bin_and_libs ${pkgs.thin-provisioning-tools}/bin/pdata_tools 50 copy_bin_and_libs ${pkgs.thin-provisioning-tools}/bin/thin_check 51 ''; 52 }; 53 54 environment.etc."lvm/lvm.conf".text = '' 55 global/thin_check_executable = "${pkgs.thin-provisioning-tools}/bin/thin_check" 56 ''; 57 }) 58 (mkIf (cfg.dmeventd.enable || cfg.boot.thin.enable) { 59 boot.initrd.preLVMCommands = '' 60 mkdir -p /etc/lvm 61 cat << EOF >> /etc/lvm/lvm.conf 62 ${optionalString cfg.boot.thin.enable '' 63 global/thin_check_executable = "$(command -v thin_check)" 64 ''} 65 ${optionalString cfg.dmeventd.enable '' 66 dmeventd/executable = "$(command -v false)" 67 activation/monitoring = 0 68 ''} 69 EOF 70 ''; 71 }) 72 ]; 73 74}