54 lines
1.8 KiB
Nix
54 lines
1.8 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 "growing 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" "shutdown.target" ];
|
|
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"
|
|
'';
|
|
};
|
|
};
|
|
}
|