Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions config/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Configuration Directory

This directory contains the build-time configuration files, templates, and data consumed by the Armbian build framework.

- `ARMBIAN_CACHE_DIR` (default `/armbian/cache`): Host path that, when present, is bind-mounted into the chroot at `/armbian/cache` to share downloaded artifacts (keyrings, packages, etc.) between builds. Override this if your cache lives elsewhere or needs to be relocated for containerized builds.
63 changes: 54 additions & 9 deletions lib/functions/general/chroot-helpers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,59 @@ function mount_chroot() {
display_alert "mount_chroot called outside of logging section..." "mount_chroot '$1'\n$(stack_color="${magenta_color:-}" show_caller_full)" "warn"
fi

local target
local target cache_src
target="$(realpath "$1")" # normalize, remove last slash if dir
display_alert "mount_chroot" "$target" "debug"
mkdir -p "${target}/run/user/0"
if ! mkdir -p "${target}/run/user/0"; then
display_alert "Failed to prepare chroot runtime directory" "${target}/run/user/0" "err"
return 1
fi

# tmpfs size=50% is the Linux default, but we need more.
mount -t tmpfs -o "size=99%" tmpfs "${target}/tmp"
mount -t tmpfs -o "size=99%" tmpfs "${target}/var/tmp"
mount -t tmpfs -o "size=99%" tmpfs "${target}/run/user/0"
mount -t proc chproc "${target}"/proc
mount -t sysfs chsys "${target}"/sys
mount --bind /dev "${target}"/dev
mount -t devpts chpts "${target}"/dev/pts || mount --bind /dev/pts "${target}"/dev/pts
if ! mountpoint -q "${target}/tmp" && ! mount -t tmpfs -o "size=99%" tmpfs "${target}/tmp"; then
display_alert "Failed to mount tmpfs inside chroot" "${target}/tmp" "err"
return 1
fi
if ! mountpoint -q "${target}/var/tmp" && ! mount -t tmpfs -o "size=99%" tmpfs "${target}/var/tmp"; then
display_alert "Failed to mount tmpfs inside chroot" "${target}/var/tmp" "err"
return 1
fi
if ! mountpoint -q "${target}/run/user/0" && ! mount -t tmpfs -o "size=99%" tmpfs "${target}/run/user/0"; then
display_alert "Failed to mount tmpfs inside chroot" "${target}/run/user/0" "err"
return 1
fi
if ! mountpoint -q "${target}/proc" && ! mount -t proc chproc "${target}/proc"; then
display_alert "Failed to mount proc inside chroot" "${target}/proc" "err"
return 1
fi
if ! mountpoint -q "${target}/sys" && ! mount -t sysfs chsys "${target}/sys"; then
display_alert "Failed to mount sysfs inside chroot" "${target}/sys" "err"
return 1
fi
if ! mountpoint -q "${target}/dev" && ! mount --bind /dev "${target}/dev"; then
display_alert "Failed to bind /dev into chroot" "${target}/dev" "err"
return 1
fi
if ! mountpoint -q "${target}/dev/pts" && ! mount -t devpts chpts "${target}/dev/pts" && ! mount --bind /dev/pts "${target}/dev/pts"; then
display_alert "Failed to mount devpts inside chroot" "${target}/dev/pts" "err"
return 1
fi

# Bind host cache into chroot if present (configurable via ARMBIAN_CACHE_DIR)
cache_src="${ARMBIAN_CACHE_DIR:-/armbian/cache}"
if [[ -d "${cache_src}" ]]; then
if ! mkdir -p "${target}/armbian/cache"; then
display_alert "Failed to create cache mountpoint" "${target}/armbian/cache" "warn"
elif mountpoint -q "${target}/armbian/cache"; then
display_alert "Cache already mounted — skipping cache bind" "${target}/armbian/cache" "debug"
else
if ! mount --bind "${cache_src}" "${target}/armbian/cache"; then
display_alert "Cache bind failed" "${cache_src} -> ${target}/armbian/cache" "warn"
fi
fi
else
display_alert "Host cache not found — skipping cache mount" "${cache_src}" "warn"
fi
}

# umount_chroot <target>
Expand All @@ -36,6 +76,11 @@ function umount_chroot() {
local target
target="$(realpath "$1")" # normalize, remove last slash if dir
display_alert "Unmounting" "$target" "info"

if mountpoint -q "${target}/armbian/cache"; then
umount "${target}/armbian/cache" || true
fi

while grep -Eq "${target}\/(dev|proc|sys|tmp|var\/tmp|run\/user\/0)" /proc/mounts; do
display_alert "Unmounting..." "target: ${target}" "debug"
umount "${target}"/dev/pts || true
Expand Down