feat: add auto-grow-root service for live disk resize

Adds systemd service that automatically grows the root filesystem on boot:
- Detects partition layout and grows partition if needed (growpart)
- Supports both ext4 (resize2fs) and btrfs filesystems
- Works with VIRTIO-SCSI disk (/dev/sda)
- Enables seamless live disk resize from the hosting platform

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-05 22:11:35 +01:00
parent d933125dc0
commit 1989053908

View File

@@ -89,6 +89,38 @@
# Enable the OpenSSH daemon. # Enable the OpenSSH daemon.
services.openssh.enable = true; services.openssh.enable = true;
# Auto-grow root filesystem on boot (for live disk resize support)
# Works with VIRTIO-SCSI (/dev/sda) - detects partition layout automatically
systemd.services.auto-grow-root = {
description = "Auto-grow root filesystem";
wantedBy = [ "multi-user.target" ];
after = [ "local-fs.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
path = with pkgs; [ cloud-utils parted e2fsprogs btrfs-progs util-linux ];
script = ''
set -euo pipefail
ROOT_DEV=$(findmnt -n -o SOURCE /)
ROOT_DISK=$(lsblk -no PKNAME "$ROOT_DEV" | head -1)
# If partitioned, grow partition first
if [[ "$ROOT_DEV" =~ [0-9]$ ]]; then
PART_NUM=$(echo "$ROOT_DEV" | grep -oE '[0-9]+$')
growpart "/dev/$ROOT_DISK" "$PART_NUM" 2>/dev/null || true
fi
# Grow filesystem
FSTYPE=$(findmnt -n -o FSTYPE /)
case "$FSTYPE" in
ext4) resize2fs "$ROOT_DEV" 2>/dev/null || true ;;
btrfs) btrfs filesystem resize max / 2>/dev/null || true ;;
esac
'';
};
# This value determines the NixOS release from which the default # This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions # settings for stateful data, like file locations and database versions