Date: Mon, 18 Jul 2016 02:13:57 +0000 (UTC) From: Will Andrews <will@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r302977 - head/tools/build Message-ID: <201607180213.u6I2DvL8003691@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: will Date: Mon Jul 18 02:13:57 2016 New Revision: 302977 URL: https://svnweb.freebsd.org/changeset/base/302977 Log: Add my beinstall script. This is meant to install a new BE (boot environment) given a fully built world/kernel. In addition to installing world and kernel in the new BE, it also automatically performs /etc updates (using etcupdate or mergemaster) and package updates (using pkg). Because this process is performed in a new BE, it reduces the need for a second reboot. It also means a reboot into a partially updated system (due to install or hardware failure) can't happen. Inspired by and similar in function to Solaris/illumos-style upgrades. Added: head/tools/build/beinstall.sh (contents, props changed) Added: head/tools/build/beinstall.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/tools/build/beinstall.sh Mon Jul 18 02:13:57 2016 (r302977) @@ -0,0 +1,153 @@ +#!/bin/sh +# +# Copyright (c) 2016 Will Andrews +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer +# in this position and unchanged. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# $FreeBSD$ +# +## +# Install a boot environment using the current FreeBSD source tree. +# Requires a fully built world & kernel. +# +# Non-base tools required: beadm, pkg +# +# In a sandbox for the new boot environment, this script also runs etcupdate +# and pkg upgrade automatically in the sandbox. Upon successful completion, +# the system will be ready to boot into the new boot environment. Upon +# failure, the target boot environment will be destroyed. In all cases, the +# running system is left untouched. +# +## Usage: +# beinstall [optional world/kernel flags e.g. KERNCONF] +# +## User modifiable variables - set these in the environment if desired. +# If not empty, 'pkg upgrade' will be skipped. +NO_PKG_UPGRADE="${NO_PKG_UPGRADE:-""}" +# Config updater - 'etcupdate' and 'mergemaster' are supported. Set to an +# empty string to skip. +CONFIG_UPDATER="${CONFIG_UPDATER:-"etcupdate"}" +# Flags for etcupdate if used. +ETCUPDATE_FLAGS="${ETCUPDATE_FLAGS:-"-F"}" +# Flags for mergemaster if used. +MERGEMASTER_FLAGS="${MERGEMASTER_FLAGS:-"-iFU"}" + + +######################################################################## +## Constants +ETCUPDATE_CMD="etcupdate" +MERGEMASTER_CMD="mergemaster" + +## Functions +cleanup() { + [ -z "${cleanup_commands}" ] && return + echo "Cleaning up ..." + for command in ${cleanup_commands}; do + ${command} + done +} + +errx() { + cleanup + echo "error: $*" + exit 1 +} + +rmdir_be() { + chflags -R noschg ${BE_MNTPT} + rm -rf ${BE_MNTPT} +} + +cleanup_be() { + beadm destroy -F ${BENAME} +} + +update_mergemaster() { + mergemaster -m $(pwd) -D ${BE_MNTPT} -t ${BE_MM_ROOT} ${MERGEMASTER_FLAGS} +} + +update_etcupdate() { + etcupdate -s $(pwd) -D ${BE_MNTPT} ${ETCUPDATE_FLAGS} || return $? + etcupdate resolve -D ${BE_MNTPT} +} + + +cleanup_commands="" +trap 'errx "Interrupt caught"' HUP INT TERM + +[ "$(whoami)" != "root" ] && errx "Must be run as root" + +[ ! -f "Makefile.inc1" ] && errx "Must be in FreeBSD source tree" +objdir=$(make -V .OBJDIR 2>/dev/null) +[ ! -d "${objdir}" ] && errx "Must have built FreeBSD from source tree" + +if [ -d .git ] ; then + commit_time=$(git show --format='%ct' 2>/dev/null | head -1) + [ $? -ne 0 ] && errx "Can't lookup git commit timestamp" + commit_ts=$(date -r ${commit_time} '+%Y%m%d.%H%M%S') +elif [ -d .svn ] ; then + commit_ts=$( svn info | awk '/Last Changed Date/ {print $4 "." $5}' | tr -d :- ) + [ $? -ne 0 ] && errx "Can't lookup Subversion commit timestamp" +else + errx "Unable to determine sandbox type" +fi + +commit_ver=$(${objdir}/bin/freebsd-version/freebsd-version -u 2>/dev/null) +[ -z "${commit_ver}" ] && errx "Unable to determine FreeBSD version" + +BENAME="${commit_ver}-${commit_ts}" + +BE_TMP=$(mktemp -d /tmp/beinstall.XXXXXX) +[ $? -ne 0 -o ! -d ${BE_TMP} ] && errx "Unable to create mountpoint" +[ -z "$NO_CLEANUP_BE" ] && cleanup_commands="rmdir_be ${cleanup_commands}" +BE_MNTPT=${BE_TMP}/mnt +BE_MM_ROOT=${BE_TMP}/mergemaster # mergemaster will create +mkdir -p ${BE_MNTPT} + +beadm create ${BENAME} >/dev/null || errx "Unable to create BE ${BENAME}" +[ -z "$NO_CLEANUP_BE" ] && cleanup_commands="cleanup_be ${cleanup_commands}" + +beadm mount ${BENAME} ${BE_TMP}/mnt || errx "Unable to mount BE ${BENAME}." + +echo "Mounted ${BENAME} to ${BE_MNTPT}, performing install/update ..." +make $* DESTDIR=${BE_MNTPT} installkernel || errx "Installkernel failed!" +make $* DESTDIR=${BE_MNTPT} installworld || errx "Installworld failed!" + +if [ -n "${CONFIG_UPDATER}" ]; then + "update_${CONFIG_UPDATER}" + [ $? -ne 0 ] && errx "${CONFIG_UPDATER} failed!" +fi + +BE_PKG="chroot ${BE_MNTPT} env ASSUME_ALWAYS_YES=true pkg" +if [ -z "${NO_PKG_UPGRADE}" ]; then + ${BE_PKG} update || errx "Unable to update pkg" + ${BE_PKG} upgrade || errx "Unable to upgrade pkgs" +fi + +beadm unmount ${BENAME} || errx "Unable to unmount BE" +rmdir_be +beadm activate ${BENAME} || errx "Unable to activate BE" +echo +beadm list +echo +echo "Boot environment ${BENAME} setup complete; reboot to use it."
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607180213.u6I2DvL8003691>