Hello,

I am updating a 15-CURRENT host from
1016b3c344350fa5968f16852e5e4e388c51d817[1] (2025-03-08 18:28:50 +0000)
to 
63578bf225df37944b78febfb177e8c1c81f54e4[2] (2025-04-12 19:50:06 +0000).
My update process is as follows:

$ cat /home/agh/tasks/update-host
#!/bin/sh -ex

UPDATE_HOST_HOST="$(hostname -s)"

(cd /usr/src && \
        env MAKEOBJDIRPREFIX=/tmp/${UPDATE_HOST_HOST} make -j64
buildworld && \
        env MAKEOBJDIRPREFIX=/tmp/${UPDATE_HOST_HOST} make -j64
buildkernel)

(echo "env MAKEOBJDIRPREFIX=/tmp/${UPDATE_HOST_HOST} make
installkernel")
(echo "env MAKEOBJDIRPREFIX=/tmp/${UPDATE_HOST_HOST} make installworld")

You can see that I build kernel, and world from a non-root user, into a
tmpfs prefix.

/usr/src is mounted read-only from a NFS exported checkout. The git
checkout is owned by a non-root user:
$ mount -p | grep  "/usr/src"
/exports/fafnir/git/freebsd/src/main /usr/src           nullfs  ro      
       0 0

After the build processes complete, I then switch to root, to start the
upgrade:

$ doas su -
# cd /usr/src
# etcupdate -p
# env MAKEOBJDIRPREFIX=/tmp/fafnir make installkernel
# env MAKEOBJDIRPREFIX=/tmp/fafnir make installworld
# etcupdate

Here etcupdate exits with, "Failed to build new tree."

I used git bisect to find the commit[3] where my update process broke:
commit 49bc071f40886af46eb90467dfef6cba5f95beec
Author: Mark Johnston <ma...@freebsd.org>
Date:   Mon Apr 7 12:42:08 2025 +0000

    nsswitch.conf: Avoid modification after installation

    To implement WITHOUT_NIS, we have a hack in the build which modifies
the
    installed nsswitch.conf to remove NIS compat providers and
databases.
    This hack operates on the installed nsswitch.conf, which means that
the
    installed file size won't match that listed in the metalog.

    One option would be to maintain two copies of nsswitch.conf, one for
    each configuration, but that would result in duplication and I don't
see
    a clear way around that.

    Instead, stage a copy of nsswitch.conf in the libc objdir, and
modify
    that one before installing, so that the version recorded in the
metalog
    matches what actually gets installed.

    PR:             209718
    Reviewed by:    kevans, emaste
    Sponsored by:   Klara, Inc.
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D49300

Is my update process flawed? Is updating from a read-only ${SRC} not an
option anymore, or never was meant to be an option? Is it possible
configure etcupdate to build the current tree in a custom build prefix?

A snippet from the etcupdate log:
# tail -n40 /var/db/etcupdate/log
===> lib/csu (installconfig)
===> lib/csu/amd64 (installconfig)
===> lib/libc (installconfig)
installing DIRS CONFSDIR
install -N /usr/src/etc  -d -m 0755 -o root  -g wheel 
/var/db/etcupdate/etcupdate-JN3IPm7/etc
install -N /usr/src/etc  -C -o root  -g wheel -m 644  /usr/src/etc/group
/var/db/etcupdate/etcupdate-JN3IPm7/etc/group
install -N /usr/src/etc  -C -o root  -g wheel -m 600 
/usr/src/etc/master.passwd
/var/db/etcupdate/etcupdate-JN3IPm7/etc/master.passwd
install -N /usr/src/etc  -C -o root  -g wheel -m 644 
/usr/src/etc/shells /var/db/etcupdate/etcupdate-JN3IPm7/etc/shells
install -N /usr/src/etc  -C -o root  -g wheel -m 644  net/hosts
/var/db/etcupdate/etcupdate-JN3IPm7/etc/hosts
install -N /usr/src/etc  -C -o root  -g wheel -m 644  net/hosts.equiv
/var/db/etcupdate/etcupdate-JN3IPm7/etc/hosts.equiv
install -N /usr/src/etc  -C -o root  -g wheel -m 644  net/networks
/var/db/etcupdate/etcupdate-JN3IPm7/etc/networks
cp -f /usr/src/lib/libc/net/nsswitch.conf
/usr/src/lib/libc/nsswitch.conf
cp: /usr/src/lib/libc/nsswitch.conf: Read-only file system
*** Error code 1

Stop.
make[5]: stopped making "installconfig" in /usr/src/lib/libc
*** Error code 1

Stop.
make[4]: stopped making "installconfig" in /usr/src/lib
*** Error code 1

Stop.
make[3]: stopped making "installconfig" in /usr/src
*** Error code 1

Stop.
make[2]: stopped making "distribution" in /usr/src
*** Error code 1

Stop.
make[1]: stopped making "installetc" in /usr/src
*** Error code 1

Stop.
make: stopped making "installetc" in /usr/src
rm: /var/db/etcupdate/etcupdate-JN3IPm7/var/empty: Operation not
permitted
rm: /var/db/etcupdate/etcupdate-JN3IPm7/var: Directory not empty
rm: /var/db/etcupdate/etcupdate-JN3IPm7: Directory not empty

1:
https://cgit.freebsd.org./src/commit/?id=1016b3c344350fa5968f16852e5e4e388c51d817
2:
https://cgit.freebsd.org./src/commit/?id=63578bf225df37944b78febfb177e8c1c81f54e4
3:
https://cgit.freebsd.org./src/commit/?id=49bc071f40886af46eb90467dfef6cba5f95beec

--
To good health,
Alastair

Reply via email to