c2f16c595e
Because the ESP mount point (/boot/efi) is in mtree, tar will attempt to extract a directory at that point post-mount when the system is installed. Normally, this is fine, since tar can happily set whatever properties it wants. For FAT32 file systems, however, like the ESP, tar will attempt to set mtime on the root directory, which FAT does not support, and tar will interpret this as a fatal error, breaking the install (see https://github.com/libarchive/libarchive/issues/1516). This issue would also break scripted installs on bare-metal POWER8, POWER9, and PS3 systems, as well as some ARM systems. This patch solves the problem in two ways: - If stdout is a TTY, use the distextract stage instead of tar, as in interactive installs. distextract solves this problem internally and provides a nicer UI to boot, but requires a TTY. - If stdout is not a TTY, use tar but, as a stopgap for 13.0, exclude boot/efi from tarball extraction and then add it by hand. This is a hack, and better solutions (as in the libarchive ticket above) will obsolete it, but it solves the most common case, leaving only unattended TTY-less installs on a few tier-2 platforms broken. In addition, fix a bug with fstab generation uncovered once the tar issue is fixed that umount(8) can depend on the ordering of lines in fstab in a way that mount(8) does not. The partition editor now writes out fstab in mount order, making sure umount (run at the end of scripted, but not interactive, installs) succeeds. PR: 254395 Reviewed by: gjb, imp MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D29380
178 lines
5.3 KiB
Bash
Executable File
178 lines
5.3 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.
|
|
#
|
|
# $FreeBSD$
|
|
#
|
|
############################################################ 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
|
|
|
|
#
|
|
# 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
|
|
|
|
split -a 2 -p '^#!.*' "$SCRIPT" $TMPDIR/bsdinstall-installscript-
|
|
|
|
. $TMPDIR/bsdinstall-installscript-aa
|
|
: ${DISTRIBUTIONS="kernel.txz base.txz"}; export DISTRIBUTIONS
|
|
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 Instalation at %s" "$( date )"
|
|
fi
|
|
|
|
# Make partitions
|
|
rm -f $PATH_FSTAB
|
|
touch $PATH_FSTAB
|
|
if [ "$ZFSBOOT_DISKS" ]; then
|
|
bsdinstall zfsboot
|
|
else
|
|
bsdinstall scriptedpart "$PARTITIONS"
|
|
bsdinstall mount
|
|
fi
|
|
|
|
# Unpack 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 analagous 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
|
|
|
|
# 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-ab ]; then
|
|
cp $TMPDIR/bsdinstall-installscript-ab $BSDINSTALL_CHROOT/tmp/installscript
|
|
chmod a+x $BSDINSTALL_CHROOT/tmp/installscript
|
|
mount -t devfs devfs "$BSDINSTALL_CHROOT/dev"
|
|
chroot $BSDINSTALL_CHROOT /tmp/installscript $@ 2>&1
|
|
umount "$BSDINSTALL_CHROOT/dev"
|
|
rm $BSDINSTALL_CHROOT/tmp/installscript
|
|
fi
|
|
|
|
bsdinstall entropy
|
|
if [ "$ZFSBOOT_DISKS" ]; then
|
|
zpool export $ZFSBOOT_POOL_NAME
|
|
else
|
|
bsdinstall umount
|
|
fi
|
|
|
|
f_dprintf "Installation Completed at %s" "$( date )"
|
|
|
|
trap - EXIT
|
|
exit $SUCCESS
|
|
|
|
################################################################################
|
|
# END
|
|
################################################################################
|