0
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-07-14 14:10:33 +03:00
nixpkgs/nixos/modules/system/boot/grow-partition.nix
Arian van Putten 80a578580f 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
2023-10-19 12:34:27 +00:00

54 lines
1.7 KiB
Nix

# This module automatically grows the root partition.
# This allows an instance to be created with a bigger root filesystem
# than provided by the machine image.
{ config, lib, pkgs, ... }:
with lib;
{
imports = [
(mkRenamedOptionModule [ "virtualisation" "growPartition" ] [ "boot" "growPartition" ])
];
options = {
boot.growPartition = mkEnableOption (lib.mdDoc "grow the root partition on boot");
};
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";
};
script = ''
rootDevice="${config.fileSystems."/".device}"
rootDevice="$(readlink -f "$rootDevice")"
parentDevice="$rootDevice"
while [ "''${parentDevice%[0-9]}" != "''${parentDevice}" ]; do
parentDevice="''${parentDevice%[0-9]}";
done
partNum="''${rootDevice#''${parentDevice}}"
if [ "''${parentDevice%[0-9]p}" != "''${parentDevice}" ] && [ -b "''${parentDevice%p}" ]; then
parentDevice="''${parentDevice%p}"
fi
"${pkgs.cloud-utils.guest}/bin/growpart" "$parentDevice" "$partNum"
'';
};
};
}