core/src/etc/rc
Franco Fichtner 93c40a5e93 rc: refactor /var handling, get MFS dirs from rc vars
This works regardless of enabled state, as long as the plugin is
installed the directories are transitioned (makes sense for temporary
disabling of services).

PR: https://forum.opnsense.org/index.php?topic=5987.0
2017-09-19 08:33:42 +02:00

194 lines
5.6 KiB
Bash
Executable File

#!/bin/sh
# Copyright (c) 2014-2017 Franco Fichtner <franco@opnsense.org>
# Copyright (c) 2004-2010 Scott Ullrich <sullrich@gmail.com>
# Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>
# 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.
stty status '^T' 2> /dev/null
# Set shell to ignore SIGINT (2), but not children;
# shell catches SIGQUIT (3) and returns to single user.
#
trap : 2
trap "echo 'Boot interrupted'; exit 1" 3
HOME=/
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
export HOME PATH
echo "Mounting filesystems..."
# tunefs may refuse otherwise
mount -fr /
GROWFS_MARKER=/.probe.for.growfs.nano
while read FS_PART FS_MNT FS_TYPE FS_MORE; do
# only tune our own file systems
if [ "${FS_TYPE}" != "ufs" ]; then
continue;
fi
if echo "${FS_MORE}" | grep -iq nosoft; then
# appending "# nosoft" to the /etc/fstab entry
# will allow to strip trim and leave it disabled
tunefs -n disable ${FS_MNT}
else
# enables soft updates
tunefs -n enable ${FS_MNT}
fi
FS_DEV=$(echo ${FS_PART} | awk 'match($0, /^\/dev\/(gpt|ufs)\/.+$/) { print substr( $0, RSTART + 5, RLENGTH - 5 )}')
if [ -n "${FS_DEV}" ]; then
FS_DEV=$(glabel status -as | grep ${FS_DEV} | awk 'match($3, /^[a-z]+[0-9]+/) { print substr( $3, RSTART, RLENGTH )}')
if [ "${FS_MNT}" = "/" -a -f ${GROWFS_MARKER} ]; then
# hammertime!
gpart recover ${FS_DEV}
gpart resize -i 1 ${FS_DEV}
growfs -y ${FS_MNT}
fi
fi
if [ -z "${FS_DEV}" ]; then
FS_DEV=$(echo ${FS_PART} | awk 'match($0, /^\/dev\/[a-z]+[0-9]+/) { print substr( $0, RSTART + 5, RLENGTH - 5 )}')
fi
if [ -n "${FS_DEV}" ]; then
FS_TRIM=$(camcontrol identify ${FS_DEV} | grep TRIM | awk '{ print $5; }')
if [ "${FS_TRIM}" = "yes" ]; then
if echo "${FS_MORE}" | grep -iq notrim; then
# appending "# notrim" to the /etc/fstab entry
# will allow to strip trim and leave it disabled
tunefs -t disable ${FS_MNT}
else
# enables TRIM
tunefs -t enable ${FS_MNT}
fi
fi
fi
done < /etc/fstab
attempts=0
while [ ${attempts} -lt 3 ]; do
fsck -C -y /
fsck -C -y /
if mount -a 2> /dev/null; then
# bail if all is well
break
fi
attempts=$((attempts+1))
done
# clear growfs marker now that we are read/write
rm -f ${GROWFS_MARKER}
# see if / is writable (aka. non-LiveCD boot)
if _tmpdir=$(mktemp -d -q /.diskless.XXXXXX); then
# only remove the directory
rmdir ${_tmpdir}
else
# fake a writeable environment in some subdirs
for i in conf etc home root usr var; do
mkdir -p /tmp/.cdrom/${i}
mount_unionfs /tmp/.cdrom/${i} /${i}
done
fi
# regenerate groups and users for base
/usr/local/etc/rc.recover base > /dev/null
# set keyboard map if needed
/etc/rc.d/syscons onestart
# run the config importer during early startup
/usr/local/etc/rc.importer -b
# enable console output if it was muted
/sbin/conscontrol mute off > /dev/null
# all sorts of maintenance tasks for /var
/usr/local/etc/rc.subr.d/var
# write /var/run/dmesg.boot
/etc/rc.d/dmesg onestart
# XXX pre-17.1 compat: avoid matching use_mfs_tmpvar
USE_MFS_TMP=`/usr/bin/grep -c 'use_mfs_tmp[^_]' /conf/config.xml`
if [ ${USE_MFS_TMP} -ne 0 ]; then
mount -t tmpfs -o mode=01777 tmpfs /tmp
else
rm -rf /tmp/*
chmod 1777 /tmp
fi
# set up and recover a crash dump before activating swap
/usr/local/etc/rc.crashdump
/usr/local/etc/rc.swapon
echo -n "."
/sbin/ldconfig -elf /usr/lib /usr/local/lib /lib
/etc/rc.d/ldconfig start 2> /dev/null
# Launching kbdmux(4)
if [ -f "/dev/kbdmux0" ]; then
echo -n "."
/usr/sbin/kbdcontrol -k /dev/kbdmux0 < /dev/console
[ -c "/dev/atkbd0" ] && kbdcontrol -a atkbd0 < /dev/console
[ -c "/dev/ukbd0" ] && kbdcontrol -a ukbd0 < /dev/console
fi
echo "done."
# Regenerate groups and users for packages
/usr/local/etc/rc.recover pkg > /dev/null 2> /dev/null
# Recreate capabilities DB
/usr/bin/cap_mkdb /etc/login.conf
# Execute the early syshook / plugin commands
/usr/local/etc/rc.syshook early
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!! PHP starts working here, not earlier !!!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Let the PHP-based configuration subsystem set up the system now
echo -n "Launching the init system..."
touch /var/run/booting
/usr/local/etc/rc.bootup || exit 1
rm /var/run/booting
# Execute the normal syshook / plugin commands
/usr/local/etc/rc.syshook start
echo -n "Root file system: "
mount | grep ' on / ' | awk '{ print $1 }'
/usr/local/etc/rc.initial.banner
/usr/local/etc/rc.livemode
exit 0