xz → lz4 for mksquashfs: kernel modloop rebuild is ~10x faster. Size increase is acceptable since modloop is loaded into RAM. Applied in both setup-builder.sh and build-debug.sh. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
133 lines
3.4 KiB
Bash
133 lines
3.4 KiB
Bash
#!/bin/sh
|
|
# setup-builder.sh — prepare Alpine VM as bee ISO builder
|
|
#
|
|
# Run once on a fresh Alpine 3.21 VM as root.
|
|
# After this script completes, the VM can build ISO images.
|
|
#
|
|
# Usage (on Alpine VM):
|
|
# wget -O- https://git.mchus.pro/mchus/bee/raw/branch/main/iso/builder/setup-builder.sh | sh
|
|
# or: sh setup-builder.sh
|
|
|
|
set -e
|
|
|
|
. "$(dirname "$0")/VERSIONS" 2>/dev/null || true
|
|
GO_VERSION="${GO_VERSION:-1.23.6}"
|
|
|
|
echo "=== bee builder setup ==="
|
|
echo "Alpine: $(cat /etc/alpine-release)"
|
|
echo "Go target: ${GO_VERSION}"
|
|
echo ""
|
|
|
|
# --- system packages ---
|
|
apk update
|
|
# enable community repo if not already enabled
|
|
sed -i 's|^#\(.*community\)|\1|' /etc/apk/repositories
|
|
|
|
apk update
|
|
apk add \
|
|
alpine-sdk \
|
|
abuild \
|
|
squashfs-tools \
|
|
xorriso \
|
|
mtools \
|
|
grub \
|
|
grub-efi \
|
|
grub-bios \
|
|
git \
|
|
wget \
|
|
curl \
|
|
tar \
|
|
xz
|
|
|
|
# --- audit runtime packages (verify they exist in Alpine repos) ---
|
|
echo ""
|
|
echo "=== verifying audit runtime packages ==="
|
|
RUNTIME_PKGS="
|
|
dmidecode
|
|
smartmontools
|
|
nvme-cli
|
|
pciutils
|
|
ipmitool
|
|
util-linux
|
|
e2fsprogs
|
|
qrencode
|
|
dropbear
|
|
udhcpc
|
|
pciutils-libs
|
|
lshw
|
|
"
|
|
MISSING=""
|
|
for pkg in $RUNTIME_PKGS; do
|
|
if apk info --quiet "$pkg" 2>/dev/null || apk search --quiet "$pkg" 2>/dev/null | grep -q "^${pkg}-"; then
|
|
echo " OK: $pkg"
|
|
else
|
|
echo " MISSING: $pkg"
|
|
MISSING="$MISSING $pkg"
|
|
fi
|
|
done
|
|
if [ -n "$MISSING" ]; then
|
|
echo ""
|
|
echo "WARNING: missing packages:$MISSING"
|
|
echo "These will not be available in the ISO."
|
|
fi
|
|
|
|
# --- Go toolchain ---
|
|
echo ""
|
|
echo "=== installing Go ${GO_VERSION} ==="
|
|
if [ -d /usr/local/go ] && /usr/local/go/bin/go version 2>/dev/null | grep -q "${GO_VERSION}"; then
|
|
echo "Go ${GO_VERSION} already installed"
|
|
else
|
|
ARCH=$(uname -m)
|
|
case "$ARCH" in
|
|
x86_64) GOARCH=amd64 ;;
|
|
aarch64) GOARCH=arm64 ;;
|
|
*) echo "unsupported arch: $ARCH"; exit 1 ;;
|
|
esac
|
|
wget -O /tmp/go.tar.gz \
|
|
"https://go.dev/dl/go${GO_VERSION}.linux-${GOARCH}.tar.gz"
|
|
rm -rf /usr/local/go
|
|
tar -C /usr/local -xzf /tmp/go.tar.gz
|
|
rm /tmp/go.tar.gz
|
|
fi
|
|
export PATH="$PATH:/usr/local/go/bin"
|
|
echo "Go: $(go version)"
|
|
|
|
# --- alpine-conf for mkimage ---
|
|
apk add alpine-conf
|
|
|
|
# --- aports for mkimage.sh ---
|
|
if [ ! -d /usr/share/aports ]; then
|
|
echo ""
|
|
echo "=== cloning aports ==="
|
|
git clone --depth=1 --branch "v${ALPINE_VERSION:-3.21}.0" \
|
|
https://gitlab.alpinelinux.org/alpine/aports.git \
|
|
/usr/share/aports
|
|
fi
|
|
|
|
# --- abuild signing key (required by mkimage.sh) ---
|
|
if [ ! -f "${HOME}/.abuild/abuild.conf" ]; then
|
|
echo ""
|
|
echo "=== generating abuild signing key ==="
|
|
mkdir -p "${HOME}/.abuild"
|
|
abuild-keygen -a -n 2>/dev/null || true
|
|
# abuild-keygen requires doas to install the key system-wide; do it manually
|
|
PUB=$(ls "${HOME}/.abuild/"*.pub 2>/dev/null | head -1)
|
|
if [ -n "$PUB" ]; then
|
|
cp "$PUB" /etc/apk/keys/
|
|
PRIV="${PUB%.pub}"
|
|
echo "PACKAGER_PRIVKEY=\"${PRIV}\"" > "${HOME}/.abuild/abuild.conf"
|
|
echo "abuild key: $PRIV"
|
|
else
|
|
echo "WARNING: abuild key generation failed"
|
|
fi
|
|
fi
|
|
|
|
# --- mkinitfs: use lz4 compression for faster modloop builds ---
|
|
mkdir -p /etc/mkinitfs
|
|
grep -q 'MKSQUASHFS_OPTS' /etc/mkinitfs/mkinitfs.conf 2>/dev/null || \
|
|
echo 'MKSQUASHFS_OPTS="-comp lz4 -Xhc"' >> /etc/mkinitfs/mkinitfs.conf
|
|
|
|
echo ""
|
|
echo "=== builder setup complete ==="
|
|
echo "Next: sh iso/builder/build-debug.sh"
|