Files
OrionOS/iso/docker/Dockerfile.arm64
T
nmemmertandClaude Sonnet 4.6 00c4914b7b Fix ARM64 boot: install official archiso mkinitcpio hooks into airootfs
The archiso mkinitcpio hooks live in initcpio/ at the repo root, not in
configs/releng/airootfs/ — so they were never in the ISO airootfs chroot.
ALARM has no archiso package either, so the chroot's mkinitcpio found no
archiso hook, built an initramfs without mount_handler logic, and the
default handler fired at boot with empty root= → "Failed to mount ''".

Dockerfile.arm64: preserve the official hooks from initcpio/ into
/usr/share/archiso/initcpio/ instead of deleting them with the repo.

entrypoint-arm64.sh: explicitly install the official hooks into the
airootfs overlay so the chroot mkinitcpio finds them when building the
initramfs. The official hooks use uname -m for arch detection and include
all required modules/binaries for squashfs live boot.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:34:02 -04:00

88 lines
3.8 KiB
Docker

# OrionOS ARM64 ISO builder
# Stage 1 (alpine): downloads the official Arch Linux ARM rootfs via bsdtar.
# Stage 2 (scratch): installs packages and compiles OrionOS natively in ALARM.
# ── Stage 1: fetch and verify ALARM rootfs ────────────────────────────
FROM --platform=linux/arm64 alpine:3.20 AS alarm-fetch
# libarchive-tools provides bsdtar, which preserves ALARM's merged-usr symlinks
# (BusyBox tar mishandles /bin → usr/bin symlinks in ALARM)
RUN apk add --no-cache curl libarchive-tools
RUN curl -fL --retry 3 --progress-bar \
http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz \
-o /tmp/alarm.tar.gz && \
mkdir /alarm-root && \
bsdtar -xpf /tmp/alarm.tar.gz -C /alarm-root && \
rm /tmp/alarm.tar.gz && \
test -f /alarm-root/usr/bin/bash || \
(echo "ERROR: ALARM extraction failed — /usr/bin/bash missing" && exit 1)
# ── Stage 2: Arch Linux ARM build environment ─────────────────────────
FROM --platform=linux/arm64 scratch
COPY --from=alarm-fetch /alarm-root/ /
# ALARM uses merged-usr (/bin → usr/bin symlink). Docker's default /bin/sh
# lookup fails when the symlink isn't resolved yet — use the absolute path.
SHELL ["/usr/bin/bash", "-c"]
# Ensure a working mirrorlist (the tarball ships with a stale/empty one)
RUN echo 'Server = http://mirror.archlinuxarm.org/$arch/$repo' > /etc/pacman.d/mirrorlist
# Add DisableSandbox inside [options] (not at file end where it lands in [aur])
RUN sed -i '/^\[options\]/a DisableSandbox' /etc/pacman.conf
RUN pacman-key --init && pacman-key --populate archlinuxarm
# archiso is not packaged for aarch64 in ALARM — install from upstream source.
# All other build deps are available in the standard ALARM repos.
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm \
base-devel \
libx11 \
libxft \
fontconfig \
freetype2 \
imlib2 \
imagemagick \
fakeroot \
git \
sudo \
mtools \
dosfstools \
libisoburn \
squashfs-tools \
arch-install-scripts \
e2fsprogs \
&& pacman -Scc --noconfirm
# Install archiso from upstream source (not packaged for aarch64 in ALARM).
# Manually copy what mkarchiso needs — skip 'make install' (requires rst2man).
# Also preserve the mkinitcpio hooks from initcpio/ so the entrypoint can
# install them into the ISO airootfs (the chroot has no archiso package, so
# the hooks must come from the airootfs overlay for mkinitcpio to use them).
RUN git clone --depth=1 https://gitlab.archlinux.org/archlinux/archiso.git /tmp/archiso && \
install -Dm755 /tmp/archiso/archiso/mkarchiso /usr/bin/mkarchiso && \
install -Dm755 /tmp/archiso/scripts/run_archiso.sh /usr/bin/run_archiso && \
install -d /usr/share/archiso && \
cp -a /tmp/archiso/configs /usr/share/archiso/ && \
install -Dm644 /tmp/archiso/initcpio/hooks/archiso /usr/share/archiso/initcpio/hooks/archiso && \
install -Dm644 /tmp/archiso/initcpio/install/archiso /usr/share/archiso/initcpio/install/archiso && \
rm -rf /tmp/archiso
# Pre-download linux-aarch64 and create a local pacman repo so mkarchiso
# can install the kernel without depending on the [alarm] mirror at build time.
RUN pacman -Sw --noconfirm linux-aarch64 && \
mkdir -p /alarm-local-repo && \
find /var/cache/pacman/pkg -name "linux-aarch64-*.pkg.tar.*" ! -name "*.sig" \
-exec cp {} /alarm-local-repo/ \; && \
repo-add /alarm-local-repo/alarm-local.db.tar.gz /alarm-local-repo/linux-aarch64-*.pkg.tar.*
WORKDIR /orionos
COPY . .
RUN make
RUN bash themes/wallpapers/generate-default.sh || true
ENTRYPOINT ["/orionos/iso/docker/entrypoint-arm64.sh"]