Commit ad19cee0 authored by nikstur's avatar nikstur
Browse files

nixos/image/repart: assert maximum label length

The maximum label length is specified by UEFI and enforced/asserted by
systemd-repart. This lets evaluation fail already and give the user
some more information about what's wrong.

Also warn when the suggested label length is exceeded. This serves as a
safety mechanism for using systemd-sysupdate style A/B updates where the
version number is encoded in the label and might not be incrementable
when the maximum label size is reached.
parent 4c397ea6
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
let
  cfg = config.image.repart;

  inherit (utils.systemdUtils.lib) GPTMaxLabelLength;

  partitionOptions = {
    options = {
      storePaths = lib.mkOption {
@@ -224,6 +226,42 @@ in

  config = {

    assertions = lib.mapAttrsToList (fileName: partitionConfig:
      let
        inherit (partitionConfig) repartConfig;
        labelLength = builtins.stringLength repartConfig.Label;
      in
      {
        assertion = repartConfig ? Label -> GPTMaxLabelLength >= labelLength;
        message = ''
          The partition label '${repartConfig.Label}'
          defined for '${fileName}' is ${toString labelLength} characters long,
          but the maximum label length supported by UEFI is ${toString
          GPTMaxLabelLength}.
        '';
      }
    ) cfg.partitions;

    warnings = lib.filter (v: v != null) (lib.mapAttrsToList (fileName: partitionConfig:
      let
        inherit (partitionConfig) repartConfig;
        suggestedMaxLabelLength = GPTMaxLabelLength - 2;
        labelLength = builtins.stringLength repartConfig.Label;
      in
        if (repartConfig ? Label && labelLength >= suggestedMaxLabelLength) then ''
          The partition label '${repartConfig.Label}'
          defined for '${fileName}' is ${toString labelLength} characters long.
          The suggested maximum label length is ${toString
          suggestedMaxLabelLength}.

          If you use sytemd-sysupdate style A/B updates, this might
          not leave enough space to increment the version number included in
          the label in a future release. For example, if your label is
          ${toString GPTMaxLabelLength} characters long (the maximum enforced by UEFI) and
          you're at version 9, you cannot increment this to 10.
        '' else null
    ) cfg.partitions);

    image.repart =
      let
        version = config.image.repart.version;