summary refs log tree commit diff
path: root/nixos/modules/tasks/swraid.nix
blob: 1c3f1db15099d700493b84fb394f10b19c07e991 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{ config, pkgs, lib, ... }: let

  cfg = config.boot.initrd.services.swraid;

in {

  options.boot.initrd.services.swraid = {
    enable = lib.mkEnableOption (lib.mdDoc "swraid support using mdadm") // {
      description = ''
        *This will only be used when systemd is used in stage 1.*

        Whether to enable swraid support using mdadm.
      '';
    };

    mdadmConf = lib.mkOption {
      description = lib.mdDoc "Contents of {file}`/etc/mdadm.conf` in initrd.";
      type = lib.types.lines;
      default = "";
    };
  };

  config = {
    environment.systemPackages = [ pkgs.mdadm ];

    services.udev.packages = [ pkgs.mdadm ];

    systemd.packages = [ pkgs.mdadm ];

    boot.initrd.availableKernelModules = lib.mkIf (config.boot.initrd.systemd.enable -> cfg.enable) [ "md_mod" "raid0" "raid1" "raid10" "raid456" ];

    boot.initrd.extraUdevRulesCommands = lib.mkIf (!config.boot.initrd.systemd.enable) ''
      cp -v ${pkgs.mdadm}/lib/udev/rules.d/*.rules $out/
    '';

    boot.initrd.systemd = lib.mkIf cfg.enable {
      contents."/etc/mdadm.conf" = lib.mkIf (cfg.mdadmConf != "") {
        text = cfg.mdadmConf;
      };

      packages = [ pkgs.mdadm ];
      initrdBin = [ pkgs.mdadm ];
    };

    boot.initrd.services.udev.packages = lib.mkIf cfg.enable [ pkgs.mdadm ];
  };
}