1#!/bin/sh
2#
3# (C) 2001 Luigi Rizzo, Gabriele Cecchetti
4#	<Standard BSD copyright>
5# Revised 2001.04.16
6#
7# $FreeBSD$
8#
9# clone root filesystem for diskless root stuff
10#
11# usage
12#	clone_root all		to do a full copy (e.g. bin, sbin...)
13#	clone_root update	to recreate /var (including devices)
14#	clone_root		to copy /conf and password-related files
15#
16# This script assumes that you use a shared readonly root and /usr
17# partition. The script creates a partial clone of the root partition,
18# and puts it into ${DEST} (defaults to /diskless_root ) on the server,
19# where it is read.
20#
21# To run a diskless install you need to do the following:
22#
23# create /conf/default/etc/fstab
24#    this will replace the standard /etc/fstab and should contain
25#    as a minimum the following lines
26#    ${SERVER}:${DEST} /     nfs    ro 0 0
27#    ${SERVER}:/usr    /usr  nfs    ro 0 0
28#    proc              /proc procfs rw 0 0
29#
30# create /conf/default/etc/rc.conf
31#    this will replace the standard rc.conf and should contain
32#    the startup options for the diskless client. Most likely
33#    you will not need to set hostname and ifconfig_* because these
34#    will be already set by the startup code. You will also
35#    probably need to set local_startup="" so that the server's
36#    local startup files will not be used.
37#
38# create a kernel config file in /sys/i386/conf/DISKLESS with
39#	options MD_ROOT
40#	options BOOTP
41#	options BOOTP_NFSROOT
42#	options BOOTP_COMPAT
43# and do a full build of the kernel.
44# If you use the firewall, remember to default to open or your kernel
45# will not be able to send/receive the bootp packets.
46#
47# On the server:
48# enable NFS server and set /etc/exports as
49#	${DEST}	-maproot=0 -alldirs <list of diskless clients>
50#	/usr -alldirs
51#
52# enable bootpd by uncommenting the bootps line in /etc/inetd.conf
53# and putting at least the following entries in /etc/bootptab:
54#  .default:\
55#	hn:ht=1:vm=rfc1048:\
56#	:sm=255.255.255.0:\
57#	:sa=${SERVER}:\
58#	:gw=${GATEWAY}:\
59#	:rp="${SERVER}:${DEST}":
60#
61#  client1:ha=0123456789ab:tc=.default
62#
63# and make sure that client1 is listed in /etc/hosts
64
65# VARIABLES:
66#	some manual init is needed here.
67# DEST	the diskless_root dir (goes into /etc/bootptab and /etc/exports
68#	on the server)
69DEST=/diskless_root
70
71# you should not touch these vars:
72# SYSDIRS	system directories and mountpoints
73# DIRS		mountpoints (empty dirs)
74# PWFILES	files related to passwords
75# TOCOPY	files and dirs to copy from root partition
76
77SYSDIRS="dev proc root usr var"
78DIRS="cdrom home mnt"
79PWFILES="master.passwd passwd spwd.db pwd.db"
80TOCOPY="bin boot compat etc modules sbin stand sys"
81
82init_diskless_root() {
83	echo "Cleaning old diskless root ($DEST)"
84	cd /
85	rm -rf ${DEST} && echo "Old diskless root removed."
86	echo "Creating $DEST..."
87	mkdir -p $DEST && echo "New diskless root created."
88	echo "+++ Now copy original tree from / ..."
89	ex=""
90	(cd / ; tar -clf - ${TOCOPY} ) | (cd $DEST; tar xvf - )
91	#(cd / ; find -x dev | cpio -o -H newc ) | \
92	#	(cd $DEST; cpio -i -H newc -d )
93	echo "+++ Fixing permissions on some objects"
94	chmod 555 $DEST/sbin/init
95}
96
97update_conf_and_pw() {
98	echo "+++ Copying files in /conf and password files"
99	(cd ${DEST} ; rm -rf conf )
100	(cd / ; tar clf - conf ) | (cd ${DEST}; tar xvf - )
101	mkdir -p ${DEST}/conf/etc	# used to mount things
102	(cd /etc ; tar cvf - ${PWFILES} ) | (cd ${DEST}/etc ; tar xf - )
103}
104
105update() {
106	echo "+++ update: create mountpoints and device entries, kernel"
107	for i in ${SYSDIRS} ${DIRS}
108	do
109	    rm -r -f ${DEST}/$i
110	    mkdir -p ${DEST}/$i && chown root:wheel ${DEST}/$i && echo -n "$i "
111	done
112	echo "."
113	ln -s /var/tmp ${DEST}/tmp
114	echo "+++ Copying kernel from /sys/compile/DISKLESS"
115	cp /sys/compile/DISKLESS/kernel $DEST/kernel
116	echo "."
117}
118
119
120# Main entry point
121case $1 in
122	all)	# clean and reinstall the whole diskless_root
123		init_diskless_root
124		update
125		update_conf_and_pw
126		;;
127
128	update)	# clean and rebuild mountpoints and device entries
129		update
130		update_conf_and_pw
131		;;
132
133	*)	# copy /conf and password files
134		update_conf_and_pw
135		;;
136esac
137exit 0
138### end of file ###
139