rc.initdiskless revision 75746
1# Copyright (c) 1999 Matt Dillion 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions 6# are met: 7# 1. Redistributions of source code must retain the above copyright 8# notice, this list of conditions and the following disclaimer. 9# 2. Redistributions in binary form must reproduce the above copyright 10# notice, this list of conditions and the following disclaimer in the 11# documentation and/or other materials provided with the distribution. 12# 13# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23# SUCH DAMAGE. 24# 25# $FreeBSD: head/etc/rc.initdiskless 75746 2001-04-20 23:10:11Z bsd $ 26# 27 28# 29# /etc/rc.diskless1 - general BOOTP startup 30# 31# BOOTP has mounted / for us. Assume a read-only mount. We must then 32# - figure out our IP by querying the interface 33# - copy /etc temporarily out of the way to /tmp/etc 34# - mount /etc as an MFS 35# - repopulate /etc with the saved off copy 36# - override files in /etc with files from /conf/*/etc where 37# '*' is default, netmask of client, ip-address of client 38# 39# WARNING: i thing you should not change /etc/rc or strange things could 40# happen. 41# 42# The operator is in charge of setting /conf/*/etc/* things as appropriate. 43# Typically rc.conf and fstab need to be changed, but possibly 44# also other files such as inetd.conf etc. 45 46# chkerr: 47# 48# Routine to check for error 49# 50# checks error code and drops into shell on failure. 51# if shell exits, terminates script as well as /etc/rc. 52# 53chkerr() { 54 case $1 in 55 0) 56 ;; 57 *) 58 echo "$2 failed: dropping into /bin/sh" 59 /bin/sh 60 # RESUME 61 ;; 62 esac 63} 64 65# DEBUGGING 66# 67# set -v 68 69# Figure out our interface and IP. 70# 71bootp_ifc="" 72bootp_ipa="" 73bootp_ipbca="" 74iflist=`ifconfig -l` 75for i in ${iflist} ; do 76 set `ifconfig ${i}` 77 while [ $# -ge 1 ] ; do 78 if [ "${bootp_ifc}" = "" -a "$1" = "inet" ] ; then 79 bootp_ifc=${i} ; bootp_ipa=${2} ; shift 80 fi 81 if [ "${bootp_ipbca}" = "" -a "$1" = "broadcast" ] ; then 82 bootp_ipbca=$2; shift 83 fi 84 shift 85 done 86 if [ "${bootp_ifc}" != "" ] ; then 87 break 88 fi 89done 90echo "Interface ${bootp_ifc} IP-Address ${bootp_ipa} Broadcast ${bootp_ipbca}" 91 92 93# Create an MFS /tmp to temporarily hold files from /etc until we 94# can bootstrap /etc as an MFS. 95 96/sbin/mount_mfs -s 4096 -T qp120at dummy /tmp 97chkerr $? "MFS mount on /tmp" 98/bin/cp -Rp /etc /tmp 99chkerr $? "cp /etc to /tmp/etc MFS" 100 101/sbin/mount_mfs -s 4096 -T qp120at dummy /etc 102chkerr $? "MFS mount on /etc" 103/bin/chmod 755 /etc 104 105/bin/cp -Rp /tmp/etc/* /etc 106chkerr $? "cp /tmp/etc to /etc MFS" 107 108rm -rf /tmp/etc 109/sbin/umount /tmp 110 111 112# Allow for override files to replace files in /etc. Use /conf/*/etc 113# to find the override files. First choice is default files that 114# always override, then files that from the directory that matches the 115# client's broadcast address, finally followed by overrides that match 116# the client's IP address. 117# 118# This way we have some flexibility to handle clusters of machines 119# on separate subnets. 120# 121 122for i in default ${bootp_ipbca} ${bootp_ipa} ; do 123 if [ -d /conf/${i}/etc ]; then 124 cp -Rp /conf/${i}/etc/* /etc 125 fi 126done 127 128# Tell /etc/rc to run the specified script after 129# it does its mounts but before it does anything 130# else. 131# 132# This script is responsible for setting up the 133# diskless mount environment. This can be 134# overriden by /conf/ME/rc.conf.local if, for 135# example, you do not want to run the standard 136# system /etc/rc.diskless2 137 138diskless_mount="/etc/rc.diskless2" 139