tinybsd revision 163854
1162485Sjulian#!/bin/sh -
2162485Sjulian# Copyright (c) 2006 Jean Milanez Melo <jmelo@freebsdbrasil.com.br>
3162485Sjulian#				       <jmelo@FreeBSD.org>
4162485Sjulian#		     Patrick Tracanelli <eksffa@freebsdbrasil.com.br>
5162485Sjulian#
6162485Sjulian# $FreeBSD: head/tools/tools/tinybsd/tinybsd 163854 2006-11-01 01:25:51Z julian $
7162485Sjulian#set -xv
8162485SjulianCURRENTDIR=/usr/src/tools/tools/tinybsd
9163253Sjulianif [ ! -d $CURRENTDIR ]
10163253Sjulianthen
11163253Sjulian  CURRENTDIR=`pwd`
12163254Sjulianelse
13163254Sjulian  cd $CURRENTDIR
14163253Sjulianfi
15162485SjulianWORKDIR=/usr/obj/tinybsdbuild
16162485SjulianKERNCONF=TINYBSD
17163806SjulianBASEFILE="tinybsd.basefiles"
18163854SjulianPORTSFILE="tinybsd.ports"
19163854SjulianPORTSDIR=/usr/ports
20163854SjulianPKGDIRS=/tmp/pkg.dirs
21163854SjulianPKGFILES=/tmp/pkg.files
22162485SjulianDEFINSTARGS="-o 0 -g 0 -m 555"
23162485SjulianTS="=====>"
24162485Sjulian
25163017Sjuliansplitarg1 () {
26163017Sjulian   local IFS
27163017Sjulian   IFS='='
28163017Sjulian   set $1
29163017Sjulian   echo $1
30163017Sjulian}
31162485Sjulian
32163017Sjuliansplitarg2 () {
33163017Sjulian   local IFS
34163017Sjulian   IFS='='
35163017Sjulian   set $1
36163017Sjulian   echo $2
37163017Sjulian}
38162485Sjulian
39163017Sjuliangetargs () {
40163017Sjulian ARGS="$*"
41163017Sjulian for arg in $* 
42163017Sjulian do
43163017Sjulian   ARG=`splitarg1 $arg`
44163017Sjulian   VAL=`splitarg2 $arg`
45163017Sjulian   case $ARG in
46163017Sjulian     sectors)
47163017Sjulian        SECTUNIT=$VAL
48163017Sjulian        ;;
49163017Sjulian     heads)
50163017Sjulian        TRACKCYL=$VAL 
51163017Sjulian        ;;
52163017Sjulian     spt)
53163017Sjulian        SECTRACK=$VAL
54163017Sjulian        ;;
55163017Sjulian     conf)
56163017Sjulian        CONF=$VAL
57163017Sjulian        ;;
58163017Sjulian     mfsroot)
59163017Sjulian        MFSROOT=$VAL
60163017Sjulian        ;;
61163017Sjulian     image)
62163017Sjulian        IMG=$VAL
63163017Sjulian        ;;
64163017Sjulian     batch)
65163017Sjulian        NO_PROMPTS="YES"
66163017Sjulian        ;;
67163017Sjulian     new)
68163017Sjulian        NO_READ="YES"
69163017Sjulian        ;;
70163017Sjulian     *)
71163017Sjulian         usage
72163017Sjulian         ;;
73163017Sjulian    esac
74163017Sjulian done
75163017Sjulian}
76162485Sjulian
77163017Sjulianusage () {
78163017Sjulian    echo "Woops
79163017Sjulian    Usage: $0 sectors=<size of media> [80000]
80163017Sjulian              heads=<heads according to firmware>  [4]
81163017Sjulian              spt=<sectors per track according to firmware> [32]
82163017Sjulian              conf=<configuration name> (see conf/name) [default]
83163017Sjulian              mfsroot[=<yes|no>] [no]
84163017Sjulian              image=<tinybsd image name> [tinybsd.bin]
85163017Sjulian              batch[=<anything>]  (do not ask interactively)
86163017Sjulian              new[=<anything>]  (do not read previous values)
87162485Sjulian
88163017Sjulian     Examples:
89163017Sjulian    $0 sectors=65536 heads=8 spt=16 conf=wireless mfsroot=yes image=myimage.img batch
90162485Sjulian
91163017Sjulian     Default values are set in the program.
92163017Sjulian     Environment values override defaults.
93163017Sjulian     Previous values override environment values but can be disabled.
94163017Sjulian     Command arguments override previous values.
95163017Sjulian     Interactive values override command arguments but can be disabled. 
96163017Sjulian
97163017Sjulian     Run diskinfo(8) -v against your CF device to get correct information
98163017Sjulian     about your disk. USB keys do not need any specific geometry"
99163017Sjulian    exit 1
100163017Sjulian}
101163017Sjulian
102163017Sjulian########
103163017Sjulian# Load variables from stdin (could be a file)
104163017Sjulian# Look for lines that match foo=bar
105163017Sjulian# do not run the file.. that is asking for trouble
106163017Sjulian########
107163017Sjulianloadvars () {
108163017Sjulian  while :
109163017Sjulian  do
110163017Sjulian    OIFS=$IFS
111163017Sjulian    IFS="="
112163017Sjulian    if read PART1 PART2
113163017Sjulian    then
114163017Sjulian      IFS="$OIFS"
115163017Sjulian      case "$PART1" in
116163017Sjulian      \#*)
117163017Sjulian        ;;
118163017Sjulian      "")
119163017Sjulian        ;;
120163017Sjulian      *)
121163017Sjulian        set "${PART1}"
122163017Sjulian        if [ $# = "1" ]
123163017Sjulian        then
124163017Sjulian          eval "${PART1}='${PART2}'"
125163017Sjulian        fi
126163017Sjulian        ;;
127163017Sjulian      esac
128163017Sjulian    else
129163017Sjulian      IFS="$OIFS"
130163017Sjulian      return 0
131163017Sjulian    fi
132163017Sjulian  done
133163017Sjulian}
134163017Sjulian
135163017Sjulian########
136163017Sjulian# get values from the user
137163017Sjulian########
138163017Sjulianconfirm_action(){
139163017Sjulian    local ANSWER
140163017Sjulian    local MESSAGE
141163017Sjulian    ANSWER=$1
142163017Sjulian    MESSAGE=$2
143163017Sjulian    if [ "$NO_PROMPTS" != "YES" ]
144163017Sjulian    then
145163253Sjulian        echo -n "$MESSAGE [$ANSWER] " > /dev/tty
146163017Sjulian        read result
147163017Sjulian        [ "$result" != "" ] && ANSWER=$result
148163017Sjulian    fi
149163017Sjulian
150163017Sjulian    ANSWER=`eval "echo $ANSWER"`
151163017Sjulian    echo $ANSWER
152163017Sjulian}
153163017Sjulian
154163017Sjulian########
155163017Sjulian# These are only used the VERY first time you run the program (on this machine)
156163017Sjulian########
157163017Sjuliansetdefaults () {
158163017Sjulian  NO_PROMPTS=${NO_PROMPTS:-NO}
159163017Sjulian  NO_READ=${NO_READ:-NO}
160163017Sjulian  SECTUNIT=${SECTUNIT:-80000}; export SECTUNIT
161163017Sjulian  TRACKCYL=${TRACKCYL:-4}; export TRACKCYL
162163017Sjulian  SECTRACK=${SECTRACK:-32}; export SECTRACK
163163017Sjulian  CONF=${CONF:-default}; export CONF
164163017Sjulian  MFSROOT=${MFSROOT:-NO}; export MFSROOT
165163017Sjulian  IMG=${IMG:-tinybsd.bin}; export IMG
166163017Sjulian
167163017Sjulian}
168163017Sjulian
169163017Sjulian#######
170163017Sjulian# get ourselves set up.
171163017Sjulian# Partly by reading config files and partly from asking questions.
172163017Sjulian#######
173163017Sjulianloadconfig () {
174163017Sjulian  if [ "${NO_READ}" = "YES" ]
175163017Sjulian  then
176163017Sjulian    return
177163017Sjulian  fi
178163017Sjulian
179163017Sjulian  HOSTNAME=`hostname`
180163017Sjulian  HOSTPART=${HOSTNAME%%.*}
181163017Sjulian  FILENAME=".tinybsd.${HOSTPART}.${USER}"
182163017Sjulian  FULLFILENAME=$HOME/$FILENAME
183163017Sjulian
184163017Sjulian  if [ -f ${FULLFILENAME} ]
185163017Sjulian  then
186163017Sjulian    loadvars <${FULLFILENAME}
187163017Sjulian  fi
188163017Sjulian
189163017Sjulian  SECTUNIT=`confirm_action "$SECTUNIT" "512 byte sectors per unit?"`
190163017Sjulian  TRACKCYL=`confirm_action "$TRACKCYL" "Tracks per cylinder?"`
191163017Sjulian  SECTRACK=`confirm_action "$SECTRACK" "Sectors per track?"`
192163253Sjulian  while :
193163253Sjulian  do
194163253Sjulian    echo "The following configurations exist:"
195163253Sjulian    ls -l conf|awk '/^d/{print "    ",$9}'|grep -v CVS
196163253Sjulian    CONF=`confirm_action "$CONF" "Configuration name?"`
197163253Sjulian    if [ ! -d "${CURRENTDIR}/conf/$CONF" ]
198163253Sjulian    then
199163253Sjulian      echo "${TS} Error: Could not find config (${CONF})"
200163253Sjulian      if [ "$NO_PROMPTS" = "YES" ]
201163253Sjulian      then
202163253Sjulian        exit 1
203163253Sjulian      fi
204163253Sjulian    else
205163253Sjulian      break
206163253Sjulian    fi
207163253Sjulian  done
208163253Sjulian  MFSROOT=`confirm_action "$MFSROOT" "Use an MFSROOT? (YES/NO)"`
209163017Sjulian  IMG=`confirm_action "$IMG" "Image file to generate?"`
210163017Sjulian
211163017Sjulian# example of formatted value (NNN in this case)
212163017Sjulian#  #condition and format the number
213163017Sjulian#  if [ -z "${BUILDNUM}" ]
214163017Sjulian#  then
215163017Sjulian#    echo "Starting with build 001"
216163017Sjulian#    BUILDNUM="001"
217163017Sjulian#  else
218163017Sjulian#    BUILDNUM=`printf "%03d\n" $(($BUILDNUM))`
219163017Sjulian#  fi
220163017Sjulian
221163017Sjulian
222163017Sjulian}
223163017Sjulian
224163017Sjuliansaveconfig () {
225163017Sjulian  HOSTNAME=`hostname`
226163017Sjulian  HOSTPART=${HOSTNAME%%.*}
227163017Sjulian  FILENAME=".tinybsd.${HOSTPART}.${USER}"
228163017Sjulian  FULLFILENAME=$HOME/$FILENAME
229163017Sjulian  (
230163017Sjulian    echo "# written by tinybsd" `date` 
231163017Sjulian    echo "SECTUNIT=${SECTUNIT}"
232163017Sjulian    echo "TRACKCYL=${TRACKCYL}"
233163017Sjulian    echo "SECTRACK=${SECTRACK}"
234163017Sjulian    echo "CONF=${CONF}"
235163017Sjulian    echo "MFSROOT=${MFSROOT:-NO}"
236163017Sjulian    echo "IMG=${IMG}"
237163017Sjulian  ) >${FULLFILENAME}
238163017Sjulian}
239163017Sjulian
240162485Sjuliancheck_alt_imgname() {
241163017Sjulian	if [ ${IMG} = 'tinybsd.bin' ]
242162485Sjulian	then
243162485Sjulian		echo "${TS} Alternative image name not set; defaulting to 'tinybsd.bin'"
244162485Sjulian	fi
245162485Sjulian}
246162485Sjulian
247163806Sjulianrotate_buidlog() {
248163806Sjulian	mv -f ${HOME}/tinybsd.log ${HOME}/tinybsd.log.old
249163806Sjulian}
250163806Sjulian
251162485Sjulianremove_workdir() {
252162485Sjulian	chflags -R noschg ${WORKDIR}
253162485Sjulian	echo "${TS} Removing "${WORKDIR}
254162485Sjulian	rm -rf ${WORKDIR}
255162485Sjulian	echo "${TS} Removing Build Kernel Directory"
256162485Sjulian	rm -rf /usr/obj/usr/src/sys/${KERNCONF}
257162485Sjulian	echo "${TS}  done."
258162485Sjulian}
259162485Sjulian
260162485Sjulian
261162485Sjulianprework() {
262163806Sjulian	remove_workdir
263162485Sjulian	mkdir -p ${WORKDIR}
264162485Sjulian}
265162485Sjulian
266162485Sjulian
267162485Sjuliancreate_tree() {
268162485Sjulian	echo "${TS} Creating directory hierarchy... "
269162485Sjulian	mtree -deU -f /etc/mtree/BSD.root.dist -p ${WORKDIR}
270162485Sjulian	mtree -deU -f /etc/mtree/BSD.usr.dist -p ${WORKDIR}/usr
271163806Sjulian	mtree -deU -f /etc/mtree/BSD.local.dist -p ${WORKDIR}/usr/local
272162485Sjulian	mtree -deU -f /etc/mtree/BSD.var.dist -p ${WORKDIR}/var
273162485Sjulian}
274162485Sjulian
275163806Sjuliancopy_binaries() {
276163806Sjulian	cd ${CURRENTDIR}/conf/${CONF}
277162485Sjulian
278163854Sjulian	for file in `cat ${BASEFILE} | grep -v "#" | \
279162485Sjulian		cut -f1 -d":" | sort | uniq` ; do
280162485Sjulian		echo "${TS} Copying "/${file}" to "${WORKDIR}/${file} 
281162485Sjulian		cp -fp /${file} ${WORKDIR}/${file} ;
282162485Sjulian	done
283162485Sjulian}
284162485Sjulian
285163854Sjulianinstall_ports() {
286163854Sjulian	for portname in `cat ${PORTSFILE} | grep -v '#'` ; do
287163854Sjulian	    cd ${PORTSDIR}/${portname}
288163854Sjulian	    pkgname=`make -V PKGNAME`
289163854Sjulian	    pkg_info -VQ ${pkgname}
290163854Sjulian	    install=`echo $?`
291163854Sjulian            if [ ${install} -eq 0 ] ; then
292163854Sjulian	       echo "$portname is already installed..."
293163854Sjulian	       create_missingdir
294163854Sjulian	       copy_ports
295163854Sjulian	      else
296163854Sjulian	        make install clean
297163854Sjulian		create_missingdir
298163854Sjulian	        copy_ports
299163854Sjulian	    fi
300163854Sjulian	done
301163854Sjulian}
302163854Sjulian
303163854Sjuliancreate_missingdir() {
304163854Sjulianpkg_info -L ${pkgname} | egrep -v '(Information|Files|www|share|doc|man|include)' | sort | uniq >> ${PKGDIRS}
305163854Sjulian	for dir in `cat ${PKGDIRS}`; do
306163854Sjulian   	  if [ ! -d `dirname ${WORKDIR}/${dir}` ] ; then
307163854Sjulian    	    mkdir -p `dirname ${WORKDIR}/${dir}`
308163854Sjulian   	  fi
309163854Sjulian	done
310163854Sjulian	rm ${PKGDIRS}
311163854Sjulian}
312163854Sjulian
313163854Sjuliancopy_ports() {
314163854Sjulianpkg_info -L ${pkgname} | egrep -v '(Information|Files|www|share|doc|man|include)' >> ${PKGFILES}
315163854Sjulian        for port in `cat ${PKGFILES}` ; do
316163854Sjulian                echo "${TS} Copying "${port}" to "${WORKDIR}${port}
317163854Sjulian                cp -fp ${port} ${WORKDIR}${port} ;
318163854Sjulian        done
319163854Sjulian}
320163854Sjulian
321162485Sjulianmake_kernel() {
322162485Sjulian	echo "${TS} Building customized tiny beastie kernel... "
323162485Sjulian	cp -p ${CURRENTDIR}/conf/${CONF}/${KERNCONF} /usr/src/sys/i386/conf
324162485Sjulian	cd /usr/src
325162485Sjulian	make buildkernel KERNCONF=${KERNCONF} || exit 1
326162485Sjulian	gzip -9 /usr/obj/usr/src/sys/${KERNCONF}/kernel
327162485Sjulian	install ${DEFINSTARGS} /usr/obj/usr/src/sys/${KERNCONF}/kernel.gz ${WORKDIR}/boot/kernel/
328162485Sjulian	install ${DEFINSTARGS} \
329162485Sjulian	  /usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/acpi/acpi/acpi.ko \
330162485Sjulian	    ${WORKDIR}/boot/kernel
331162485Sjulian	install -o 0 -g 0 -m 444 /sys/i386/conf/GENERIC.hints ${WORKDIR}/boot/device.hints
332162485Sjulian}
333162485Sjulian
334162485Sjuliancopy_libraries() {
335162485Sjulian	TDEPFILE="`mktemp -t deps`"
336162485Sjulian	TDEPFILES="`mktemp -t depsymlnk`"
337162485Sjulian
338162485Sjulian	cd ${CURRENTDIR}/conf/${CONF}
339163854Sjulian	for file in `cat ${BASEFILE} ${PKGFILES} | grep -v "#" | cut -f1 -d":"`; do
340162485Sjulian		ldd -f "%p\n" /${file} >> ${TDEPFILE} ; # don't worry on progs been "not dynamic"
341162485Sjulian	done
342162485Sjulian
343163854Sjulian	rm ${PKGFILES}
344163854Sjulian
345162485Sjulian	for libdeplib in `cat ${TDEPFILE} | sort | uniq`; do
346162485Sjulian		ldd -f "%p\n" /${libdeplib} >> ${TDEPFILE} ;
347162485Sjulian	done
348163854Sjulian
349162485Sjulian	for pamdep in `ls -1 /usr/lib/pam*`; do
350162485Sjulian		echo $pamdep >> ${TDEPFILE} ;
351162485Sjulian		ldd -f "%p\n" /${pamdep} >> ${TDEPFILE} ;
352162485Sjulian	done	
353163806Sjulian
354162485Sjulian	for lib in `cat ${TDEPFILE} | sort | uniq`; do
355162485Sjulian		echo "${TS} Copying "${lib}" to "${WORKDIR}${lib}
356162485Sjulian		cp -fp ${lib} ${WORKDIR}${lib} ;
357162485Sjulian	done
358162485Sjulian
359162485Sjulian	for depsymlink in `cat ${TDEPFILE}`; do
360162485Sjulian		echo "${TS} Checking if ${depsymlink} is a symbolic link"
361162485Sjulian		/bin/ls -l $depsymlink | grep "\->" | awk '{print $11":"$9}' >> ${TDEPFILES}
362162485Sjulian	done
363162485Sjulian
364162485Sjulian	for i in `cat ${TDEPFILES}`; do
365162485Sjulian                SOURCE_FILE=`echo $i | awk -F ":" '{print $1}'`
366162485Sjulian                TARGET_FILE=`echo $i | awk -F ":" '{print $2}'`
367162485Sjulian
368162485Sjulian		echo "${TS} Unlinking ${WORKDIR}${TARGET_FILE}"
369163806Sjulian		chroot ${WORKDIR} /bin/chflags 0 ${TARGET_FILE}
370162485Sjulian                chroot ${WORKDIR} /bin/rm -f ${TARGET_FILE}
371162485Sjulian
372162485Sjulian		echo "${TS} Symlinking ${SOURCE_FILE} to ${TARGET_FILE}"
373162485Sjulian                chroot ${WORKDIR} /bin/ln -s ${SOURCE_FILE} ${TARGET_FILE}
374162485Sjulian        done
375162485Sjulian
376162485Sjulian	echo -n "${TS} Unlinking "
377162485Sjulian	rm -fv ${TDEPFILE} ${TDEPFILES}
378162485Sjulian}
379162485Sjulian
380163854Sjuliandeinstall_ports() {
381163854Sjulian	for portname in `cat ${PORTSFILE} | grep -v '#'` ; do
382163854Sjulian            cd ${PORTSDIR}/${portname}    
383163854Sjulian             if [ $? -ne ${install} ] ; then
384163854Sjulian               make deinstall
385163854Sjulian             fi
386163854Sjulian	done
387163854Sjulian}
388162485Sjulian
389162485Sjuliancreate_etc() {
390162485Sjulian	cd /usr/src/etc/sendmail/
391162485Sjulian	make freebsd.cf freebsd.submit.cf
392162485Sjulian
393162485Sjulian	cd /usr/src/etc/
394162485Sjulian	mkdir -p ${WORKDIR}/var/named/etc/namedb
395162485Sjulian	make distribution DESTDIR=${WORKDIR}
396162485Sjulian}
397162485Sjulian
398163017Sjuliancreate_ssh_keys() {
399163017Sjulian	echo "Creating ssh keys..."
400163017Sjulian	ssh-keygen -t rsa1 -b 1024  -f ${WORKDIR}/etc/ssh/ssh_host_key -N ''
401163017Sjulian	ssh-keygen -t dsa -f ${WORKDIR}/etc/ssh/ssh_host_dsa_key -N ''
402163017Sjulian	ssh-keygen -t rsa -f ${WORKDIR}/etc/ssh/ssh_host_rsa_key -N ''
403163017Sjulian}
404163017Sjulian
405163806Sjulianpersonal_conf() {
406162485Sjulian	echo "${TS} Copying your custom configuration on conf/ ..."
407163806Sjulian	for custom in `find ${CURRENTDIR}/conf/${CONF}/ -type d -depth 1 \! -name CVS`; do
408162485Sjulian		cp -Rp ${custom}/* ${WORKDIR}/${custom#${CURRENTDIR}/conf/${CONF}/}/
409162485Sjulian	done
410163806Sjulian
411163806Sjulian	if [ -f ${CURRENTDIR}/conf/${CONF}/boot.config ]; then
412163806Sjulian		cp ${CURRENTDIR}/conf/${CONF}/boot.config ${WORKDIR}/boot.config
413163806Sjulian	fi
414162485Sjulian}
415162485Sjulian
416162485Sjuliansymlinks() {
417163854Sjulian#set -xv
418163854Sjulian	for i in `cat ${BASEFILE} ${PORTSFILE} | grep -v "#" | grep ":"`; do
419162485Sjulian		SOURCE_FILE=`echo $i | awk -F ":" {'print $1'}`
420162485Sjulian		TARGET_FILE=`echo $i | awk -F ":" {'print $2'}`
421162485Sjulian		chroot ${WORKDIR} /bin/ln -vs /${SOURCE_FILE} ${TARGET_FILE}
422162485Sjulian	done
423163854Sjulian#set +xv
424162485Sjulian}
425162485Sjulian
426162485Sjulian
427162485Sjuliancreate_image() {
428162485Sjulian	VNODEFILE=`mktemp -t tinybsd`
429162485Sjulian	IMGMNT=`mktemp -d -t tinybsd`
430162485Sjulian
431162485Sjulian	dd if=/dev/zero of=${VNODEFILE} count=${SECTUNIT}
432162485Sjulian
433162485Sjulian	MD=`mdconfig -a -t vnode -f ${VNODEFILE} -x ${SECTRACK} -y ${TRACKCYL}`
434162485Sjulian
435162485Sjulian	diskinfo -v /dev/${MD}
436162485Sjulian
437162485Sjulian	fdisk -I /dev/${MD}
438162485Sjulian	fdisk /dev/${MD}
439162485Sjulian
440162485Sjulian	cp -p /boot/boot0 ${WORKDIR}/boot/boot0
441162485Sjulian	bsdlabel -w -B /dev/${MD}
442162485Sjulian	newfs -O2 -U /dev/${MD}a
443162485Sjulian
444162485Sjulian	mount /dev/${MD}a ${IMGMNT}
445162485Sjulian
446163017Sjulian	if [ ${MFSROOT} = 'yes' ]
447163017Sjulian	then
448163017Sjulian		echo "${TS} Creating MFS root..."
449163017Sjulian		# Update is not done yet
450163017Sjulian		#mkdir -p ${WORKDIR}/usr/local/bin/
451163017Sjulian		#cp -p ${CURRENTDIR}/update/update ${WORKDIR}/usr/local/bin/
452163017Sjulian		rm ${WORKDIR}/etc/fstab
453163017Sjulian		cd ${WORKDIR} && find . -print | sed '/kernel/ d' | cpio -dump ${IMGMNT} || true
454163017Sjulian		umount ${IMGMNT}
455163017Sjulian		dd if=/dev/${MD} of=${CURRENTDIR}/mfsroot.img		
456163017Sjulian		gzip -9 < ${CURRENTDIR}/mfsroot.img > ${CURRENTDIR}/mfsroot.gz
457163017Sjulian		rm ${CURRENTDIR}/mfsroot.img
458163017Sjulian		mount /dev/${MD}a ${IMGMNT}
459163017Sjulian		rm -rf ${IMGMNT}/*
460163017Sjulian		cp -rp ${WORKDIR}/boot ${IMGMNT}
461163017Sjulian		rm ${IMGMNT}/boot/device.hints
462163017Sjulian		( \
463163017Sjulian		echo 'set vfs.root.mountfrom="ufs:/dev/md0a"' ; \
464163017Sjulian		echo 'set bootfile="/boot/kernel/kernel"' ; \
465163017Sjulian		sed -e  '/^#/ d' -e 's/^/set /' < ${WORKDIR}/boot/device.hints ; \
466163017Sjulian		echo 'load /boot/kernel/kernel' ; \
467163017Sjulian		echo 'echo Loading mfsroot' ; \
468163017Sjulian		echo 'load -t mfs_root /mfsroot' ;\
469163017Sjulian		echo 'boot' ; \
470163017Sjulian		) > ${IMGMNT}/boot/loader.rc
471163017Sjulian		mv ${CURRENTDIR}/mfsroot.gz ${IMGMNT}
472163017Sjulian	else
473163017Sjulian		( cd ${WORKDIR} && find . -print | cpio -dump ${IMGMNT} ) || true
474163017Sjulian	fi
475162485Sjulian
476162485Sjulian	df ${IMGMNT}
477163017Sjulian	sleep 1
478162485Sjulian	umount ${IMGMNT}
479162485Sjulian
480162485Sjulian	dd if=/dev/${MD} of=${CURRENTDIR}/${IMG} bs=64k
481162485Sjulian
482162485Sjulian	rm -vf ${VNODEFILE}
483162485Sjulian	rm -rvf ${IMGMNT}
484162485Sjulian	mdconfig -d -u ${MD}
485163017Sjulian	echo ""
486163017Sjulian	echo "${TS} Done!"
487163017Sjulian	echo "${TS} Your configuration options were saved in ${FULLFILENAME}"
488163017Sjulian	echo "${TS} You can see your build log in ${HOME}/tinybsd.log"
489163017Sjulian	echo "${TS} Your final image is in ${CURRENTDIR}/${IMG}"
490163017Sjulian	echo "${TS} Now use dd(1) to write it."
491163017Sjulian
492162485Sjulian}
493162485Sjulian
494162485Sjulian##########################
495162485Sjulian# run things
496163017Sjulian
497163017Sjulian##########################################
498163017Sjulian## The actual program
499163017Sjulian##########################################
500163017Sjuliangetargs $*
501163017Sjuliansetdefaults
502163017Sjulian# Load as many of the configuration options as we can
503163017Sjulianloadconfig
504163017Sjuliansaveconfig
505163017Sjulian
506163806Sjulian# Rotate build log
507163806Sjulianrotate_buidlog
508163806Sjulian
509163017Sjulian# Now start logging.
510163017Sjulian(
511163017Sjulian  # Do the build
512163017Sjulian  prework
513163017Sjulian  check_alt_imgname
514163017Sjulian  create_tree
515163017Sjulian  copy_binaries
516163854Sjulian  install_ports
517163017Sjulian  make_kernel
518163017Sjulian  copy_libraries
519163017Sjulian  symlinks
520163854Sjulian  deinstall_ports
521163017Sjulian  create_etc
522163017Sjulian  create_ssh_keys
523163806Sjulian  personal_conf
524163017Sjulian  create_image
525162485Sjulian#set +xv
526163017Sjulian) 2>&1 |tee -a  ${HOME}/tinybsd.log
527162485Sjulian
528