summary refs log tree commit diff
diff options
context:
space:
mode:
authorArian van Putten <arian.vanputten@gmail.com>2023-10-16 11:57:34 +0000
committerArian van Putten <arian.vanputten@gmail.com>2023-10-19 12:34:27 +0000
commit80a578580fae24c59611091e45f4d04e7d626a2d (patch)
tree23a8303175557a14e2d7e02149424357f24d60e5
parentca012a02bf8327be9e488546faecae5e05d7d749 (diff)
downloadnixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.tar
nixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.tar.gz
nixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.tar.bz2
nixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.tar.lz
nixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.tar.xz
nixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.tar.zst
nixpkgs-80a578580fae24c59611091e45f4d04e7d626a2d.zip
nixos/grow-partition: Resize partition online instead of in initrd
There's no reason to do this in initrd. Partitions can be resized online.
We just have to make sure it happens before we resize the file system.

This also makes grow-partition work with systemd-initrd
-rw-r--r--nixos/modules/system/boot/grow-partition.nix54
1 files changed, 25 insertions, 29 deletions
diff --git a/nixos/modules/system/boot/grow-partition.nix b/nixos/modules/system/boot/grow-partition.nix
index a2764187a53..1ce4d5e5623 100644
--- a/nixos/modules/system/boot/grow-partition.nix
+++ b/nixos/modules/system/boot/grow-partition.nix
@@ -16,29 +16,28 @@ with lib;
   };
 
   config = mkIf config.boot.growPartition {
-
-    assertions = [{
-      assertion = !config.boot.initrd.systemd.enable;
-      message = "systemd stage 1 does not support 'boot.growPartition' yet.";
-    }];
-
-    boot.initrd.extraUtilsCommands = ''
-      copy_bin_and_libs ${pkgs.gawk}/bin/gawk
-      copy_bin_and_libs ${pkgs.gnused}/bin/sed
-      copy_bin_and_libs ${pkgs.util-linux}/sbin/sfdisk
-      copy_bin_and_libs ${pkgs.util-linux}/sbin/lsblk
-
-      substitute "${pkgs.cloud-utils.guest}/bin/.growpart-wrapped" "$out/bin/growpart" \
-        --replace "${pkgs.bash}/bin/sh" "/bin/sh" \
-        --replace "awk" "gawk" \
-        --replace "sed" "gnused"
-
-      ln -s sed $out/bin/gnused
-    '';
-
-    boot.initrd.postDeviceCommands = ''
-      rootDevice="${config.fileSystems."/".device}"
-      if waitDevice "$rootDevice"; then
+    assertions = [
+      {
+        assertion = !config.boot.initrd.systemd.repart.enable && !config.systemd.repart.enable;
+        message = "systemd-repart already grows the root partition and thus you should not use boot.growPartition";
+      }
+    ];
+    systemd.services.growpart = {
+      wantedBy = [ "-.mount" ];
+      after = [ "-.mount" ];
+      before = [ "systemd-growfs-root.service" ];
+      conflicts = [ "shutdown.target" ];
+      unitConfig.DefaultDependencies = false;
+      serviceConfig = {
+        Type = "oneshot";
+        RemainAfterExit = true;
+        TimeoutSec = "infinity";
+        # growpart returns 1 if the partition is already grown
+        SuccessExitStatus = "0 1";
+      };
+
+      script = ''
+        rootDevice="${config.fileSystems."/".device}"
         rootDevice="$(readlink -f "$rootDevice")"
         parentDevice="$rootDevice"
         while [ "''${parentDevice%[0-9]}" != "''${parentDevice}" ]; do
@@ -48,11 +47,8 @@ with lib;
         if [ "''${parentDevice%[0-9]p}" != "''${parentDevice}" ] && [ -b "''${parentDevice%p}" ]; then
           parentDevice="''${parentDevice%p}"
         fi
-        TMPDIR=/run sh $(type -P growpart) "$parentDevice" "$partNum"
-        udevadm settle
-      fi
-    '';
-
+        "${pkgs.cloud-utils.guest}/bin/growpart" "$parentDevice" "$partNum"
+      '';
+    };
   };
-
 }