{ config, lib, pkgs, utils, ... }: let requiredStratisFilesystems = lib.attrsets.filterAttrs (_: x: utils.fsNeededForBoot x && x.stratis.poolUuid != null) config.fileSystems; in { options = {}; config = lib.mkIf (requiredStratisFilesystems != {}) { assertions = [ { assertion = config.boot.initrd.systemd.enable; message = "stratis root fs requires systemd stage 1"; } ]; boot.initrd = { systemd = { storePaths = [ "${pkgs.stratisd}/lib/udev/stratis-base32-decode" "${pkgs.stratisd}/lib/udev/stratis-str-cmp" "${pkgs.lvm2.bin}/bin/dmsetup" "${pkgs.stratisd}/libexec/stratisd-min" "${pkgs.stratisd.initrd}/bin/stratis-rootfs-setup" ]; packages = [pkgs.stratisd.initrd]; extraBin = { thin_check = "${pkgs."thin-provisioning-tools"}/bin/thin_check"; thin_repair = "${pkgs."thin-provisioning-tools"}/bin/thin_repair"; thin_metadata_size = "${pkgs."thin-provisioning-tools"}/bin/thin_metadata_size"; stratis-min = "${pkgs.stratisd}/bin/stratis-min"; }; services = lib.attrsets.mapAttrs' ( mountPoint: fileSystem: { name = "stratis-setup-${fileSystem.stratis.poolUuid}"; value = { description = "setup for Stratis root filesystem"; unitConfig.DefaultDependencies = "no"; conflicts = [ "shutdown.target" "initrd-switch-root.target" ]; onFailure = [ "emergency.target" ]; unitConfig.OnFailureJobMode = "isolate"; wants = [ "stratisd-min.service" "plymouth-start.service" ]; wantedBy = [ "initrd.target" ]; after = [ "paths.target" "plymouth-start.service" "stratisd-min.service" ]; before = [ "initrd.target" "shutdown.target" "initrd-switch-root.target" ]; environment.STRATIS_ROOTFS_UUID = fileSystem.stratis.poolUuid; serviceConfig = { Type = "oneshot"; ExecStart = "${pkgs.stratisd.initrd}/bin/stratis-rootfs-setup"; RemainAfterExit = "yes"; }; }; } ) requiredStratisFilesystems; }; availableKernelModules = [ "dm-thin-pool" "dm-crypt" ] ++ [ "aes" "aes_generic" "blowfish" "twofish" "serpent" "cbc" "xts" "lrw" "sha1" "sha256" "sha512" "af_alg" "algif_skcipher" ]; services.udev.packages = [ pkgs.stratisd.initrd pkgs.lvm2 ]; }; }; }