mirror of
https://github.com/photoprism/photoprism.git
synced 2025-09-27 05:08:13 +08:00
88 lines
2.5 KiB
Bash
Executable File
88 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Builds a PhotoPrismPi SD card image for use with Raspberry Pi 4 and 5.
|
|
|
|
# Stop the script if an error occurs.
|
|
set -e
|
|
|
|
echo "Building PhotoPrismPi SD card image..."
|
|
|
|
# Build directory:
|
|
DESTDIR=$(realpath "${1:-./setup/nas/raspberry-pi}")
|
|
|
|
# Ubuntu Server version and download URL:
|
|
UBUNTU_VERSION="${2:-24.04.2}"
|
|
UBUNTU_URL="https://cdimage.ubuntu.com/releases/${UBUNTU_VERSION}/release/ubuntu-${UBUNTU_VERSION}-preinstalled-server-arm64+raspi.img.xz"
|
|
|
|
# SD card image file name and path:
|
|
IMAGE_NAME="photoprismpi-ubuntu-${UBUNTU_VERSION}.img"
|
|
IMAGE_PATH="${DESTDIR}/${IMAGE_NAME}"
|
|
|
|
# Cloud init config path:
|
|
CONFIG_PATH="${DESTDIR}/cloud-init"
|
|
|
|
# Boot partition mount path:
|
|
MOUNT_DEV="/dev/nbd0"
|
|
MOUNT_PATH="${DESTDIR}/boot"
|
|
|
|
# Show image and build details.
|
|
echo "--------------------------------------------------------------------------------"
|
|
echo "VERSION: Ubuntu Server ${UBUNTU_VERSION} for Raspberry Pi"
|
|
echo "CDIMAGE: ${UBUNTU_URL}"
|
|
echo "DESTDIR: ${DESTDIR}"
|
|
echo "SDIMAGE: ${IMAGE_PATH}.xz"
|
|
echo "--------------------------------------------------------------------------------"
|
|
|
|
# Install build dependencies.
|
|
sudo apt update
|
|
sudo apt install -y qemu-utils xz-utils cloud-init
|
|
|
|
# Remove existing Ubuntu Server image, if any.
|
|
rm -f "${IMAGE_PATH}" "${IMAGE_PATH}.xz"
|
|
|
|
# Download latest Ubuntu Server image.
|
|
echo "Downloading Ubuntu Server image..."
|
|
curl -o "${IMAGE_PATH}.xz" -fsSL "${UBUNTU_URL}"
|
|
echo "Done."
|
|
|
|
# Unpack Ubuntu Server image.
|
|
echo "Unpacking ${IMAGE_NAME}.xz..."
|
|
(cd "${DESTDIR}" && unxz "${IMAGE_NAME}.xz")
|
|
echo "Done."
|
|
|
|
# Mount the boot partition to customize it.
|
|
echo "Mounting boot partition to ${MOUNT_PATH}..."
|
|
mkdir -p "${MOUNT_PATH}"
|
|
sudo umount -q "${MOUNT_PATH}" || true
|
|
|
|
if [[ -e "${MOUNT_DEV}p1" ]]; then
|
|
sudo qemu-nbd --disconnect "${MOUNT_DEV}" || true
|
|
fi
|
|
|
|
sleep 1
|
|
sudo modprobe nbd max_part=8
|
|
sudo qemu-nbd --connect="${MOUNT_DEV}" --format=raw "${IMAGE_PATH}"
|
|
sleep 3
|
|
sudo mount "${MOUNT_DEV}p1" "${MOUNT_PATH}"
|
|
echo "Done."
|
|
|
|
# Copy cloud-init files to the boot partition.
|
|
echo "Copying files to boot partition..."
|
|
sudo cp "${CONFIG_PATH}/meta-data" "${CONFIG_PATH}/network-config" "${CONFIG_PATH}/user-data" "${MOUNT_PATH}"
|
|
echo "Done."
|
|
|
|
# Unmount boot partition.
|
|
echo "Unmounting boot partition..."
|
|
sudo umount "${MOUNT_PATH}"
|
|
sleep 1
|
|
if [[ -e "${MOUNT_DEV}p1" ]]; then
|
|
sudo qemu-nbd --disconnect "${MOUNT_DEV}"
|
|
fi
|
|
sleep 1
|
|
rmdir "${MOUNT_PATH}"
|
|
echo "Done."
|
|
|
|
# Create the final SD card image.
|
|
echo "Creating ${IMAGE_PATH}.xz..."
|
|
xz -T0 -z -q -9 "${IMAGE_PATH}"
|
|
echo "Done." |