Demonstrating core cloud concepts, starting with CaaS. Not for production use.
1#!/bin/bash
2
3set -e
4
5ALPINE_VERSION="v3.20"
6ARCH=$(uname -m)
7ROOTFS_DIR="alpine-podman-rootfs"
8ROOTFS_FILE="alpine-with-podman.ext4"
9ROOTFS_SIZE_MB=2048
10
11echo "--- Finding and fetching apk-tools-static for ${ARCH} ---"
12# Map uname arch to Alpine's arch naming
13case ${ARCH} in
14 x86_64) ALPINE_ARCH="x86_64" ;;
15 aarch64) ALPINE_ARCH="aarch64" ;;
16 *) echo "Unsupported architecture: ${ARCH}"; exit 1 ;;
17esac
18
19REPO_URL="https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/main/${ALPINE_ARCH}"
20
21APK_TOOLS_PKG=$(curl -sL "${REPO_URL}/APKINDEX.tar.gz" | tar -xz -O APKINDEX | grep -F 'P:apk-tools-static' -A1 | grep -F 'V:' | cut -d: -f2 | xargs -I{} echo "apk-tools-static-{}.apk")
22APK_TOOLS_URL="${REPO_URL}/${APK_TOOLS_PKG}"
23
24echo "Found package: ${APK_TOOLS_PKG}"
25echo "Downloading from: ${APK_TOOLS_URL}"
26
27curl -sL "${APK_TOOLS_URL}" | tar -xz -C . sbin/apk.static
28mv sbin/apk.static .
29rmdir sbin
30chmod +x apk.static
31
32echo "Successfully fetched ./apk.static"
33
34echo "--- Ensuring host has 'mkfs.ext4' (e2fsprogs) ---"
35if ! command -v mkfs.ext4 &> /dev/null; then
36 if command -v apt-get &> /dev/null; then
37 sudo apt-get update && sudo apt-get install -y e2fsprogs
38 elif command -v dnf &> /dev/null || command -v yum &> /dev/null; then
39 sudo yum install -y e2fsprogs
40 else
41 echo "Error: mkfs.ext4 not found. Please install 'e2fsprogs' manually."
42 exit 1
43 fi
44fi
45
46echo "--- Bootstrapping Alpine ${ALPINE_VERSION} with Podman ---"
47sudo rm -rf "${ROOTFS_DIR}"
48mkdir -p "${ROOTFS_DIR}"
49
50sudo ./apk.static \
51 -X "https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/main" \
52 -X "https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/community" \
53 -U --allow-untrusted --root "${ROOTFS_DIR}" \
54 --initdb add alpine-base openrc podman util-linux
55
56echo "--- Configuring the rootfs ---"
57echo "root:root" | sudo chroot "${ROOTFS_DIR}" chpasswd
58
59sudo chroot "${ROOTFS_DIR}" rc-update add cgroups default
60
61cat << EOF | sudo tee "${ROOTFS_DIR}/etc/fstab" > /dev/null
62proc /proc proc defaults 0 0
63sysfs /sys sysfs defaults 0 0
64EOF
65
66echo 'ttyS0::respawn:/sbin/agetty -L 115200 ttyS0 vt100' | sudo tee -a "${ROOTFS_DIR}/etc/inittab" > /dev/null
67
68echo "--- Creating ${ROOTFS_SIZE_MB}MB ext4 image: ${ROOTFS_FILE} ---"
69rm -f "${ROOTFS_FILE}"
70dd if=/dev/zero of="${ROOTFS_FILE}" bs=1M count=${ROOTFS_SIZE_MB}
71mkfs.ext4 "${ROOTFS_FILE}"
72
73echo "--- Mounting image and copying rootfs data ---"
74MOUNT_DIR=$(mktemp -d)
75sudo mount -o loop "${ROOTFS_FILE}" "${MOUNT_DIR}"
76(cd "${ROOTFS_DIR}" && sudo tar -cf - .) | (cd "${MOUNT_DIR}" && sudo tar -xf -)
77
78echo "--- Cleaning up ---"
79sudo umount "${MOUNT_DIR}"
80rm -rf "${MOUNT_DIR}"
81sudo rm -rf "${ROOTFS_DIR}"
82rm ./apk.static
83
84echo "Success! Rootfs created at ./${ROOTFS_FILE}"
85