git: de79f47a408b - stable/15 - release: Enable installing packages as a non-root user

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Tue, 30 Sep 2025 15:23:31 UTC
The branch stable/15 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=de79f47a408b29c9b594e250ce49656b49c597e5

commit de79f47a408b29c9b594e250ce49656b49c597e5
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-09-16 16:05:06 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-09-30 09:43:07 +0000

    release: Enable installing packages as a non-root user
    
    Provide variables, PKG_REPOS_DIR and PKG_REPO_NAME, to allow the user to
    configure the source package repository.  Configure pkg to emit added
    files to a metalog which gets concatenated with the main metalog
    immediately before we build the root filesystem.
    
    Reviewed by:    cperciva, emaste
    MFC after:      3 days
    Sponsored by:   The FreeBSD Foundation
    Sponsored by:   Klara, Inc.
    Differential Revision:  https://reviews.freebsd.org/D52453
    
    (cherry picked from commit 5eb917426e0aab1e82c7b0e7239724d18bae206a)
---
 release/Makefile.vm        |  6 ++++++
 release/tools/vmimage.subr | 35 ++++++++++++++++++++++++++---------
 share/man/man7/release.7   | 15 ++++++++++++++-
 3 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/release/Makefile.vm b/release/Makefile.vm
index 8375650cd9aa..25c37ade1121 100644
--- a/release/Makefile.vm
+++ b/release/Makefile.vm
@@ -138,6 +138,9 @@ cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT}
 		EC2BASEIMG=${.OBJDIR}/${EC2-BASE${_FS:tu}${_FMT:tu}IMAGE} \
 		${WITHOUT_QEMU:DWITHOUT_QEMU=true} \
 		${NO_ROOT:DNO_ROOT=true} \
+		PKG_CMD=${PKG_CMD:Upkg} \
+		PKG_REPOS_DIR=${PKG_REPOS_DIR:U${.OBJDIR}/${.TARGET}/etc/pkg} \
+		PKG_REPO_NAME=${PKG_REPO_NAME:UFreeBSD-ports} \
 		PKG_INSTALL_EPOCH=${PKG_INSTALL_EPOCH:U${GITEPOCH}} \
 		${.CURDIR}/scripts/mk-vmimage.sh \
 		-C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
@@ -191,6 +194,9 @@ vm-image:	${QEMUTGT}
 		QEMUSTATIC=${QEMUSTATIC} \
 		${WITHOUT_QEMU:DWITHOUT_QEMU=true} \
 		${NO_ROOT:DNO_ROOT=true} \
+		PKG_CMD=${PKG_CMD:Upkg} \
+		PKG_REPOS_DIR=${PKG_REPOS_DIR:U${.OBJDIR}/${.TARGET}-${FORMAT}-${FS}/etc/pkg} \
+		PKG_REPO_NAME=${PKG_REPO_NAME:UFreeBSD-ports} \
 		PKG_INSTALL_EPOCH=${PKG_INSTALL_EPOCH:U${GITEPOCH}} \
 		${.CURDIR}/scripts/mk-vmimage.sh \
 		-C ${.CURDIR}/tools/vmimage.subr \
diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr
index 156987e33457..33a87eb55f53 100644
--- a/release/tools/vmimage.subr
+++ b/release/tools/vmimage.subr
@@ -151,19 +151,32 @@ vm_extra_enable_services() {
 }
 
 vm_extra_install_packages() {
-	if [ -n "${WITHOUT_QEMU}" ]; then
-		return 0
-	fi
-
 	if [ -z "${VM_EXTRA_PACKAGES}" ]; then
 		return 0
 	fi
-	chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \
-		/usr/sbin/pkg bootstrap -y
-	for p in ${VM_EXTRA_PACKAGES}; do
+	if [ -n "${NO_ROOT}" ]; then
+		for pkg in ${VM_EXTRA_PACKAGES}; do
+			INSTALL_AS_USER=yes \
+			${PKG_CMD} \
+			    -o METALOG=${DESTDIR}/METALOG.pkg \
+			    -o REPOS_DIR=${PKG_REPOS_DIR} \
+			    -o PKG_DBDIR=${DESTDIR}/var/db/pkg \
+			    -r ${DESTDIR} \
+			    install -y -r ${PKG_REPO_NAME} $pkg
+		done
+		metalog_add_data ./var/db/pkg/local.sqlite
+	else
+		if [ -n "${WITHOUT_QEMU}" ]; then
+			return 0
+		fi
+
 		chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \
-			/usr/sbin/pkg install -y ${p}
-	done
+			/usr/sbin/pkg bootstrap -y
+		for p in ${VM_EXTRA_PACKAGES}; do
+			chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \
+				/usr/sbin/pkg install -y ${p}
+		done
+	fi
 
 	return 0
 }
@@ -207,6 +220,10 @@ vm_extra_pkg_rmcache() {
 buildfs() {
 	local md tmppool
 
+	if [ -f ${DESTDIR}/METALOG.pkg ]; then
+		cat ${DESTDIR}/METALOG.pkg >> ${DESTDIR}/METALOG
+	fi
+
 	case "${VMFS}" in
 	ufs)
 		cd ${DESTDIR} && ${MAKEFS} ${MAKEFSARGS} -o label=rootfs -o version=2 -o softupdates=1 \
diff --git a/share/man/man7/release.7 b/share/man/man7/release.7
index 36c14afe0bf1..05f80374926f 100644
--- a/share/man/man7/release.7
+++ b/share/man/man7/release.7
@@ -22,7 +22,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd May 20, 2025
+.Dd September 11, 2025
 .Dt RELEASE 7
 .Os
 .Sh NAME
@@ -286,6 +286,19 @@ is expected to exist by alternative means.
 Include base system packages for use with
 .Xr pkg 8
 on the install media, instead of legacy tarball distribution sets.
+.It Va PKG_CMD
+A path to the
+.Xr pkg 8
+executable to use when installing packages in release images as a non-root user.
+.It Va PKG_REPOS_DIR
+An optional path to a directory containing
+.Xr pkg 8
+repository configuration files.
+These configuration files will be used when installing packages in release
+images as a non-root user.
+.It Va PKG_REPO_NAME
+The name of the repository configuration to use when installing packages in
+release images as a non-root user.
 .El
 .Sh EMBEDDED BUILDS
 The following