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
This commit is contained in:
parent
ca012a02bf
commit
80a578580f
@ -16,29 +16,28 @@ with lib;
|
||||
};
|
||||
|
||||
config = mkIf config.boot.growPartition {
|
||||
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";
|
||||
};
|
||||
|
||||
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
|
||||
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"
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user