rc.initdiskless revision 88496
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 88496 2001-12-26 17:00:55Z rwatson $ 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# - mount /etc as an MFS 34# - populate /etc from /conf/default version 35# - override files in /etc with files from /conf/*/etc where 36# '*' is default, netmask of client, ip-address of client 37# 38# WARNING: i thing you should not change /etc/rc or strange things could 39# happen. 40# 41# The operator is in charge of setting /conf/*/etc/* things as appropriate. 42# Typically rc.conf and fstab need to be changed, but possibly 43# also other files such as inetd.conf etc. 44 45# chkerr: 46# 47# Routine to check for error 48# 49# checks error code and drops into shell on failure. 50# if shell exits, terminates script as well as /etc/rc. 51# 52chkerr() { 53 case $1 in 54 0) 55 ;; 56 *) 57 echo "$2 failed: dropping into /bin/sh" 58 /bin/sh 59 # RESUME 60 ;; 61 esac 62} 63 64mount_md() { 65 /sbin/mdconfig -a -t malloc -s $1 -u $3 66 /sbin/disklabel -r -w md$3 auto 67 /sbin/newfs /dev/md$3c 68 /sbin/mount /dev/md$3c $2 69} 70 71# DEBUGGING 72# 73# set -v 74 75# Figure out our interface and IP. 76# 77bootp_ifc="" 78bootp_ipa="" 79bootp_ipbca="" 80iflist=`ifconfig -l` 81for i in ${iflist} ; do 82 set `ifconfig ${i}` 83 while [ $# -ge 1 ] ; do 84 if [ "${bootp_ifc}" = "" -a "$1" = "inet" ] ; then 85 bootp_ifc=${i} ; bootp_ipa=${2} ; shift 86 fi 87 if [ "${bootp_ipbca}" = "" -a "$1" = "broadcast" ] ; then 88 bootp_ipbca=$2; shift 89 fi 90 shift 91 done 92 if [ "${bootp_ifc}" != "" ] ; then 93 break 94 fi 95done 96echo "Interface ${bootp_ifc} IP-Address ${bootp_ipa} Broadcast ${bootp_ipbca}" 97 98 99mount_md 4096 /etc 0 100chkerr $? "MFS mount on /etc" 101/bin/chmod 755 /etc 102 103/bin/cp -Rp /conf/default/etc/* /etc 104chkerr $? "cp /conf/default/etc to /etc MFS" 105 106# Allow for override files to replace files in /etc. Use /conf/*/etc 107# to find the override files. First choice is default files that 108# always override, then files that from the directory that matches the 109# client's broadcast address, finally followed by overrides that match 110# the client's IP address. 111# 112# This way we have some flexibility to handle clusters of machines 113# on separate subnets. 114# 115 116for i in ${bootp_ipbca} ${bootp_ipa} ; do 117 if [ -d /conf/${i}/etc ]; then 118 cp -Rp /conf/${i}/etc/* /etc 119 fi 120done 121 122# Tell /etc/rc to run the specified script after 123# it does its mounts but before it does anything 124# else. 125# 126# This script is responsible for setting up the 127# diskless mount environment. This can be 128# overriden by /conf/ME/rc.conf.local if, for 129# example, you do not want to run the standard 130# system /etc/rc.diskless2 131 132diskless_mount="/etc/rc.diskless2" 133