rc revision 58566
118334Speter#!/bin/sh 252284Sobrien# $FreeBSD: head/etc/rc 58566 2000-03-25 16:17:53Z dan $ 318334Speter# From: @(#)rc 5.27 (Berkeley) 6/5/91 418334Speter 518334Speter# System startup script run by init on autoboot 618334Speter# or after single-user. 718334Speter# Output and error are redirected to console by init, 818334Speter# and the console is the controlling terminal. 918334Speter 1018334Speter# Note that almost all of the user-configurable behavior is no longer in 1118334Speter# this file, but rather in /etc/defaults/rc.conf. Please check that file 1218334Speter# first before contemplating any changes here. If you do need to change 1318334Speter# this file for some reason, we would like to know about it. 1418334Speter 1518334Speterstty status '^T' 1618334Speter 1718334Speter# Set shell to ignore SIGINT (2), but not children; 1818334Speter# shell catches SIGQUIT (3) and returns to single user after fsck. 1918334Speter# 2018334Spetertrap : 2 2118334Spetertrap : 3 # shouldn't be needed 2218334Speter 2350397SobrienHOME=/ 2450397SobrienPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin 2550397Sobrienexport HOME PATH 2618334Speter 2718334Speter# BOOTP diskless boot. We have to run the rc file early in order to 2818334Speter# retarget various config files. 2918334Speter# 3018334Speterif [ -r /etc/rc.diskless1 ]; then 3118334Speter dlv=`/sbin/sysctl -n vfs.nfs.diskless_valid 2> /dev/null` 3218334Speter if [ ${dlv:=0} != 0 ]; then 3318334Speter . /etc/rc.diskless1 3450397Sobrien fi 3550397Sobrienfi 3650397Sobrien 3752284Sobrien# If there is a global system configuration file, suck it in. 3818334Speter# 3918334Speterif [ -r /etc/defaults/rc.conf ]; then 4018334Speter . /etc/defaults/rc.conf 4118334Speterelif [ -r /etc/rc.conf ]; then 4218334Speter . /etc/rc.conf 4318334Speterfi 4418334Speter 4518334Speter# Configure ccd devices. 4618334Speter# 4718334Speterif [ -r /etc/ccd.conf ]; then 4818334Speter ccdconfig -C 4918334Speterfi 5018334Speter 5118334Spetercase ${start_vinum} in 5218334Speter[Yy][Ee][Ss]) 5318334Speter vinum start 5418334Speter ;; 5518334Speteresac 5618334Speter 5718334Speterswapon -a 5818334Speter 5918334Spetercase $1 in 6018334Speterautoboot) 6118334Speter echo Automatic reboot in progress... 6218334Speter fsck -p 6318334Speter case $? in 6418334Speter 0) 6518334Speter ;; 6618334Speter 2) 6718334Speter exit 1 6818334Speter ;; 6918334Speter 4) 7018334Speter reboot 7118334Speter echo "reboot failed... help!" 7218334Speter exit 1 7318334Speter ;; 7418334Speter 8) 7518334Speter echo "Automatic file system check failed... help!" 7618334Speter exit 1 7718334Speter ;; 7818334Speter 12) 7918334Speter echo "Reboot interrupted" 8018334Speter exit 1 8118334Speter ;; 8218334Speter 130) 8318334Speter # interrupt before catcher installed 8418334Speter exit 1 8518334Speter ;; 8618334Speter *) 8718334Speter echo "Unknown error in reboot" 8818334Speter exit 1 8918334Speter ;; 9018334Speter esac 9118334Speter ;; 9218334Speter*) 9318334Speter echo Skipping disk checks ... 9418334Speter ;; 9518334Speteresac 9618334Speter 9718334Speterset -T 9818334Spetertrap "echo 'Reboot interrupted'; exit 1" 3 9918334Speter 10018334Speter# root normally must be read/write, but if this is a BOOTP NFS 10118334Speter# diskless boot it does not have to be. 10218334Speter# 10318334Spetercase ${root_rw_mount} in 10418334Speter[Nn][Oo] | '') 10518334Speter ;; 10618334Speter*) 10718334Speter if ! mount -u -o rw / ; then 10818334Speter echo "Mounting root filesystem rw failed, startup aborted" 10918334Speter exit 1 11018334Speter fi 11118334Speter ;; 11218334Speteresac 11318334Speter 11418334Speterumount -a >/dev/null 2>&1 11518334Speter 11618334Speter# Mount everything except nfs filesystems. 11718334Spetermount -a -t nonfs 11818334Speter 11918334Spetercase $? in 12018334Speter0) 12118334Speter ;; 12218334Speter*) 12318334Speter echo "Mounting /etc/fstab filesystems failed, startup aborted" 12418334Speter exit 1 12518334Speter ;; 12618334Speteresac 12718334Speter 12818334Speter# Run custom disk mounting function here 12918334Speter# 13018334Speterif [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then 13118334Speter sh ${diskless_mount} 13218334Speterfi 13318334Speter 13418334Speteradjkerntz -i 13518334Speter 13618334Speterclean_var() { 13718334Speter if [ ! -f /var/run/clean_var ]; then 13818334Speter rm -rf /var/run/* 13918334Speter rm -f /var/spool/lock/* 14018334Speter rm -rf /var/spool/uucp/.Temp/* 14118334Speter # Keep a copy of the boot messages around 14218334Speter dmesg >/var/run/dmesg.boot 14318334Speter # And an initial utmp file 14418334Speter (cd /var/run && cp /dev/null utmp && chmod 644 utmp;) 14518334Speter >/var/run/clean_var 14618334Speter fi 14718334Speter} 14818334Speter 14918334Speterif [ -d /var/run -a -d /var/spool/lock -a -d /var/spool/uucp/.Temp ]; then 15018334Speter # network_pass1() *may* end up writing stuff to /var - we don't want to 15118334Speter # remove it immediately afterwards - *nor* to we want to fail to clean 15218334Speter # an nfs-mounted /var. 15318334Speter clean_var 15418334Speterfi 15518334Speter 15618334Speter# Add additional swapfile, if configured. 15718334Speter# 15818334Spetercase ${swapfile} in 15918334Speter[Nn][Oo] | '') 16018334Speter ;; 16118334Speter*) 16218334Speter if [ -w "${swapfile}" -a -c /dev/vn0b ]; then 16318334Speter echo "Adding ${swapfile} as additional swap." 16418334Speter vnconfig /dev/vn0b ${swapfile} && swapon /dev/vn0b 16518334Speter fi 16618334Speter ;; 16718334Speteresac 16818334Speter 16918334Speter# Set sysctl variables as early as we can 17018334Speter# 17118334Speterif [ -r /etc/rc.sysctl ]; then 17218334Speter . /etc/rc.sysctl 17318334Speterfi 17418334Speter 17518334Speter# Configure serial devices 17618334Speter# 17718334Speterif [ -r /etc/rc.serial ]; then 17818334Speter . /etc/rc.serial 17918334Speterfi 18018334Speter 18118334Speter# Start up PC-card configuration 18218334Speter# 18318334Speterif [ -r /etc/rc.pccard ]; then 18418334Speter . /etc/rc.pccard 18518334Speterfi 18618334Speter 18718334Speter# Start up the initial network configuration. 18818334Speter# 18918334Speterif [ -r /etc/rc.network ]; then 19018334Speter . /etc/rc.network # We only need to do this once. 19118334Speter network_pass1 19218334Speterfi 19318334Speter 19418334Spetercase ${ipv6_enable} in 19518334Speter[Yy][Ee][Ss]) 19618334Speter if [ -r /etc/rc.network6 ]; then 19718334Speter . /etc/rc.network6 # We only need to do this once also. 19850397Sobrien network6_pass1 19950397Sobrien fi 20050397Sobrien ;; 20150397Sobrienesac 20250397Sobrien 20318334Speter# Mount NFS filesystems if present in /etc/fstab 20418334Speterif mount -d -a -t nfs | grep nfs >/dev/null 2>&1; then 20518334Speter echo -n "Mounting NFS file systems" 20618334Speter mount -a -t nfs 20718334Speter echo . 20818334Speterfi 20918334Speter 21018334Speter# Whack the pty perms back into shape. 21118334Speter# 21218334Speterchflags 0 /dev/tty[pqrsPQRS]* 21350397Sobrienchmod 666 /dev/tty[pqrsPQRS]* 21418334Speterchown root:wheel /dev/tty[pqrsPQRS]* 21518334Speter 21618334Speter# Clean up left-over files 21718334Speter# 21818334Speterclean_var # If it hasn't already been done 21918334Speterrm /var/run/clean_var 22018334Speter 22118334Speter# Clearing /tmp at boot-time seems to have a long tradition. It doesn't 22218334Speter# help in any way for long-living systems, and it might accidentally 22318334Speter# clobber files you would rather like to have preserved after a crash 22418334Speter# (if not using mfs /tmp anyway). 22518334Speter# 22618334Speter# See also the example of another cleanup policy in /etc/periodic/daily. 22718334Speter# 22818334Spetercase ${clear_tmp_enable} in 22918334Speter[Yy][Ee][Ss]) 23018334Speter echo clearing /tmp 23118334Speter # prune quickly with one rm, then use find to clean up /tmp/[lq]* 23218334Speter # (not needed with mfs /tmp, but doesn't hurt there...) 23318334Speter (cd /tmp && rm -rf [a-km-pr-zA-Z]* && 23418334Speter find -d . ! -name . ! -name lost+found ! -name quota.user \ 23518334Speter ! -name quota.group -exec rm -rf -- {} \;) 23618334Speter ;; 23718334Speteresac 23818334Speter 23918334Speter# Remove X lock files, since they will prevent you from restarting X11 24018334Speter# after a system crash. 24118334Speter# 24218334Speterrm -f /tmp/.X*-lock /tmp/.X11-unix/* 24318334Speter 24418334Speter# Snapshot any kernel -c changes back to disk here <someday>. 24518334Speter# This has changed with ELF and /kernel.config. 24618334Speter 24718334Speterecho -n 'additional daemons:' 24818334Speter 24918334Speter# Start system logging and name service. Named needs to start before syslogd 25018334Speter# if you don't have a /etc/resolv.conf. 25118334Speter# 25218334Spetercase ${syslogd_enable} in 25318334Speter[Yy][Ee][Ss]) 25418334Speter # Transitional symlink (for the next couple of years :) until all 25518334Speter # binaries have had a chance to move towards /var/run/log. 25618334Speter if [ ! -h /dev/log ]; then 25718334Speter # might complain for r/o root f/s 25818334Speter ln -sf /var/run/log /dev/log 25918334Speter fi 26018334Speter 26118334Speter rm -f /var/run/log 26218334Speter echo -n ' syslogd'; syslogd ${syslogd_flags} 26318334Speter ;; 26418334Speteresac 26518334Speter 26618334Speterecho '.' 26718334Speter 26818334Speter# Enable dumpdev so that savecore can see it. 26918334Speter# /var/crash should be a directory or a symbolic link 27018334Speter# to the crash directory if core dumps are to be saved. 27118334Speter# 27218334Spetercase ${dumpdev} in 27318334Speter[Nn][Oo] | '') 27418334Speter ;; 27518334Speter*) 27618334Speter if [ -e "${dumpdev}" -a -d /var/crash ]; then 27718334Speter dumpon ${dumpdev} 27850397Sobrien echo -n checking for core dump... 27950397Sobrien savecore /var/crash 28018334Speter fi 28118334Speter ;; 28218334Speteresac 28318334Speter 28418334Speterif [ -n "${network_pass1_done}" ]; then 28518334Speter network_pass2 28618334Speterfi 28718334Speter 28818334Speter# Enable/Check the quotas (must be after ypbind if using NIS) 28952284Sobrien# 29052284Sobriencase ${enable_quotas} in 29152284Sobrien[Yy][Ee][Ss]) 29252284Sobrien case ${check_quotas} in 29352284Sobrien [Yy][Ee][Ss]) 29452284Sobrien echo -n 'checking quotas:' 29552284Sobrien quotacheck -a 29652284Sobrien echo ' done.' 29752284Sobrien ;; 29818334Speter esac 29952284Sobrien 30052284Sobrien echo -n 'enabling quotas:' 30152284Sobrien quotaon -a 30252284Sobrien echo ' done.' 30352284Sobrien ;; 30418334Speteresac 30552284Sobrien 30652284Sobrienif [ -n "${network_pass2_done}" ]; then 30752284Sobrien network_pass3 30818334Speterfi 30952284Sobrien 31052284Sobrien# Build ps databases 31118334Speter# 31252284Sobriendev_mkdb 31352284Sobrien 31452284Sobrien# Check the password temp/lock file 31552284Sobrien# 31652284Sobrienif [ -e /etc/ptmp ]; then 31752284Sobrien logger -s -p auth.err \ 31852284Sobrien "password file may be incorrect -- /etc/ptmp exists" 31952284Sobrienfi 32018334Speter 32118334Spetercase ${accounting_enable} in 32218334Speter[Yy][Ee][Ss]) 32318334Speter if [ -d /var/account ]; then 32418334Speter echo 'turning on accounting' 32518334Speter if [ ! -e /var/account/acct ]; then 32618334Speter touch /var/account/acct 32718334Speter fi 32818334Speter accton /var/account/acct 32918334Speter fi 33018334Speter ;; 33118334Speteresac 33218334Speter 33318334Speter# Make shared lib searching a little faster. Leave /usr/lib first if you 33418334Speter# add your own entries or you may come to grief. 33518334Speter# 33618334Speterif [ -x /sbin/ldconfig ]; then 33718334Speter case `/usr/bin/objformat` in 33818334Speter elf) 33918334Speter _LDC=/usr/lib 34018334Speter for i in ${ldconfig_paths}; do 34118334Speter if [ -d "${i}" ]; then 34218334Speter _LDC="${_LDC} ${i}" 34318334Speter fi 34418334Speter done 34518334Speter echo 'setting ELF ldconfig path:' ${_LDC} 34618334Speter ldconfig -elf ${_LDC} 34718334Speter ;; 34818334Speter esac 34918334Speter 35018334Speter # Legacy aout support for i386 only 35118334Speter case `sysctl -n hw.machine` in 35218334Speter i386) 35318334Speter # Default the a.out ldconfig path. 35418334Speter : ${ldconfig_paths_aout=${ldconfig_paths}} 35518334Speter _LDC=/usr/lib/aout 35618334Speter for i in ${ldconfig_paths_aout}; do 35718334Speter if [ -d "${i}" ]; then 35818334Speter _LDC="${_LDC} ${i}" 35918334Speter fi 36018334Speter done 36118334Speter echo 'setting a.out ldconfig path:' ${_LDC} 36218334Speter ldconfig -aout ${_LDC} 36318334Speter ;; 36418334Speter esac 36518334Speterfi 36618334Speter 36718334Speter# Now start up miscellaneous daemons that don't belong anywhere else 36818334Speter# 36918334Speterecho -n starting standard daemons: 37018334Spetercase ${inetd_enable} in 37118334Speter[Nn][Oo]) 37218334Speter ;; 37318334Speter*) 37418334Speter echo -n ' inetd'; inetd ${inetd_flags} 37518334Speter ;; 37618334Speteresac 37718334Speter 37818334Spetercase ${cron_enable} in 37918334Speter[Nn][Oo]) 38018334Speter ;; 38118334Speter*) 38218334Speter echo -n ' cron'; cron 38318334Speter ;; 38418334Speteresac 38518334Speter 38618334Spetercase ${lpd_enable} in 38718334Speter[Yy][Ee][Ss]) 38818334Speter echo -n ' printer'; ${lpd_program:-/usr/sbin/lpd} ${lpd_flags} 38918334Speter ;; 39018334Speteresac 39118334Speter 39218334Spetercase ${sendmail_enable} in 39318334Speter[Yy][Ee][Ss]) 39418334Speter if [ -r /etc/mail/sendmail.cf ]; then 39518334Speter echo -n ' sendmail'; /usr/sbin/sendmail ${sendmail_flags} 39618334Speter fi 39718334Speter ;; 39818334Speteresac 39918334Speter 40018334Spetercase ${sshd_enable} in 40118334Speter[Yy][Ee][Ss]) 40218334Speter if [ -x ${sshd_program:-/usr/sbin/sshd} ]; then 40318334Speter echo -n ' sshd'; 40418334Speter ${sshd_program:-/usr/sbin/sshd} ${sshd_flags} 40518334Speter fi 40618334Speter ;; 40718334Speteresac 40818334Speter 40918334Spetercase ${usbd_enable} in 41018334Speter[Yy][Ee][Ss]) 41118334Speter echo -n ' usbd'; /usr/sbin/usbd ${usbd_flags} 41218334Speter ;; 41318334Speteresac 41418334Speter 41518334Speterecho '.' 41618334Speter 41718334Speter# Recover vi editor files. 41818334Speterfind /var/tmp/vi.recover ! -type f -a ! -type d -delete 41918334Spetervibackup=`echo /var/tmp/vi.recover/vi.*` 42018334Speterif [ "${vibackup}" != '/var/tmp/vi.recover/vi.*' ]; then 42118334Speter echo 'Recovering vi editor sessions' 42218334Speter for i in /var/tmp/vi.recover/vi.*; do 42318334Speter # Only test files that are readable. 42418334Speter if [ ! -r "${i}" ]; then 42518334Speter continue 42618334Speter fi 42718334Speter 42818334Speter # Unmodified nvi editor backup files either have the 42918334Speter # execute bit set or are zero length. Delete them. 43018334Speter if [ -x "${i}" -o ! -s "${i}" ]; then 43118334Speter rm -f "${i}" 43218334Speter fi 43318334Speter done 43418334Speter 43518334Speter # It is possible to get incomplete recovery files, if the editor 43618334Speter # crashes at the right time. 43718334Speter virecovery=`echo /var/tmp/vi.recover/recover.*` 43818334Speter if [ "${virecovery}" != "/var/tmp/vi.recover/recover.*" ]; then 43918334Speter for i in /var/tmp/vi.recover/recover.*; do 44018334Speter # Only test files that are readable. 44118334Speter if [ ! -r "${i}" ]; then 44218334Speter continue 44318334Speter fi 44418334Speter 44518334Speter # Delete any recovery files that are zero length, 44618334Speter # corrupted, or that have no corresponding backup file. 44718334Speter # Else send mail to the user. 44818334Speter recfile=`awk '/^X-vi-recover-path:/{print $2}' < "${i}"` 44918334Speter if [ -n "${recfile}" -a -s "${recfile}" ]; then 45018334Speter sendmail -t < "${i}" 45118334Speter else 45218334Speter rm -f "${i}" 45318334Speter fi 45418334Speter done 45552284Sobrien fi 45618334Speterfi 45718334Speter 45818334Speter# Make a bounds file for msgs(1) if there isn't one already 45918334Speter# "Delete important files with symlink" security hole? 46018334Speter# 46118334Speterif [ -d /var/msgs -a ! -f /var/msgs/bounds ]; then 46218334Speter echo 0 > /var/msgs/bounds 46318334Speterfi 46418334Speter 46518334Spetercase ${update_motd} in 46618334Speter[Nn][Oo] | '') 46718334Speter ;; 46818334Speter*) 46918334Speter if T=`mktemp /tmp/_motd.XXXXXX`; then 47018334Speter uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' > ${T} 47118334Speter awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' < /etc/motd >> ${T} 47218334Speter cmp -s ${T} /etc/motd || { 47318334Speter cp ${T} /etc/motd 47418334Speter chmod 644 /etc/motd 47518334Speter } 47618334Speter rm -f ${T} 47718334Speter fi 47818334Speter ;; 47918334Speteresac 48018334Speter 48118334Speter# Configure implementation specific stuff 48218334Speter# 48318334Speterarch=`uname -m` 48418334Speterif [ -r /etc/rc.${arch} ]; then 48518334Speter . /etc/rc.${arch} 48618334Speterfi 48718334Speter 48818334Speter# Run rc.devfs if readable to customize devfs 48918334Speter# 49018334Speterif [ -r /etc/rc.devfs ]; then 49118334Speter sh /etc/rc.devfs 49218334Speterfi 49350397Sobrien 49450397Sobrien# Do traditional (but rather obsolete) rc.local file if it exists. If you 49550397Sobrien# use this file and want to make it programmatic, source /etc/defaults/rc.conf 49650397Sobrien# in /etc/rc.local and add your custom variables to /etc/rc.conf, as 49750397Sobrien# shown below. Please do not put local extensions into /etc/rc itself. 49850397Sobrien# Use /etc/rc.local 49918334Speter# 50052284Sobrien# ---- rc.local ---- 50152284Sobrien# if [ -r /etc/defaults/rc.conf ]; then 50252284Sobrien# . /etc/defaults/rc.conf 50352284Sobrien# fi 50452284Sobrien# 50552284Sobrien# ... additional startup conditionals ... 50652284Sobrien# ---- rc.local ---- 50752284Sobrien# 50852284Sobrienif [ -r /etc/rc.local ]; then 50952284Sobrien echo -n 'starting local daemons:' 51052284Sobrien sh /etc/rc.local 51152284Sobrien echo '.' 51252284Sobrienfi 51352284Sobrien 51452284Sobrien# For each valid dir in $local_startup, search for init scripts matching *.sh 51552284Sobrien# 51652284Sobriencase ${local_startup} in 51752284Sobrien[Nn][Oo] | '') 51852284Sobrien ;; 51918334Speter*) 52018334Speter echo -n 'Local package initialization:' 52118334Speter for dir in ${local_startup}; do 52252284Sobrien if [ -d "${dir}" ]; then 52318334Speter for script in ${dir}/*.sh; do 52450397Sobrien if [ -x "${script}" ]; then 52550397Sobrien (set -T 52650397Sobrien trap 'exit 1' 2 52750397Sobrien ${script} start) 52850397Sobrien fi 52950397Sobrien done 53050397Sobrien fi 53150397Sobrien done 53250397Sobrien echo . 53350397Sobrien ;; 53418334Speteresac 53518334Speter 53618334Speterif [ -n "${network_pass3_done}" ]; then 53718334Speter network_pass4 53818334Speterfi 53918334Speter 54018334Speter# Raise kernel security level. This should be done only after `fsck' has 54118334Speter# repaired local file systems if you want the securelevel to be greater than 1. 54218334Speter# 54318334Spetercase ${kern_securelevel_enable} in 54418334Speter[Yy][Ee][Ss]) 54518334Speter if [ "${kern_securelevel}" -ge 0 ]; then 54618334Speter echo 'Raising kernel security level' 54718334Speter sysctl -w kern.securelevel=${kern_securelevel} 54818334Speter fi 54918334Speter ;; 55018334Speteresac 55118334Speter 55218334Speterdate 55318334Speterexit 0 55418334Speter