core/src/etc/rc
Franco Fichtner 68d539af4f rc: allow to disable trim for the brave
Requires fiddling with /etc/fstab, at least that is a file
that we never touch.  It's harder for installs that need
TRIM to be off all the time as the first boot does actually
enable it.  That means after the install is complete it needs
to be CTRL+C'ed and the fstab entry modified before reboot.

PR: https://forum.opnsense.org/index.php?topic=3044
2016-05-23 08:28:29 +02:00

267 lines
6.4 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# Copyright (c) 2014-2016 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.
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 /
while read FS_PART FS_MNT FS_TYPE FS_MORE; do
# only tune our own file systems
if [ "${FS_TYPE}" != "ufs" ]; then
continue;
fi
# enables soft updates
tunefs -n enable ${FS_MNT}
# enables TRIM
FS_DEV=$(echo ${FS_PART} | awk 'match($0, /\/dev\/([a-z]+[0-9]+)/) { print substr( $0, RSTART, RLENGTH )}')
FS_TRIM=$(camcontrol identify ${FS_DEV} | grep TRIM | awk '{ print $5; }')
if [ "${FS_TRIM}" = "yes" ]; then
# appending "# notrim" to the /etc/fstab entry
# will allow to strip trim and leave it disabled
if echo "${FS_MORE}" | grep -iq notrim; then
tunefs -t disable ${FS_MNT}
else
tunefs -t enable ${FS_MNT}
fi
fi
done < /etc/fstab
attempts=0
while [ ${attempts} -lt 3 ]; do
if mount -a 2>/dev/null; then
# bail if all is well
break
fi
fsck -y /
attempts=$((attempts+1))
done
# 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
# rewrite message of the day
/etc/rc.d/motd onestart
# set keyboard map if needed
/etc/rc.d/syscons onestart
# set up config directory structure
mkdir -p /conf/backup
mkdir -p /conf/sshd
# Bootstrap config.xml if necessary
if [ ! -f /conf/config.xml ]; then
echo -n "Bootstrapping config.xml..."
cp /usr/local/etc/config.xml /conf/config.xml
echo "done."
fi
# Bootstrap openssl.cnf for port if necessary
if [ ! -f /usr/local/openssl/openssl.cnf ]; then
echo -n "Bootstrapping openssl.cnf..."
cp /etc/ssl/openssl.cnf /usr/local/openssl/openssl.cnf
echo "done."
fi
# Enable console output if its muted.
/sbin/conscontrol mute off >/dev/null
setup_mfs_link()
{
ROOT=${1}
MFS=${2}
NAME=${3}
# Create dummy directory to for MFS-bound
# directories that require a persistent
# storage underneath to run.
if [ ! -d "${ROOT}${MFS}/${NAME}" ]; then
mkdir -p "${ROOT}${MFS}" "${MFS}/${NAME}"
mv "${MFS}/${NAME}" "${ROOT}${MFS}"
# create a symlink underneath as well
ln -s "${ROOT}${MFS}/${NAME}" "${MFS}/${NAME}"
fi
}
install_mfs_link()
{
ROOT=${1}
MFS=${2}
NAME=${3}
# Redirect persistent, but MFS-bound
# directory after tmpfs mount.
mkdir -p "${MFS}"
ln -s "${ROOT}${MFS}/${NAME}" "${MFS}/${NAME}"
}
remove_mfs_link()
{
ROOT=${1}
MFS=${2}
NAME=${3}
# Persistent copies of MFS-bound directories
# still there must be moved back into place.
if [ -d "${ROOT}${MFS}/${NAME}" ]; then
mkdir -p "${MFS}"
# reverse the recovery symlink before
# moving back the original database
rm -f "${MFS}/${NAME}"
mv "${ROOT}${MFS}/${NAME}" "${MFS}/"
fi
}
USE_MFS_TMPVAR=`/usr/bin/grep -c use_mfs_tmpvar /conf/config.xml`
if [ ${USE_MFS_TMPVAR} -ne 0 ]; then
echo -n "Setting up memory disks..."
setup_mfs_link /root /var/cache opnsense-update
#setup_mfs_link /root /var/cache pkg
setup_mfs_link /root /var/db pkg
setup_mfs_link /root /var crash
mount -t tmpfs -o mode=01777 tmpfs /tmp
mount -t tmpfs tmpfs /var
install_mfs_link /root /var/cache opnsense-update
#install_mfs_link /root /var/cache pkg
install_mfs_link /root /var/db pkg
install_mfs_link /root /var crash
echo "done."
else
remove_mfs_link /root /var/cache opnsense-update
#remove_mfs_link /root /var/cache pkg
remove_mfs_link /root /var/db pkg
remove_mfs_link /root /var crash
fi
# make some directories in /var
mkdir -p /var/run /var/log /var/etc /var/db/entropy /var/at/jobs \
/var/empty /var/tmp /var/crash
# work around the fact that shutdown(8) doesn't clean up this file
rm -f /var/run/nologin
# set up and recover a crash dump before activating swap
/usr/local/etc/rc.crashdump
swapon -a
# write /var/run/dmesg.boot
/etc/rc.d/dmesg onestart
rm -rf /tmp/*
chmod 1777 /tmp
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
# Recreate capabilities DB
/usr/bin/cap_mkdb /etc/login.conf
# Set up the correct php.ini content
/usr/local/etc/rc.php_ini_setup
# startup configd
/usr/local/etc/rc.d/configd start
# Execute the early syshook / plugin commands
/usr/local/etc/rc.syshook early
# Restore backups from previous shutdown (if any)
/usr/local/etc/rc.backup_dhcpleases restore
/usr/local/etc/rc.backup_netflow restore
/usr/local/etc/rc.backup_rrd restore
# let the PHP-based configuration subsystem set up the system now
echo -n "Launching the init system..."
rm -f /root/lighttpd*
touch /var/run/booting
/usr/local/etc/rc.bootup
rm /var/run/booting
# If a shell was selected from recovery
# console then just drop to the shell now.
if [ -f "/tmp/donotbootup" ]; then
echo "Dropping to recovery shell."
exit 0
fi
# Execute the normal syshook / plugin commands
/usr/local/etc/rc.syshook start
# 16.1 migration code for stale captive portal files to be removed in 16.7
rm -rf /var/db/rrd/*-concurrent.rrd
rm -rf /var/db/rrd/*-loggedin.rrd
echo -n "Starting CRON... "
cd /tmp && /usr/sbin/cron -s 2>/dev/null
echo "done."
# starting standard rc scripts
/usr/local/etc/rc.opnsense start
# Start ping handler every 240 seconds
/usr/local/bin/minicron 240 /var/run/ping_hosts.pid /usr/local/sbin/ping_hosts.sh
# Start account expire handler every hour
/usr/local/bin/minicron 3600 /var/run/expire_accounts.pid /usr/local/etc/rc.expireaccounts
# Start alias url updater every 24 hours
/usr/local/bin/minicron 86400 /var/run/update_alias_url_data.pid /usr/local/etc/rc.update_alias_url_data
/usr/local/sbin/beep.sh start
/usr/local/etc/rc.initial.banner
exit 0