ddns-go: 6.7.7 -> 6.8.0 (#373902)
[NixPkgs.git] / nixos / modules / system / boot / grow-partition.nix
blobf9db7ccd68bc77da3b773c32eb421541533c5854
1 # This module automatically grows the root partition.
2 # This allows an instance to be created with a bigger root filesystem
3 # than provided by the machine image.
6   config,
7   lib,
8   pkgs,
9   ...
12 with lib;
15   imports = [
16     (mkRenamedOptionModule [ "virtualisation" "growPartition" ] [ "boot" "growPartition" ])
17   ];
19   options = {
20     boot.growPartition = mkEnableOption "growing the root partition on boot";
21   };
23   config = mkIf config.boot.growPartition {
24     assertions = [
25       {
26         assertion = !config.boot.initrd.systemd.repart.enable && !config.systemd.repart.enable;
27         message = "systemd-repart already grows the root partition and thus you should not use boot.growPartition";
28       }
29     ];
30     systemd.services.growpart = {
31       wantedBy = [ "-.mount" ];
32       after = [ "-.mount" ];
33       before = [
34         "systemd-growfs-root.service"
35         "shutdown.target"
36       ];
37       conflicts = [ "shutdown.target" ];
38       unitConfig.DefaultDependencies = false;
39       serviceConfig = {
40         Type = "oneshot";
41         RemainAfterExit = true;
42         TimeoutSec = "infinity";
43         # growpart returns 1 if the partition is already grown
44         SuccessExitStatus = "0 1";
45       };
47       script = ''
48         rootDevice="${config.fileSystems."/".device}"
49         rootDevice="$(readlink -f "$rootDevice")"
50         parentDevice="$rootDevice"
51         while [ "''${parentDevice%[0-9]}" != "''${parentDevice}" ]; do
52           parentDevice="''${parentDevice%[0-9]}";
53         done
54         partNum="''${rootDevice#"''${parentDevice}"}"
55         if [ "''${parentDevice%[0-9]p}" != "''${parentDevice}" ] && [ -b "''${parentDevice%p}" ]; then
56           parentDevice="''${parentDevice%p}"
57         fi
58         "${pkgs.cloud-utils.guest}/bin/growpart" "$parentDevice" "$partNum"
59       '';
60     };
61   };