dc14ae4217
"bsdinstall script" will now do a pkgbase installation by default. The system components to install can be specified in the COMPONENTS variable, and have the same names as those used in the interactive installer. bsdinstall will still do a legacy distset installation if DISTRIBUTIONS is defined in the installerconfig file. MFC: 1 week PR: 290375 Sponsored by: ConnectWise Reviewed by: ziaee, ivy, jduran Differential Revision: https://reviews.freebsd.org/D56717
199 lines
5.9 KiB
Bash
Executable File
199 lines
5.9 KiB
Bash
Executable File
#!/bin/sh
|
|
#-
|
|
# Copyright (c) 2013 Nathan Whitehorn
|
|
# Copyright (c) 2013-2015 Devin Teske
|
|
# 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.
|
|
# 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
#
|
|
#
|
|
############################################################ INCLUDES
|
|
|
|
BSDCFG_SHARE="/usr/share/bsdconfig"
|
|
. $BSDCFG_SHARE/common.subr || exit 1
|
|
f_dprintf "%s: loading includes..." "$0"
|
|
f_include $BSDCFG_SHARE/dialog.subr
|
|
f_include $BSDCFG_SHARE/variable.subr
|
|
|
|
############################################################ CONFIGURATION
|
|
|
|
# VARIABLES:
|
|
# PARTITIONS
|
|
# DISTRIBUTIONS
|
|
# BSDINSTALL_DISTDIR
|
|
# COMPONENTS
|
|
|
|
#
|
|
# Default name of the ZFS boot-pool
|
|
#
|
|
: ${ZFSBOOT_POOL_NAME:=zroot}
|
|
|
|
############################################################ GLOBALS
|
|
|
|
: ${TMPDIR:="/tmp"}
|
|
|
|
#
|
|
# Strings that should be moved to an i18n file and loaded with f_include_lang()
|
|
#
|
|
msg_installation_error="Installation Error!"
|
|
|
|
############################################################ FUNCTIONS
|
|
|
|
error()
|
|
{
|
|
local file
|
|
f_getvar "$VAR_DEBUG_FILE#+" file
|
|
if [ "$file" ]; then
|
|
f_dialog_title "$msg_installation_error"
|
|
f_dialog_textbox "$file"
|
|
# No need to restore title, pining for the fjords
|
|
fi
|
|
|
|
[ -f "$PATH_FSTAB" ] || exit
|
|
if [ "$ZFSBOOT_DISKS" ]; then
|
|
zpool export $ZFSBOOT_POOL_NAME
|
|
else
|
|
bsdinstall umount
|
|
fi
|
|
|
|
exit 1
|
|
}
|
|
|
|
############################################################ MAIN
|
|
|
|
set -e
|
|
trap error EXIT
|
|
|
|
SCRIPT="$1"
|
|
shift
|
|
|
|
f_dprintf "Began Installation at %s" "$( date )"
|
|
rm -rf $BSDINSTALL_TMPETC
|
|
mkdir $BSDINSTALL_TMPETC
|
|
rm -f $TMPDIR/bsdinstall-installscript-setup
|
|
|
|
# split script into preamble and setup script at first shebang
|
|
awk 'BEGIN {pathb=ARGV[2]; ARGV[2]=""} /^#!/{b=1} {
|
|
if (b) print >pathb; else print}' \
|
|
"$SCRIPT" $TMPDIR/bsdinstall-installscript-setup \
|
|
>$TMPDIR/bsdinstall-installscript-preamble
|
|
|
|
. $TMPDIR/bsdinstall-installscript-preamble
|
|
export BSDINSTALL_DISTDIR
|
|
|
|
# Re-initialize a new log if preamble changed BSDINSTALL_LOG
|
|
if [ "$BSDINSTALL_LOG" != "${debugFile#+}" ]; then
|
|
export debugFile="$BSDINSTALL_LOG"
|
|
f_quietly f_debug_init
|
|
# NB: Being scripted, let debug go to terminal for invalid debugFile
|
|
f_dprintf "Began Installation at %s" "$( date )"
|
|
fi
|
|
|
|
# Make partitions
|
|
rm -f $PATH_FSTAB
|
|
touch $PATH_FSTAB
|
|
if [ "$ZFSBOOT_DISKS" ]; then
|
|
bsdinstall zfsboot
|
|
else
|
|
bsdinstall scriptedpart "$PARTITIONS"
|
|
fi
|
|
bsdinstall mount
|
|
|
|
if [ -n "$COMPONENTS" -a -n "$DISTRIBUTIONS" ]; then
|
|
error "Cannot set both COMPONENTS and DISTRIBUTIONS"
|
|
elif [ -z "$DISTRIBUTIONS" ]; then
|
|
# If COMPONENTS is set, or neither is, install with pkgbase
|
|
bsdinstall pkgbase --non-interactive
|
|
else
|
|
# Otherwise, unpack distsets
|
|
|
|
# Fetch missing distribution files, if any
|
|
exec 5>&1
|
|
export BSDINSTALL_DISTDIR=$(`dirname $0`/fetchmissingdists 2>&1 1>&5)
|
|
FETCH_RESULT=$?
|
|
exec 5>&-
|
|
|
|
[ $FETCH_RESULT -ne 0 ] && error "Could not fetch remote distributions"
|
|
|
|
bsdinstall checksum
|
|
if [ -t 0 ]; then
|
|
# If install is a tty, use distextract as normal
|
|
bsdinstall distextract
|
|
else
|
|
# Otherwise, we need to use tar (see
|
|
# https://reviews.freebsd.org/D10736)
|
|
for set in $DISTRIBUTIONS; do
|
|
f_dprintf "Extracting $BSDINSTALL_DISTDIR/$set"
|
|
# XXX: The below fails if any mountpoints are FAT, due
|
|
# to inability to set ctime/mtime on the root of FAT
|
|
# partitions, which is needed to support e.g. EFI
|
|
# system partitions. tar has no option to ignore this
|
|
# (distextract ignores them internally through a hack),
|
|
# and returns 1 on any warning or error, effectively
|
|
# turning all warnings into fatal errors.
|
|
#
|
|
# Work around this in an extremely lame way for the
|
|
# specific case of EFI system partitions only. This
|
|
# *ONLY WORKS* if /boot/efi is empty and does not
|
|
# handle analogous problems on other systems (ARM,
|
|
# PPC64).
|
|
tar -xf "$BSDINSTALL_DISTDIR/$set" -C $BSDINSTALL_CHROOT --exclude boot/efi
|
|
mkdir -p $BSDINSTALL_CHROOT/boot/efi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# Configure bootloader if needed
|
|
bsdinstall bootconfig
|
|
|
|
# Finalize install
|
|
bsdinstall config
|
|
|
|
# Make sure networking is functional, if we can arrange that
|
|
if [ ! -f $BSDINSTALL_CHROOT/etc/resolv.conf -a -f /etc/resolv.conf ]; then
|
|
cp /etc/resolv.conf $BSDINSTALL_CHROOT/etc/resolv.conf
|
|
fi
|
|
|
|
# Run post-install script
|
|
if [ -f $TMPDIR/bsdinstall-installscript-setup ]; then
|
|
cp $TMPDIR/bsdinstall-installscript-setup \
|
|
$BSDINSTALL_CHROOT/tmp/installscript
|
|
chmod a+x $BSDINSTALL_CHROOT/tmp/installscript
|
|
chroot $BSDINSTALL_CHROOT /tmp/installscript $@ 2>&1
|
|
rm $BSDINSTALL_CHROOT/tmp/installscript
|
|
fi
|
|
|
|
bsdinstall entropy
|
|
bsdinstall umount
|
|
if [ "$ZFSBOOT_DISKS" ]; then
|
|
zpool export $ZFSBOOT_POOL_NAME
|
|
fi
|
|
|
|
f_dprintf "Installation Completed at %s" "$( date )"
|
|
|
|
trap - EXIT
|
|
exit $SUCCESS
|
|
|
|
################################################################################
|
|
# END
|
|
################################################################################
|