mirror-ublue-os-titanoboa/main.sh
Zeglius 5c457c3d05
feat!: Only use container images as the only source of truth (#138)
Signed-off-by: Zeglius <33781398+Zeglius@users.noreply.github.com>
2026-05-19 07:48:30 -07:00

76 lines
3.8 KiB
Bash
Executable file

#!/usr/bin/env -S bash -eo pipefail
#
# Project Titanoboa
#
# Description: Create bootable ISOs from bootc container images.
# Container-native ISO contract v0.1.0
# See https://github.com/ondrejbudai/bootc-isos/tree/main
#
# This spec is inspired by the layout of Fedora bootc images and Fedora live ISO images.
#
# - The kernel is expected to be in /usr/lib/module/*/vmlinuz. If there are multiple kernels, the behavior is unspecified. This is to be specified in a future version of this contract. The kernel is put in /images/pxeboot/vmlinuz in the ISO.
# - The initramfs is expected to be next to the kernel with the filename initramfs.img. The initramfs is put in /images/pxeboot/initrd.img.
# - The UEFI vendor is specified by a directory name in /usr/lib/efi/shim/*/EFI/$VENDOR. If there are multiple directories, the behaviour is unspecified. The BOOT directory is always ignored.
# - Shim and grub2 EFI binaries (shimx64.efi, mmx64.efi, gcdx64.efi) are expected to be in /boot/efi/EFI/$VENDOR.
# - GRUB2 modules are expected to be in /usr/lib/grub/i386-pc.
# - Required executables are podman, mksquashfs, xorriso, implantisomd5, grub2-mkimage, and python.
# - The container image is converted to a squashfs archive and put into /LiveOS/squashfs.img in the ISO.
# - Additional configuration can be written into /usr/lib/bootc-image-builder/iso.yaml in YAML format. The file currently supports 2 top-level keys:
# - label (string): Label of the ISO
# - grub2 (object): GRUB2 configuration, supports the following keys:
# - default (string): Default menu item
# - timeout (string): Default timeout (in seconds)
# - entries (array of objects): GRUB2 menu entries with the following keys (all are required):
# - name (string): Name of the entry
# - linux (string): Path to the kernel + kernel arguments (the path is always /images/pxeboot/vmlinuz in this version of this spec)
# - initrd (string): Path to the initramfs (the path is always /images/pxeboot/initrd.img in this version of this spec)
# - The --bootc-installer-payload-ref argument to image-builder can optionally be used to copy a container image from the host's container storage to /var/lib/containers/storage in the squashfs archive.
{
# Image to be injected on the iso as squashfs. Example: localhost/live_env:latest
TITANOBOA_CTR_IMAGE=${1:-${TITANOBOA_CTR_IMAGE}}
# Directory where the ISO will be stored
TITANOBOA_OUTPUT_DIR=${TITANOBOA_OUTPUT_DIR:-./output}
# Whenever Titanoboa is running inside a container
TITANOBOA_INSIDE_CONTAINER=${TITANOBOA_INSIDE_CONTAINER:-false}
SCRIPT_DIR=$(dirname "$0")
mkdir -p "$TITANOBOA_OUTPUT_DIR"
# If we are running inside a container
if [ "$TITANOBOA_INSIDE_CONTAINER" = "true" ]; then
TITANOBOA_OUTPUT_DIR=/output
if ! mountpoint -q "$TITANOBOA_OUTPUT_DIR"; then
echo "Error: output directory must be a volume mountpoint"
exit 1
fi
if ! mountpoint -q /usr/lib/containers/storage; then
echo "Error: /usr/lib/containers/storage must be a volume mountpoint"
exit 1
fi
if ! mountpoint -q /rootfs; then
echo "Error: /rootfs must be a volume mountpoint"
exit 1
fi
/app/bin/build_iso.sh
else
if [ -z "$TITANOBOA_CTR_IMAGE" ]; then
echo "Error: container image in param 1 nor TITANOBOA_CTR_IMAGE environment variable"
exit 1
fi
sudo podman run --rm -i \
--cap-add sys_admin --security-opt label=disable \
-v "$SCRIPT_DIR"/build_iso.sh:/src/build_iso.sh:ro \
--mount type=image,source="$TITANOBOA_CTR_IMAGE",dst=/rootfs \
-v "$TITANOBOA_OUTPUT_DIR":/output \
quay.io/fedora/fedora:latest /src/build_iso.sh
fi
} >&2
realpath "$TITANOBOA_OUTPUT_DIR"/*.iso | head -1