Unverified Commit 80cafa6a authored by nikstur's avatar nikstur Committed by GitHub
Browse files

Merge pull request #302590 from nikstur/repart-image-label-length

nixos/image/repart: assert maximum label length
parents 9a7afcba ad19cee0
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -525,4 +525,9 @@ in rec {
      )}
    '';

  # The maximum number of characters allowed in a GPT partition label. This
  # limit is specified by UEFI and enforced by systemd-repart.
  # Corresponds to GPT_LABEL_MAX from systemd's gpt.h.
  GPTMaxLabelLength = 36;

}
+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;
+3 −3
Original line number Diff line number Diff line
@@ -13,14 +13,14 @@ let

  partitionAssertions = lib.mapAttrsToList (fileName: definition:
    let
      maxLabelLength = 36; # GPT_LABEL_MAX defined in systemd's gpt.h
      inherit (utils.systemdUtils.lib) GPTMaxLabelLength;
      labelLength = builtins.stringLength definition.Label;
    in
    {
      assertion = definition ? Label -> maxLabelLength >= labelLength;
      assertion = definition ? Label -> GPTMaxLabelLength >= labelLength;
      message = ''
        The partition label '${definition.Label}' defined for '${fileName}' is ${toString labelLength}
        characters long, but the maximum label length supported by systemd is ${toString maxLabelLength}.
        characters long, but the maximum label length supported by systemd is ${toString GPTMaxLabelLength}.
      '';
    }
  ) cfg.partitions;