eb7bf00306
Instead, load them as part of the rc.d system. This allows us to prioritize the initidiskless script so it runs before the configuration files are loaded and allows us to get rid of the exit 2 hack in /etc/rc. The exit 2 never worked anyway since it did not unset the prior configuration, causing the diskless code to not operate properly. Do a major cleanup and revamping of the diskless code for RCNG. This will be backported to the non-RCNG scripts as well as -stable. With suggestions from: Mike Makonnen <mtm@identd.net> MFC after: 7 days
994 lines
21 KiB
Bash
994 lines
21 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2000 The FreeBSD Project
|
|
# 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.
|
|
#
|
|
# @(#)rc 5.27 (Berkeley) 6/5/91
|
|
# $FreeBSD$
|
|
#
|
|
|
|
# System startup script run by init on autoboot
|
|
# or after single-user.
|
|
# Output and error are redirected to console by init,
|
|
# and the console is the controlling terminal.
|
|
|
|
# Note that almost all of the user-configurable behavior is no longer in
|
|
# this file, but rather in /etc/defaults/rc.conf. Please check that file
|
|
# first before contemplating any changes here. If you do need to change
|
|
# this file for some reason, we would like to know about it.
|
|
|
|
stty status '^T'
|
|
|
|
# Set shell to ignore SIGINT (2), but not children;
|
|
# shell catches SIGQUIT (3) and returns to single user after fsck.
|
|
#
|
|
trap : 2
|
|
trap : 3 # shouldn't be needed
|
|
|
|
HOME=/
|
|
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
|
export HOME PATH
|
|
|
|
# If there is a global system configuration file, suck it in.
|
|
# XXX - The only purpose of duplicating it here is to catch rc_ng="YES"
|
|
#
|
|
if [ -r /etc/defaults/rc.conf ]; then
|
|
. /etc/defaults/rc.conf
|
|
source_rc_confs
|
|
elif [ -r /etc/rc.conf ]; then
|
|
. /etc/rc.conf
|
|
fi
|
|
|
|
# Diskless setups have to depend on a different mechanism since
|
|
# their config files haven't been retargeted yet.
|
|
#
|
|
[ -e /.rcng_yes ] && rc_ng="YES"
|
|
|
|
case ${rc_ng} in
|
|
[Yy][Ee][Ss])
|
|
. /etc/rc.subr
|
|
|
|
# Note: the system configuration files are loaded as part of
|
|
# the RCNG system (rc.d/rccond). Do not load them here as it may
|
|
# interfere with diskless booting.
|
|
#
|
|
if [ "$1" = autoboot ]; then
|
|
autoboot=yes
|
|
_boot="faststart"
|
|
rc_fast=yes # run_rc_command(): do fast booting
|
|
else
|
|
autoboot=no
|
|
_boot="start"
|
|
fi
|
|
|
|
os=`eval ${CMD_OSTYPE}`
|
|
files=`rcorder -k ${os} -s nostart /etc/rc.d/* 2>/dev/null`
|
|
|
|
for _rc_elem in ${files}; do
|
|
run_rc_script ${_rc_elem} ${_boot}
|
|
done
|
|
|
|
echo ''
|
|
date
|
|
exit 0
|
|
;;
|
|
*)
|
|
# fall-through to the old rc scripts
|
|
;;
|
|
esac
|
|
|
|
bootmode=$1
|
|
|
|
# BOOTP diskless boot. We have to run the rc file early in order to
|
|
# retarget various config files.
|
|
#
|
|
if [ -r /etc/rc.diskless1 ]; then
|
|
dlv=`/sbin/sysctl -n vfs.nfs.diskless_valid 2> /dev/null`
|
|
if [ ${dlv:=0} != 0 ]; then
|
|
. /etc/rc.diskless1
|
|
fi
|
|
fi
|
|
|
|
# If there is a global system configuration file, suck it in.
|
|
#
|
|
if [ -r /etc/defaults/rc.conf ]; then
|
|
. /etc/defaults/rc.conf
|
|
source_rc_confs
|
|
elif [ -r /etc/rc.conf ]; then
|
|
. /etc/rc.conf
|
|
fi
|
|
|
|
# XXX - Deprecated variable name support
|
|
# for rpcbind and ntpd
|
|
#
|
|
[ -n "$portmap_enable" ] && rpcbind_enable="$portmap_enable"
|
|
[ -n "$portmap_program" ] && rpcbind_program="$portmap_program"
|
|
[ -n "$portmap_flags" ] && rpcbind_flags="$portmap_flags"
|
|
[ -n "$single_mountd_enable" ] && mountd_enable="$single_mountd_enable"
|
|
[ -n "$xntpd_enable" ] && ntpd_enable="$xntpd_enable"
|
|
[ -n "$xntpd_program" ] && ntpd_program="$xntpd_program"
|
|
[ -n "$xntpd_flags" ] && ntpd_flags="$xntpd_flags"
|
|
|
|
feed_dev_random() {
|
|
if [ -f "${1}" -a -r "${1}" -a -s "${1}" ]; then
|
|
# echo "Using ${1} as an entropy file"
|
|
cat "${1}" | dd of=/dev/random bs=8k 2>/dev/null
|
|
fi
|
|
}
|
|
|
|
chkdepend() {
|
|
svc=$1
|
|
svc_var=$2
|
|
dep=$3
|
|
dep_var=$4
|
|
|
|
eval svc_val=\${$svc_var}
|
|
eval dep_val=\${$dep_var}
|
|
|
|
case ${svc_val} in
|
|
[Yy][Ee][Ss])
|
|
case ${dep_val} in
|
|
[Yy][Ee][Ss])
|
|
;;
|
|
*)
|
|
eval ${dep_var}="YES"
|
|
echo "DEPENDENCY NOTE: ${dep} will be enabled" \
|
|
"to support ${svc}"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
chkdepend amd amd_enable rpcbind rpcbind_enable
|
|
chkdepend amd amd_enable NFS nfs_client_enable
|
|
chkdepend NFS nfs_server_enable rpcbind rpcbind_enable
|
|
chkdepend NIS nis_server_enable rpcbind rpcbind_enable
|
|
chkdepend NIS nis_client_enable rpcbind rpcbind_enable
|
|
|
|
# Enable dumpdev early so that a crash during the boot process can be caught.
|
|
#
|
|
case ${dumpdev} in
|
|
[Nn][Oo] | '')
|
|
dumpdev='NO'
|
|
;;
|
|
*)
|
|
/sbin/dumpon -v ${dumpdev}
|
|
;;
|
|
esac
|
|
|
|
# Enable harvesting of entropy via devices. The sooner this happens the
|
|
# better so that we can take advantage of the boot process.
|
|
#
|
|
echo -n 'Entropy harvesting:'
|
|
|
|
case ${harvest_interrupt} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
if [ -w /dev/random ]; then
|
|
/sbin/sysctl kern.random.sys.harvest.interrupt=1 >/dev/null
|
|
echo -n ' interrupts'
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
case ${harvest_ethernet} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
if [ -w /dev/random ]; then
|
|
/sbin/sysctl kern.random.sys.harvest.ethernet=1 >/dev/null
|
|
echo -n ' ethernet'
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
case ${harvest_p_to_p} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
if [ -w /dev/random ]; then
|
|
/sbin/sysctl kern.random.sys.harvest.point_to_point=1 >/dev/null
|
|
echo -n ' point_to_point'
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
echo '.'
|
|
|
|
# First pass at reseeding /dev/random.
|
|
#
|
|
case ${entropy_file} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
if [ -w /dev/random ]; then
|
|
feed_dev_random "${entropy_file}"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# XXX temporary until we can get the entropy
|
|
# harvesting rate up
|
|
# Entropy below is not great,
|
|
# but better than nothing.
|
|
( ps -fauxww; sysctl -a; date; df -ib; dmesg; ps -fauxww; ) \
|
|
| dd of=/dev/random bs=8k 2>/dev/null
|
|
cat /bin/ls | dd of=/dev/random bs=8k 2>/dev/null
|
|
|
|
# Configure ccd devices.
|
|
#
|
|
if [ -r /etc/ccd.conf ]; then
|
|
ccdconfig -C
|
|
fi
|
|
|
|
case ${start_vinum} in
|
|
[Yy][Ee][Ss])
|
|
vinum start
|
|
;;
|
|
esac
|
|
|
|
swapon -a
|
|
|
|
# Last chance to do things before potentially waiting for
|
|
# operator to do fsck related tasks
|
|
if [ -r /etc/rc.early ]; then
|
|
. /etc/rc.early
|
|
fi
|
|
|
|
case ${bootmode} in
|
|
autoboot)
|
|
echo 'Automatic boot in progress...'
|
|
case ${background_fsck} in
|
|
[Yy][Ee][Ss])
|
|
fsck -F -p
|
|
;;
|
|
*)
|
|
fsck -p
|
|
;;
|
|
esac
|
|
case $? in
|
|
0)
|
|
;;
|
|
2)
|
|
exit 1
|
|
;;
|
|
4)
|
|
reboot
|
|
echo 'Reboot failed... help!'
|
|
exit 1
|
|
;;
|
|
8)
|
|
case ${fsck_y_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo 'File system preen failed, trying fsck -y . . .'
|
|
fsck -y
|
|
case $? in
|
|
0)
|
|
;;
|
|
*)
|
|
echo 'Automatic filesystem check failed . . . help!'
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
echo 'Automatic filesystem check failed . . . help!'
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
12)
|
|
echo 'Reboot interrupted'
|
|
exit 1
|
|
;;
|
|
130)
|
|
# interrupt before catcher installed
|
|
exit 1
|
|
;;
|
|
*)
|
|
echo 'Unknown error in reboot'
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
echo 'Skipping disk checks ...'
|
|
;;
|
|
esac
|
|
|
|
set -T
|
|
trap "echo 'Reboot interrupted'; exit 1" 3
|
|
|
|
# root normally must be read/write, but if this is a BOOTP NFS
|
|
# diskless boot it does not have to be.
|
|
#
|
|
case ${root_rw_mount} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
if ! mount -u -o rw / ; then
|
|
echo 'Mounting root filesystem rw failed, startup aborted'
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
umount -a >/dev/null 2>&1
|
|
|
|
# Set up the list of network filesystem types for which mounting should be
|
|
# delayed until after network initialization.
|
|
networkfs_types='nfs:NFS smbfs:SMB portalfs:PORTAL'
|
|
case ${extra_netfs_types} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
networkfs_types="${networkfs_types} ${extra_netfs_types}"
|
|
;;
|
|
esac
|
|
|
|
# Mount everything except nfs filesystems.
|
|
mount_excludes='no'
|
|
for i in ${networkfs_types}; do
|
|
fstype=${i%:*}
|
|
mount_excludes="${mount_excludes}${fstype},"
|
|
done
|
|
mount_excludes=${mount_excludes%,}
|
|
mount -a -t ${mount_excludes}
|
|
|
|
case $? in
|
|
0)
|
|
;;
|
|
*)
|
|
echo 'Mounting /etc/fstab filesystems failed, startup aborted'
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Run custom disk mounting function here
|
|
#
|
|
if [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then
|
|
sh ${diskless_mount}
|
|
fi
|
|
|
|
# If we booted a special kernel remove the record so we will boot
|
|
# the default kernel next time
|
|
rm -f /boot/nextboot.conf
|
|
|
|
# Reseed /dev/random with previously stored entropy.
|
|
case ${entropy_dir} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
entropy_dir=${entropy_dir:-/var/db/entropy}
|
|
if [ -d "${entropy_dir}" ]; then
|
|
if [ -w /dev/random ]; then
|
|
for seedfile in ${entropy_dir}/*; do
|
|
feed_dev_random "${seedfile}"
|
|
done
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
case ${entropy_file} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
if [ -w /dev/random ]; then
|
|
feed_dev_random "${entropy_file}"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
adjkerntz -i
|
|
|
|
purgedir() {
|
|
local dir file
|
|
|
|
if [ $# -eq 0 ]; then
|
|
purgedir .
|
|
else
|
|
for dir
|
|
do
|
|
(
|
|
cd "$dir" && for file in .* *
|
|
do
|
|
[ ."$file" = .. -o ."$file" = ... ] && continue
|
|
if [ -d "$file" -a ! -L "$file" ]
|
|
then
|
|
purgedir "$file"
|
|
else
|
|
rm -f -- "$file"
|
|
fi
|
|
done
|
|
)
|
|
done
|
|
fi
|
|
}
|
|
|
|
clean_var() {
|
|
if [ -d /var/run -a ! -f /var/run/clean_var ]; then
|
|
purgedir /var/run
|
|
# Keep a copy of the boot messages around
|
|
dmesg >/var/run/dmesg.boot
|
|
# And an initial utmp file
|
|
(cd /var/run && cp /dev/null utmp && chmod 644 utmp;)
|
|
>/var/run/clean_var
|
|
fi
|
|
if [ -d /var/spool/lock -a ! -f /var/spool/lock/clean_var ]; then
|
|
purgedir /var/spool/lock
|
|
>/var/spool/lock/clean_var
|
|
fi
|
|
rm -rf /var/spool/uucp/.Temp/*
|
|
}
|
|
|
|
# network_pass1() *may* end up writing stuff to /var - we don't want to
|
|
# remove it immediately afterwards - *nor* do we want to fail to clean
|
|
# an NFS-mounted /var.
|
|
rm -f /var/run/clean_var /var/spool/lock/clean_var
|
|
clean_var
|
|
|
|
# Add additional swapfile, if configured.
|
|
#
|
|
case ${swapfile} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
if [ -w "${swapfile}" -a -c /dev/mdctl ]; then
|
|
echo "Adding ${swapfile} as additional swap"
|
|
mdev=`mdconfig -a -t vnode -f ${swapfile}` && swapon /dev/${mdev}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Early pass to set the variables we can
|
|
#
|
|
if [ -r /etc/rc.sysctl ]; then
|
|
sh /etc/rc.sysctl first
|
|
fi
|
|
|
|
# Configure serial devices
|
|
#
|
|
if [ -r /etc/rc.serial ]; then
|
|
. /etc/rc.serial
|
|
fi
|
|
|
|
# Start up PC-card configuration
|
|
#
|
|
if [ -r /etc/rc.pccard ]; then
|
|
. /etc/rc.pccard
|
|
fi
|
|
|
|
# Start up the initial network configuration.
|
|
#
|
|
if [ -r /etc/rc.network ]; then
|
|
. /etc/rc.network # We only need to do this once.
|
|
network_pass1
|
|
fi
|
|
|
|
case ${ipv6_enable} in
|
|
[Yy][Ee][Ss])
|
|
if [ -r /etc/rc.network6 ]; then
|
|
. /etc/rc.network6 # We only need to do this once also.
|
|
network6_pass1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Mount NFS filesystems if present in /etc/fstab
|
|
#
|
|
# XXX When the vfsload() issues with nfsclient support and related sysctls
|
|
# have been resolved, this block can be removed, and the condition that
|
|
# skips nfs in the following block (for "other network filesystems") can
|
|
# be removed.
|
|
case "`mount -d -a -t nfs 2> /dev/null`" in
|
|
*mount_nfs*)
|
|
# Handle absent nfs client support
|
|
nfsclient_in_kernel=0
|
|
if sysctl vfs.nfs >/dev/null 2>&1; then
|
|
nfsclient_in_kernel=1
|
|
else
|
|
kldload nfsclient && nfsclient_in_kernel=1
|
|
fi
|
|
|
|
case ${nfsclient_in_kernel} in
|
|
1)
|
|
echo -n 'Mounting NFS filesystem:'
|
|
mount -a -t nfs
|
|
echo '.'
|
|
;;
|
|
*)
|
|
echo 'Warning: nfs mount requested, but no nfs client in kernel'
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# Mount other network filesystems if present in /etc/fstab
|
|
for i in ${networkfs_types}; do
|
|
fstype=${i%:*}
|
|
fsdecr=${i#*:}
|
|
|
|
if [ "${fstype}" = "nfs" ]; then
|
|
continue
|
|
fi
|
|
case "`mount -d -a -t ${fstype}`" in
|
|
*mount_${fstype}*)
|
|
echo -n "Mounting ${fsdecr} filesystems:"
|
|
mount -a -t ${fstype}
|
|
echo '.'
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Whack the pty perms back into shape.
|
|
#
|
|
if ls /dev/tty[pqrsPQRS]* > /dev/null 2>&1; then
|
|
chflags 0 /dev/tty[pqrsPQRS]*
|
|
chmod 666 /dev/tty[pqrsPQRS]*
|
|
chown root:wheel /dev/tty[pqrsPQRS]*
|
|
fi
|
|
|
|
# Clean up left-over files
|
|
#
|
|
clean_var # If it hasn't already been done
|
|
rm /var/run/clean_var /var/spool/lock/clean_var
|
|
|
|
# Clearing /tmp at boot-time seems to have a long tradition. It doesn't
|
|
# help in any way for long-living systems, and it might accidentally
|
|
# clobber files you would rather like to have preserved after a crash
|
|
# (if not using mfs /tmp anyway).
|
|
#
|
|
# See also the example of another cleanup policy in /etc/periodic/daily.
|
|
#
|
|
case ${clear_tmp_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo -n 'Clearing /tmp:'
|
|
# prune quickly with one rm, then use find to clean up /tmp/[lq]*
|
|
# (not needed with mfs /tmp, but doesn't hurt there...)
|
|
(cd /tmp && rm -rf [a-km-pr-zA-Z]* &&
|
|
find -d . ! -name . ! -name lost+found ! -name quota.user \
|
|
! -name quota.group -exec rm -rf -- {} \;)
|
|
echo '.'
|
|
;;
|
|
esac
|
|
|
|
# Remove X lock files, since they will prevent you from restarting X11
|
|
# after a system crash.
|
|
#
|
|
rm -f /tmp/.X*-lock
|
|
rm -fr /tmp/.X11-unix
|
|
mkdir -m 1777 /tmp/.X11-unix
|
|
|
|
# Snapshot any kernel -c changes back to disk here <someday>.
|
|
# This has changed with ELF and /kernel.config.
|
|
|
|
# Load LOMAC(4) security if wanted.
|
|
case ${lomac_enable} in
|
|
[Yy][Ee][Ss])
|
|
kldload mac_lomac >/dev/null 2>&1
|
|
;;
|
|
esac
|
|
|
|
echo -n 'Additional daemons:'
|
|
|
|
# Start system logging and name service. Named needs to start before syslogd
|
|
# if you don't have a /etc/resolv.conf.
|
|
#
|
|
case ${syslogd_enable} in
|
|
[Yy][Ee][Ss])
|
|
# Transitional symlink (for the next couple of years :) until all
|
|
# binaries have had a chance to move towards /var/run/log.
|
|
if [ ! -L /dev/log ]; then
|
|
# might complain for r/o root f/s
|
|
ln -sf /var/run/log /dev/log
|
|
fi
|
|
|
|
rm -f /var/run/log
|
|
echo -n ' syslogd';
|
|
${syslogd_program:-/usr/sbin/syslogd} ${syslogd_flags}
|
|
;;
|
|
esac
|
|
|
|
echo '.'
|
|
|
|
# Build device name databases if we are not using DEVFS
|
|
#
|
|
if sysctl vfs.devfs.generation > /dev/null 2>&1 ; then
|
|
rm -f /var/run/dev.db
|
|
else
|
|
dev_mkdb
|
|
fi
|
|
|
|
# $dumpdir should be a directory or a symbolic link
|
|
# to the crash directory if core dumps are to be saved.
|
|
#
|
|
if [ "${dumpdev}" != 'NO' ]; then
|
|
case ${dumpdir} in
|
|
'')
|
|
dumpdir='/var/crash'
|
|
;;
|
|
[Nn][Oo])
|
|
dumpdir='NO'
|
|
;;
|
|
esac
|
|
|
|
if [ "${dumpdir}" != 'NO' ]; then
|
|
echo -n 'Checking for core dump: '
|
|
/sbin/savecore ${savecore_flags} "${dumpdir}"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "${network_pass1_done}" ]; then
|
|
network_pass2
|
|
fi
|
|
|
|
# Enable/Check the quotas (must be after ypbind if using NIS)
|
|
#
|
|
case ${enable_quotas} in
|
|
[Yy][Ee][Ss])
|
|
case ${check_quotas} in
|
|
[Yy][Ee][Ss])
|
|
echo -n 'Checking quotas:'
|
|
quotacheck -a
|
|
echo ' done.'
|
|
;;
|
|
esac
|
|
|
|
echo -n 'Enabling quotas:'
|
|
quotaon -a
|
|
echo ' done.'
|
|
;;
|
|
esac
|
|
|
|
if [ -n "${network_pass2_done}" ]; then
|
|
network_pass3
|
|
fi
|
|
|
|
# Check the password temp/lock file
|
|
#
|
|
if [ -e /etc/ptmp ]; then
|
|
logger -s -p auth.err \
|
|
"password file may be incorrect -- /etc/ptmp exists"
|
|
fi
|
|
|
|
case ${accounting_enable} in
|
|
[Yy][Ee][Ss])
|
|
if [ -d /var/account ]; then
|
|
echo 'Turning on accounting:'
|
|
if [ ! -e /var/account/acct ]; then
|
|
touch /var/account/acct
|
|
fi
|
|
accton /var/account/acct
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Make shared lib searching a little faster. Leave /usr/lib first if you
|
|
# add your own entries or you may come to grief.
|
|
#
|
|
ldconfig="/sbin/ldconfig"
|
|
case ${ldconfig_insecure} in
|
|
[Yy][Ee][Ss])
|
|
ldconfig="${ldconfig} -i"
|
|
;;
|
|
esac
|
|
if [ -x /sbin/ldconfig ]; then
|
|
_LDC=/usr/lib
|
|
for i in ${ldconfig_paths}; do
|
|
if [ -d "${i}" ]; then
|
|
_LDC="${_LDC} ${i}"
|
|
fi
|
|
done
|
|
echo 'ELF ldconfig path:' ${_LDC}
|
|
${ldconfig} ${_LDC}
|
|
|
|
# Legacy aout support for i386 only
|
|
case `sysctl -n hw.machine_arch` in
|
|
i386)
|
|
# Default the a.out ldconfig path.
|
|
: ${ldconfig_paths_aout=${ldconfig_paths}}
|
|
_LDC=/usr/lib/aout
|
|
for i in ${ldconfig_paths_aout}; do
|
|
if [ -d "${i}" ]; then
|
|
_LDC="${_LDC} ${i}"
|
|
fi
|
|
done
|
|
echo 'a.out ldconfig path:' ${_LDC}
|
|
${ldconfig} -aout ${_LDC}
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# Now start up miscellaneous daemons that don't belong anywhere else
|
|
#
|
|
echo -n 'Starting standard daemons:'
|
|
case ${inetd_enable} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
echo -n ' inetd'; ${inetd_program:-/usr/sbin/inetd} ${inetd_flags}
|
|
;;
|
|
esac
|
|
|
|
case ${cron_enable} in
|
|
[Nn][Oo])
|
|
;;
|
|
*)
|
|
echo -n ' cron'; ${cron_program:-/usr/sbin/cron} ${cron_flags}
|
|
;;
|
|
esac
|
|
|
|
case ${lpd_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo -n ' printer'; ${lpd_program:-/usr/sbin/lpd} ${lpd_flags}
|
|
;;
|
|
esac
|
|
|
|
case ${sshd_enable} in
|
|
[Yy][Ee][Ss])
|
|
if [ -x ${sshd_program:-/usr/sbin/sshd} ]; then
|
|
echo -n ' sshd';
|
|
${sshd_program:-/usr/sbin/sshd} ${sshd_flags}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
case ${usbd_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo -n ' usbd'; /usr/sbin/usbd ${usbd_flags}
|
|
;;
|
|
esac
|
|
|
|
case ${mta_start_script} in
|
|
/*)
|
|
if [ -r ${mta_start_script} ]; then
|
|
sh ${mta_start_script}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
echo '.'
|
|
|
|
# Recover vi editor files.
|
|
find /var/tmp/vi.recover ! -type f -a ! -type d -delete
|
|
vibackup=`echo /var/tmp/vi.recover/vi.*`
|
|
if [ "${vibackup}" != '/var/tmp/vi.recover/vi.*' ]; then
|
|
echo -n 'Recovering vi editor sessions:'
|
|
for i in /var/tmp/vi.recover/vi.*; do
|
|
# Only test files that are readable.
|
|
if [ ! -r "${i}" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Unmodified nvi editor backup files either have the
|
|
# execute bit set or are zero length. Delete them.
|
|
if [ -x "${i}" -o ! -s "${i}" ]; then
|
|
rm -f "${i}"
|
|
fi
|
|
done
|
|
|
|
# It is possible to get incomplete recovery files, if the editor
|
|
# crashes at the right time.
|
|
virecovery=`echo /var/tmp/vi.recover/recover.*`
|
|
if [ "${virecovery}" != "/var/tmp/vi.recover/recover.*" ]; then
|
|
for i in /var/tmp/vi.recover/recover.*; do
|
|
# Only test files that are readable.
|
|
if [ ! -r "${i}" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Delete any recovery files that are zero length,
|
|
# corrupted, or that have no corresponding backup file.
|
|
# Else send mail to the user.
|
|
recfile=`awk '/^X-vi-recover-path:/{print $2}' < "${i}"`
|
|
if [ -n "${recfile}" -a -s "${recfile}" ]; then
|
|
sendmail -t < "${i}"
|
|
else
|
|
rm -f "${i}"
|
|
fi
|
|
done
|
|
fi
|
|
echo '.'
|
|
fi
|
|
|
|
# Make a bounds file for msgs(1) if there isn't one already
|
|
#
|
|
if [ -d /var/msgs -a ! -f /var/msgs/bounds -a ! -L /var/msgs/bounds ]; then
|
|
echo 0 > /var/msgs/bounds
|
|
fi
|
|
|
|
case ${update_motd} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
if T=`mktemp /tmp/_motd.XXXXXX`; then
|
|
uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' > ${T}
|
|
awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' < /etc/motd >> ${T}
|
|
cmp -s ${T} /etc/motd || {
|
|
cp ${T} /etc/motd
|
|
chmod 644 /etc/motd
|
|
}
|
|
rm -f ${T}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Run rc.devfs if readable to customize devfs
|
|
#
|
|
if [ -r /etc/rc.devfs ]; then
|
|
sh /etc/rc.devfs
|
|
fi
|
|
|
|
# Configure implementation specific stuff
|
|
#
|
|
arch=`uname -p`
|
|
if [ -r /etc/rc.${arch} ]; then
|
|
. /etc/rc.${arch}
|
|
fi
|
|
|
|
# Configure the system console
|
|
#
|
|
if [ -r /etc/rc.syscons ]; then
|
|
. /etc/rc.syscons
|
|
fi
|
|
|
|
echo -n 'Additional ABI support:'
|
|
|
|
# Load the SysV IPC API if requested.
|
|
case ${sysvipc_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo -n ' sysvipc'
|
|
kldload sysvmsg >/dev/null 2>&1
|
|
kldload sysvsem >/dev/null 2>&1
|
|
kldload sysvshm >/dev/null 2>&1
|
|
;;
|
|
esac
|
|
|
|
# Start the Linux binary compatibility if requested.
|
|
#
|
|
case ${linux_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo -n ' linux'
|
|
if ! kldstat -v | grep -E 'linux(aout|elf)' > /dev/null; then
|
|
kldload linux > /dev/null 2>&1
|
|
fi
|
|
if [ -x /compat/linux/sbin/ldconfig ]; then
|
|
/compat/linux/sbin/ldconfig
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Start the SysVR4 binary emulation if requested.
|
|
#
|
|
case ${svr4_enable} in
|
|
[Yy][Ee][Ss])
|
|
echo -n ' svr4'; kldload svr4 > /dev/null 2>&1
|
|
;;
|
|
esac
|
|
|
|
echo '.'
|
|
|
|
# Do traditional (but rather obsolete) rc.local file if it exists. If you
|
|
# use this file and want to make it programmatic, source /etc/defaults/rc.conf
|
|
# in /etc/rc.local and add your custom variables to /etc/rc.conf, as
|
|
# shown below. Please do not put local extensions into /etc/rc itself.
|
|
# Use /etc/rc.local
|
|
#
|
|
# ---- rc.local ----
|
|
# if [ -r /etc/defaults/rc.conf ]; then
|
|
# . /etc/defaults/rc.conf
|
|
# source_rc_confs
|
|
# elif [ -r /etc/rc.conf ]; then
|
|
# . /etc/rc.conf
|
|
# fi
|
|
#
|
|
# ... additional startup conditionals ...
|
|
# ---- rc.local ----
|
|
#
|
|
if [ -r /etc/rc.local ]; then
|
|
echo -n 'Starting local daemons:'
|
|
sh /etc/rc.local
|
|
echo '.'
|
|
fi
|
|
|
|
# For each valid dir in $local_startup, search for init scripts matching *.sh
|
|
#
|
|
case ${local_startup} in
|
|
[Nn][Oo] | '')
|
|
;;
|
|
*)
|
|
echo -n 'Local package initialization:'
|
|
slist=""
|
|
if [ -z "${script_name_sep}" ]; then
|
|
script_name_sep=" "
|
|
fi
|
|
for dir in ${local_startup}; do
|
|
if [ -d "${dir}" ]; then
|
|
for script in ${dir}/*.sh; do
|
|
slist="${slist}${script_name_sep}${script}"
|
|
done
|
|
fi
|
|
done
|
|
script_save_sep="$IFS"
|
|
IFS="${script_name_sep}"
|
|
for script in ${slist}; do
|
|
if [ -x "${script}" ]; then
|
|
(set -T
|
|
trap 'exit 1' 2
|
|
${script} start)
|
|
elif [ -f "${script}" -o -L "${script}" ]; then
|
|
echo -n " (skipping ${script##*/}, not executable)"
|
|
fi
|
|
done
|
|
IFS="${script_save_sep}"
|
|
echo '.'
|
|
;;
|
|
esac
|
|
|
|
if [ -n "${network_pass3_done}" ]; then
|
|
network_pass4
|
|
fi
|
|
|
|
# Late pass to set variables we missed the first time
|
|
#
|
|
if [ -r /etc/rc.sysctl ]; then
|
|
sh /etc/rc.sysctl last
|
|
fi
|
|
|
|
# Raise kernel security level. This should be done only after `fsck' has
|
|
# repaired local filesystems if you want the securelevel to be greater than 1.
|
|
#
|
|
case ${kern_securelevel_enable} in
|
|
[Yy][Ee][Ss])
|
|
if [ "${kern_securelevel}" -ge 0 ]; then
|
|
echo 'Raising kernel security level: '
|
|
sysctl kern.securelevel=${kern_securelevel}
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Start background fsck checks if necessary
|
|
case ${background_fsck} in
|
|
[Yy][Ee][Ss])
|
|
bgfsck_msg='Starting background file system checks'
|
|
if [ ${background_fsck_delay:=0} -gt 0 ]; then
|
|
bgfsck_msg="${bgfsck_msg} in ${background_fsck_delay} seconds"
|
|
fi
|
|
echo "${bgfsck_msg}."
|
|
|
|
(sleep ${background_fsck_delay}; nice -4 fsck -B -p) 2>&1 | \
|
|
logger -p daemon.notice &
|
|
;;
|
|
esac
|
|
|
|
echo ''
|
|
|
|
date
|
|
|
|
exit 0
|
|
|