The branch main has been updated by emaste:

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

commit 4227d51b6e09ceaaae0f5832c85ec700d80ef18f
Author:     Isaac Freund <ifre...@freebsdfoundation.org>
AuthorDate: 2025-07-24 08:43:43 +0000
Commit:     Ed Maste <ema...@freebsd.org>
CommitDate: 2025-09-25 12:55:56 +0000

    release: create pkgbase VM and cloud images
    
    VM and cloud images are now built as packaged base systems by default,
    matching the default for installation media.
    
    Setting -DNOPKGBASE allows building as non-pkgbase systems.
    
    Reviewed by:    emaste
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D51483
---
 release/Makefile               |  3 ++-
 release/Makefile.vm            |  8 ++++++--
 release/tools/ec2-builder.conf |  9 +++++++++
 release/tools/ec2-small.conf   |  9 +++++++++
 release/tools/vmimage.subr     | 36 ++++++++++++++++++++++++++++++++----
 5 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/release/Makefile b/release/Makefile
index fb2a60130700..d131a36157d7 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -23,7 +23,8 @@
 #            (by default, the directory above this one)
 #  NODISTSETS: if set, do not include dist sets or MANIFEST
 #  NOPKGBASE:  if set, include dist tarballs rather than pkgbase packages in
-#            disc1 and dvd1 installation media
+#            disc1 and dvd1 installation media and build VM/cloud images using
+#            make installkernel installworld.
 #  PORTSDIR: location of ports tree to distribute (default: /usr/ports)
 #  XTRADIR:  xtra-bits-dir argument for <arch>/mkisoimages.sh
 #  NOPKG:    if set, do not distribute third-party packages
diff --git a/release/Makefile.vm b/release/Makefile.vm
index 479547f76da1..eafd1d6abf71 100644
--- a/release/Makefile.vm
+++ b/release/Makefile.vm
@@ -126,7 +126,7 @@ ${_CW:tu}${_FS:tu}${_FMT:tu}IMAGE=  ${_CW:tl}.${_FS}.${_FMT}
 cw-${_CW:tl}-${_FS}-${_FMT}: cw-ec2-base-${_FS}-${_FMT}
 .endif
 
-cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT}
+cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT} ${PKGBASE_REPO_DIR}
        mkdir -p ${.OBJDIR}/${.TARGET}
        env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \
                QEMUSTATIC=${QEMUSTATIC} \
@@ -137,6 +137,8 @@ cw-${_CW:tl}-${_FS}-${_FMT}: ${QEMUTGT}
                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}} \
+               NOPKGBASE=${NOPKGBASE} \
+               PKGBASE_REPO_DIR=${.OBJDIR}/pkgbase-repo-dir \
                ${.CURDIR}/scripts/mk-vmimage.sh \
                -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
                -F ${"${_CW:MEC2-BUILDER}" != "":?ufs:${_FS}} \
@@ -180,7 +182,7 @@ CLEANFILES+=        ${VMBASE}.${FS}.${FORMAT}
 
 vm-base:       vm-image
 
-vm-image:      ${QEMUTGT}
+vm-image:      ${QEMUTGT} ${PKGBASE_REPO_DIR}
 .if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
 . for FORMAT in ${VMFORMATS}
 .  for FS in ${VMFSLIST}
@@ -193,6 +195,8 @@ vm-image:   ${QEMUTGT}
                
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}} \
+               NOPKGBASE=${NOPKGBASE} \
+               PKGBASE_REPO_DIR=${.OBJDIR}/pkgbase-repo-dir \
                ${.CURDIR}/scripts/mk-vmimage.sh \
                -C ${.CURDIR}/tools/vmimage.subr \
                -d ${.OBJDIR}/${.TARGET}-${FORMAT}-${FS} -F ${FS} \
diff --git a/release/tools/ec2-builder.conf b/release/tools/ec2-builder.conf
index 993dffc565eb..cf4276fc80ec 100644
--- a/release/tools/ec2-builder.conf
+++ b/release/tools/ec2-builder.conf
@@ -11,6 +11,15 @@ export VMSIZE=8000m
 export INSTALLOPTS="WITHOUT_DEBUG_FILES=YES WITHOUT_KERNEL_SYMBOLS=YES \
     WITHOUT_LIB32=YES WITHOUT_TESTS=YES WITHOUT_LLDB=YES"
 
+# Equivalent to INSTALLOPTS for pkgbase
+vm_extra_filter_base_packages() {
+       grep -v \
+               -e '.*-dbg$' \
+               -e '.*-lib32$' \
+               -e '^FreeBSD-tests.*' \
+               -e '^FreeBSD-lldb.*'
+}
+
 # Packages to install into the image we're creating.  In addition to packages
 # present on all EC2 AMIs, we install:
 # * ec2-scripts, which provides a range of EC2ification startup scripts,
diff --git a/release/tools/ec2-small.conf b/release/tools/ec2-small.conf
index e2a348d6ba8f..32d02cbb79e4 100644
--- a/release/tools/ec2-small.conf
+++ b/release/tools/ec2-small.conf
@@ -14,6 +14,15 @@ export VMSIZE=5000m
 export INSTALLOPTS="WITHOUT_DEBUG_FILES=YES WITHOUT_KERNEL_SYMBOLS=YES \
     WITHOUT_LIB32=YES WITHOUT_TESTS=YES WITHOUT_LLDB=YES"
 
+# Equivalent to INSTALLOPTS for pkgbase
+vm_extra_filter_base_packages() {
+       grep -v \
+               -e '.*-dbg$' \
+               -e '.*-lib32$' \
+               -e '^FreeBSD-tests.*' \
+               -e '^FreeBSD-lldb.*'
+}
+
 # Packages to install into the image we're creating.  In addition to packages
 # present on all EC2 AMIs, we install:
 # * ec2-scripts, which provides a range of EC2ification startup scripts,
diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr
index b3187efd6526..577abaac73cf 100644
--- a/release/tools/vmimage.subr
+++ b/release/tools/vmimage.subr
@@ -70,13 +70,41 @@ vm_copy_base() {
        return 0
 }
 
+vm_filter_base_packages() {
+       # Reads a list of all base system packages from stdin.
+       # Writes a list of base system packages to install to stdout.
+       grep -v -e '^FreeBSD-src.*' -e '^FreeBSD-kernel.*'
+       # There are several kernel variants available in separate packages.
+       # For VMs it is sufficient to install only the generic kernel.
+       echo "FreeBSD-kernel-man"
+       echo "FreeBSD-kernel-generic"
+       echo "FreeBSD-kernel-generic-dbg"
+}
+
+vm_extra_filter_base_packages() {
+       # Prototype. When overridden, allows further filtering of base system
+       # packages, reading package names from stdin and writing to stdout.
+       cat
+}
+
 vm_install_base() {
        # Installs the FreeBSD userland/kernel to the virtual machine disk.
 
-       cd ${WORLDDIR} && \
-               make DESTDIR=${DESTDIR} ${INSTALLOPTS} \
-               installworld installkernel distribution || \
-               err "\n\nCannot install the base system to ${DESTDIR}."
+       if [ -z "${NOPKGBASE}" ]; then
+               local pkg_cmd
+               pkg_cmd="pkg --rootdir ${DESTDIR} --repo-conf-dir 
${PKGBASE_REPO_DIR}
+                       -o ASSUME_ALWAYS_YES=yes -o IGNORE_OSVERSION=yes
+                       -o INSTALL_AS_USER=yes "
+               $pkg_cmd update
+               selected=$($pkg_cmd rquery -U -r FreeBSD-base %n | \
+                       vm_filter_base_packages | vm_extra_filter_base_packages)
+               $pkg_cmd install -U -r FreeBSD-base $selected
+       else
+               cd ${WORLDDIR} && \
+                       make DESTDIR=${DESTDIR} ${INSTALLOPTS} \
+                       installworld installkernel distribution || \
+                       err "\n\nCannot install the base system to ${DESTDIR}."
+       fi
 
        # Bootstrap etcupdate(8) database.
        mkdir -p ${DESTDIR}/var/db/etcupdate

Reply via email to