- OS: Ubuntu 22.04 or newer
- RAM: At least 4GB (8GB recommended)
- Disk Space: At least 20GB free
- CPU: x86_64 or ARM64 architecture
- Privileges: Root/sudo access
The build script will install dependencies automatically, but you can pre-install:
sudo apt-get update
sudo apt-get install -y qemu-utils kpartx parted guestfs-toolspostgres-vm-images/
├── build.sh # Main build script
├── common/
│ ├── setup_base.sh # PostgreSQL repos & base packages
│ ├── setup_packages.sh # WAL-G & pguint compilation
│ ├── setup_monitoring.sh # Prometheus stack
│ ├── setup_cleanup.sh # Final cleanup
│ └── assets/ # Package lists & service files
└── flavors/
├── standard/ # Standard PostgreSQL image
└── paradedb/ # ParadeDB flavor
# Build standard flavor with 8GB disk
sudo ./build.sh standard 8
# Build paradedb flavor with 10GB disk
sudo ./build.sh paradedb 10| Parameter | Default | Description |
|---|---|---|
flavor |
standard |
Image flavor (standard, paradedb) |
size_gb |
8 |
Final image size in GB |
The build uses a direct mount + chroot approach for native-speed execution:
- Download Ubuntu 22.04 cloud image
- Resize image using virt-resize (only libguestfs operation)
- Mount image via loop device + kpartx
- Chroot into mounted filesystem
- Execute setup scripts at native CPU speed:
setup_base.sh- PostgreSQL APT repo, base packagessetup_packages.sh- Build WAL-G and pguint from sourcesetup_monitoring.sh- Prometheus, node_exporter, postgres_exporter- Flavor-specific
setup.sh setup_cleanup.sh- Clean apt cache, logs
- Cleanup - Zero-fill, unmount, detach loop device
| Architecture | Typical Time |
|---|---|
| x86_64 | ~12-15 minutes |
| ARM64 | ~18-22 minutes |
WAL-G compilation is the longest step (~5-8 minutes).
After successful build:
postgres-standard-x64-image.raw # x86_64 build
postgres-standard-arm64-image.raw # ARM64 build
sudo chmod 0644 /boot/vmlinuz*# List active loop devices
losetup -a
# Clean up stale mappings
sudo kpartx -d /dev/loopX
sudo losetup -d /dev/loopX# Clean up mounts
sudo umount -R /mnt/image 2>/dev/null
sudo kpartx -d /dev/loop* 2>/dev/null
sudo losetup -D
# Remove partial files
rm -f cloud.img cloud.raw resized.img# Run with QEMU
qemu-system-x86_64 \
-enable-kvm \
-m 4096 \
-drive file=postgres-standard-x64-image.raw,format=raw \
-nographic# To QCOW2 (smaller file size)
qemu-img convert -f raw -O qcow2 image.raw image.qcow2
# To VHD (Azure/Hyper-V)
qemu-img convert -f raw -O vpc image.raw image.vhd