tinybsd revision 177453
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 177453 2008-03-20 12:56:49Z remko $
7162485Sjulian#set -xv
8162485SjulianCURRENTDIR=/usr/src/tools/tools/tinybsd
9163253Sjulianif [ ! -d $CURRENTDIR ]
10163253Sjulianthen
11163253Sjulian  CURRENTDIR=`pwd`
12163254Sjulianelse
13163254Sjulian  cd $CURRENTDIR
14163253Sjulianfi
15176934Sremko
16162485SjulianWORKDIR=/usr/obj/tinybsdbuild
17162485SjulianKERNCONF=TINYBSD
18163806SjulianBASEFILE="tinybsd.basefiles"
19163854SjulianPORTSFILE="tinybsd.ports"
20163854SjulianPORTSDIR=/usr/ports
21162485SjulianDEFINSTARGS="-o 0 -g 0 -m 555"
22162485SjulianTS="=====>"
23162485Sjulian
24163017Sjuliansplitarg1 () {
25163017Sjulian   local IFS
26163017Sjulian   IFS='='
27163017Sjulian   set $1
28163017Sjulian   echo $1
29163017Sjulian}
30162485Sjulian
31163017Sjuliansplitarg2 () {
32163017Sjulian   local IFS
33163017Sjulian   IFS='='
34163017Sjulian   set $1
35163017Sjulian   echo $2
36163017Sjulian}
37162485Sjulian
38163017Sjuliangetargs () {
39163017Sjulian ARGS="$*"
40163017Sjulian for arg in $* 
41163017Sjulian do
42163017Sjulian   ARG=`splitarg1 $arg`
43163017Sjulian   VAL=`splitarg2 $arg`
44163017Sjulian   case $ARG in
45163017Sjulian     sectors)
46163017Sjulian        SECTUNIT=$VAL
47163017Sjulian        ;;
48163017Sjulian     heads)
49163017Sjulian        TRACKCYL=$VAL 
50163017Sjulian        ;;
51163017Sjulian     spt)
52163017Sjulian        SECTRACK=$VAL
53163017Sjulian        ;;
54163017Sjulian     conf)
55163017Sjulian        CONF=$VAL
56163017Sjulian        ;;
57163017Sjulian     mfsroot)
58163017Sjulian        MFSROOT=$VAL
59163017Sjulian        ;;
60163017Sjulian     image)
61163017Sjulian        IMG=$VAL
62163017Sjulian        ;;
63163017Sjulian     batch)
64163017Sjulian        NO_PROMPTS="YES"
65163017Sjulian        ;;
66163017Sjulian     new)
67163017Sjulian        NO_READ="YES"
68163017Sjulian        ;;
69163017Sjulian     *)
70163017Sjulian         usage
71163017Sjulian         ;;
72163017Sjulian    esac
73163017Sjulian done
74163017Sjulian}
75162485Sjulian
76163017Sjulianusage () {
77163017Sjulian    echo "Woops
78163017Sjulian    Usage: $0 sectors=<size of media> [80000]
79163017Sjulian              heads=<heads according to firmware>  [4]
80163017Sjulian              spt=<sectors per track according to firmware> [32]
81163017Sjulian              conf=<configuration name> (see conf/name) [default]
82163017Sjulian              mfsroot[=<yes|no>] [no]
83163017Sjulian              image=<tinybsd image name> [tinybsd.bin]
84163017Sjulian              batch[=<anything>]  (do not ask interactively)
85163017Sjulian              new[=<anything>]  (do not read previous values)
86162485Sjulian
87163017Sjulian     Examples:
88163017Sjulian    $0 sectors=65536 heads=8 spt=16 conf=wireless mfsroot=yes image=myimage.img batch
89162485Sjulian
90163017Sjulian     Default values are set in the program.
91163017Sjulian     Environment values override defaults.
92163017Sjulian     Previous values override environment values but can be disabled.
93163017Sjulian     Command arguments override previous values.
94163017Sjulian     Interactive values override command arguments but can be disabled. 
95163017Sjulian
96163017Sjulian     Run diskinfo(8) -v against your CF device to get correct information
97163017Sjulian     about your disk. USB keys do not need any specific geometry"
98163017Sjulian    exit 1
99163017Sjulian}
100163017Sjulian
101163017Sjulian########
102163017Sjulian# Load variables from stdin (could be a file)
103163017Sjulian# Look for lines that match foo=bar
104163017Sjulian# do not run the file.. that is asking for trouble
105163017Sjulian########
106163017Sjulianloadvars () {
107163017Sjulian  while :
108163017Sjulian  do
109163017Sjulian    OIFS=$IFS
110163017Sjulian    IFS="="
111163017Sjulian    if read PART1 PART2
112163017Sjulian    then
113163017Sjulian      IFS="$OIFS"
114163017Sjulian      case "$PART1" in
115163017Sjulian      \#*)
116163017Sjulian        ;;
117163017Sjulian      "")
118163017Sjulian        ;;
119163017Sjulian      *)
120163017Sjulian        set "${PART1}"
121163017Sjulian        if [ $# = "1" ]
122163017Sjulian        then
123163017Sjulian          eval "${PART1}='${PART2}'"
124163017Sjulian        fi
125163017Sjulian        ;;
126163017Sjulian      esac
127163017Sjulian    else
128163017Sjulian      IFS="$OIFS"
129163017Sjulian      return 0
130163017Sjulian    fi
131163017Sjulian  done
132163017Sjulian}
133163017Sjulian
134163017Sjulian########
135163017Sjulian# get values from the user
136163017Sjulian########
137163017Sjulianconfirm_action(){
138163017Sjulian    local ANSWER
139163017Sjulian    local MESSAGE
140163017Sjulian    ANSWER=$1
141163017Sjulian    MESSAGE=$2
142163017Sjulian    if [ "$NO_PROMPTS" != "YES" ]
143163017Sjulian    then
144163253Sjulian        echo -n "$MESSAGE [$ANSWER] " > /dev/tty
145163017Sjulian        read result
146163017Sjulian        [ "$result" != "" ] && ANSWER=$result
147163017Sjulian    fi
148163017Sjulian
149163017Sjulian    ANSWER=`eval "echo $ANSWER"`
150163017Sjulian    echo $ANSWER
151163017Sjulian}
152163017Sjulian
153163017Sjulian########
154163017Sjulian# These are only used the VERY first time you run the program (on this machine)
155163017Sjulian########
156163017Sjuliansetdefaults () {
157163017Sjulian  NO_PROMPTS=${NO_PROMPTS:-NO}
158163017Sjulian  NO_READ=${NO_READ:-NO}
159163017Sjulian  SECTUNIT=${SECTUNIT:-80000}; export SECTUNIT
160163017Sjulian  TRACKCYL=${TRACKCYL:-4}; export TRACKCYL
161163017Sjulian  SECTRACK=${SECTRACK:-32}; export SECTRACK
162163017Sjulian  CONF=${CONF:-default}; export CONF
163163017Sjulian  MFSROOT=${MFSROOT:-NO}; export MFSROOT
164163017Sjulian  IMG=${IMG:-tinybsd.bin}; export IMG
165163017Sjulian
166163017Sjulian}
167163017Sjulian
168163017Sjulian#######
169163017Sjulian# get ourselves set up.
170163017Sjulian# Partly by reading config files and partly from asking questions.
171163017Sjulian#######
172163017Sjulianloadconfig () {
173163017Sjulian  if [ "${NO_READ}" = "YES" ]
174163017Sjulian  then
175163017Sjulian    return
176163017Sjulian  fi
177163017Sjulian
178163017Sjulian  HOSTNAME=`hostname`
179163017Sjulian  HOSTPART=${HOSTNAME%%.*}
180163017Sjulian  FILENAME=".tinybsd.${HOSTPART}.${USER}"
181163017Sjulian  FULLFILENAME=$HOME/$FILENAME
182163017Sjulian
183163017Sjulian  if [ -f ${FULLFILENAME} ]
184163017Sjulian  then
185163017Sjulian    loadvars <${FULLFILENAME}
186163017Sjulian  fi
187163017Sjulian
188163017Sjulian  SECTUNIT=`confirm_action "$SECTUNIT" "512 byte sectors per unit?"`
189163017Sjulian  TRACKCYL=`confirm_action "$TRACKCYL" "Tracks per cylinder?"`
190163017Sjulian  SECTRACK=`confirm_action "$SECTRACK" "Sectors per track?"`
191163253Sjulian  while :
192163253Sjulian  do
193163253Sjulian    echo "The following configurations exist:"
194163253Sjulian    ls -l conf|awk '/^d/{print "    ",$9}'|grep -v CVS
195163253Sjulian    CONF=`confirm_action "$CONF" "Configuration name?"`
196163253Sjulian    if [ ! -d "${CURRENTDIR}/conf/$CONF" ]
197163253Sjulian    then
198163253Sjulian      echo "${TS} Error: Could not find config (${CONF})"
199163253Sjulian      if [ "$NO_PROMPTS" = "YES" ]
200163253Sjulian      then
201163253Sjulian        exit 1
202163253Sjulian      fi
203163253Sjulian    else
204163253Sjulian      break
205163253Sjulian    fi
206163253Sjulian  done
207163253Sjulian  MFSROOT=`confirm_action "$MFSROOT" "Use an MFSROOT? (YES/NO)"`
208163017Sjulian  IMG=`confirm_action "$IMG" "Image file to generate?"`
209163017Sjulian
210163017Sjulian# example of formatted value (NNN in this case)
211163017Sjulian#  #condition and format the number
212163017Sjulian#  if [ -z "${BUILDNUM}" ]
213163017Sjulian#  then
214163017Sjulian#    echo "Starting with build 001"
215163017Sjulian#    BUILDNUM="001"
216163017Sjulian#  else
217163017Sjulian#    BUILDNUM=`printf "%03d\n" $(($BUILDNUM))`
218163017Sjulian#  fi
219163017Sjulian
220163017Sjulian
221163017Sjulian}
222163017Sjulian
223163017Sjuliansaveconfig () {
224163017Sjulian  HOSTNAME=`hostname`
225163017Sjulian  HOSTPART=${HOSTNAME%%.*}
226163017Sjulian  FILENAME=".tinybsd.${HOSTPART}.${USER}"
227163017Sjulian  FULLFILENAME=$HOME/$FILENAME
228163017Sjulian  (
229163017Sjulian    echo "# written by tinybsd" `date` 
230163017Sjulian    echo "SECTUNIT=${SECTUNIT}"
231163017Sjulian    echo "TRACKCYL=${TRACKCYL}"
232163017Sjulian    echo "SECTRACK=${SECTRACK}"
233163017Sjulian    echo "CONF=${CONF}"
234163017Sjulian    echo "MFSROOT=${MFSROOT:-NO}"
235163017Sjulian    echo "IMG=${IMG}"
236163017Sjulian  ) >${FULLFILENAME}
237163017Sjulian}
238163017Sjulian
239162485Sjuliancheck_alt_imgname() {
240163017Sjulian	if [ ${IMG} = 'tinybsd.bin' ]
241162485Sjulian	then
242162485Sjulian		echo "${TS} Alternative image name not set; defaulting to 'tinybsd.bin'"
243162485Sjulian	fi
244162485Sjulian}
245162485Sjulian
246163806Sjulianrotate_buidlog() {
247163806Sjulian	mv -f ${HOME}/tinybsd.log ${HOME}/tinybsd.log.old
248163806Sjulian}
249163806Sjulian
250162485Sjulianremove_workdir() {
251177453Sremko	# Before removing check if there is not a mount under $WORKDIR anymore
252177453Sremko	MOUNT_CHECK=`mount|egrep "on ${WORKDIR}"`
253177453Sremko
254177453Sremko	if [ ! -z "${MOUNT_CHECK}" ]; then
255177453Sremko		echo "There are mounts under the workdir (${WORKDIR}). Please umount them before running this script"
256177453Sremko		exit 1
257177453Sremko	else
258177453Sremko		chflags -R noschg ${WORKDIR}
259177453Sremko		echo "${TS} Removing "${WORKDIR}
260177453Sremko		rm -rf ${WORKDIR}
261177453Sremko		echo "${TS} Removing Build Kernel Directory"
262177453Sremko		rm -rf /usr/obj/usr/src/sys/${KERNCONF}
263177453Sremko		echo "${TS}  done."
264177453Sremko	fi
265162485Sjulian}
266162485Sjulian
267162485Sjulian
268162485Sjulianprework() {
269163806Sjulian	remove_workdir
270162485Sjulian	mkdir -p ${WORKDIR}
271162485Sjulian}
272162485Sjulian
273162485Sjulian
274162485Sjuliancreate_tree() {
275162485Sjulian	echo "${TS} Creating directory hierarchy... "
276162485Sjulian	mtree -deU -f /etc/mtree/BSD.root.dist -p ${WORKDIR}
277171923Sremko	mtree -deU -f /etc/mtree/BIND.chroot.dist -p ${WORKDIR}
278162485Sjulian	mtree -deU -f /etc/mtree/BSD.usr.dist -p ${WORKDIR}/usr
279163806Sjulian	mtree -deU -f /etc/mtree/BSD.local.dist -p ${WORKDIR}/usr/local
280162485Sjulian	mtree -deU -f /etc/mtree/BSD.var.dist -p ${WORKDIR}/var
281162485Sjulian}
282162485Sjulian
283163806Sjuliancopy_binaries() {
284163806Sjulian	cd ${CURRENTDIR}/conf/${CONF}
285162485Sjulian
286176934Sremko	for file in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE} | grep -v "#" | \
287162485Sjulian		cut -f1 -d":" | sort | uniq` ; do
288162485Sjulian		echo "${TS} Copying "/${file}" to "${WORKDIR}/${file} 
289162485Sjulian		cp -fp /${file} ${WORKDIR}/${file} ;
290162485Sjulian	done
291162485Sjulian}
292162485Sjulian
293163854Sjulianinstall_ports() {
294176934Sremko	for portname in `cat ${CURRENTDIR}/conf/${CONF}/${PORTSFILE} | grep -v '#'` ; do
295176934Sremko		if [ ! -d "${WORKDIR}/usr/ports" ]; then
296176934Sremko			mkdir -p "${WORKDIR}/usr/ports"
297176934Sremko		fi
298163854Sjulian
299176934Sremko		PNAME=`/usr/bin/basename "${portname}"`
300176934Sremko		PORT_OPTION_FILE="/var/db/ports/${PNAME}/options"
301176934Sremko
302176934Sremko		if [ -f "${PORT_OPTION_FILE}" ]; then
303176934Sremko			mkdir -p "${WORKDIR}/var/db/ports/${PNAME}"
304176934Sremko			cp "${PORT_OPTION_FILE}" "${WORKDIR}/var/db/ports/${PNAME}/"
305176934Sremko		fi
306176934Sremko
307176934Sremko		mount_nullfs /lib "${WORKDIR}/lib"
308176934Sremko		mount_nullfs /usr/bin "${WORKDIR}/usr/bin"
309176934Sremko		mount_nullfs /usr/sbin "${WORKDIR}/usr/sbin"
310176934Sremko		mount_nullfs /usr/ports "${WORKDIR}/usr/ports"
311176934Sremko		mount_nullfs /usr/share "${WORKDIR}/usr/share"
312176934Sremko		mount_nullfs /usr/libexec "${WORKDIR}/usr/libexec"
313176934Sremko		mount_nullfs /usr/lib "${WORKDIR}/usr/lib"
314176934Sremko		mount_nullfs /usr/include "${WORKDIR}/usr/include"
315176934Sremko
316176934Sremko		cd ${PORTSDIR}/${portname}
317176934Sremko		make fetch-recursive
318176934Sremko		make DESTDIR_ENV_LIST=PATH DESTDIR="${WORKDIR}" install
319176934Sremko		make clean
320176934Sremko
321176934Sremko		umount "${WORKDIR}/lib"
322176934Sremko		umount "${WORKDIR}/usr/ports"
323176934Sremko		umount "${WORKDIR}/usr/bin"
324176934Sremko		umount "${WORKDIR}/usr/sbin"
325176934Sremko		umount "${WORKDIR}/usr/share"
326176934Sremko		umount "${WORKDIR}/usr/libexec"
327176934Sremko		umount "${WORKDIR}/usr/lib"
328176934Sremko		umount "${WORKDIR}/usr/include"
329163854Sjulian	done
330163854Sjulian}
331163854Sjulian
332162485Sjulianmake_kernel() {
333162485Sjulian	echo "${TS} Building customized tiny beastie kernel... "
334162485Sjulian	cp -p ${CURRENTDIR}/conf/${CONF}/${KERNCONF} /usr/src/sys/i386/conf
335162485Sjulian	cd /usr/src
336162485Sjulian	make buildkernel KERNCONF=${KERNCONF} || exit 1
337162485Sjulian	gzip -9 /usr/obj/usr/src/sys/${KERNCONF}/kernel
338162485Sjulian	install ${DEFINSTARGS} /usr/obj/usr/src/sys/${KERNCONF}/kernel.gz ${WORKDIR}/boot/kernel/
339162485Sjulian	install ${DEFINSTARGS} \
340162485Sjulian	  /usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/acpi/acpi/acpi.ko \
341162485Sjulian	    ${WORKDIR}/boot/kernel
342162485Sjulian	install -o 0 -g 0 -m 444 /sys/i386/conf/GENERIC.hints ${WORKDIR}/boot/device.hints
343162485Sjulian}
344162485Sjulian
345162485Sjuliancopy_libraries() {
346162485Sjulian	TDEPFILE="`mktemp -t deps`"
347162485Sjulian	TDEPFILES="`mktemp -t depsymlnk`"
348162485Sjulian
349176934Sremko	find "${WORKDIR}" -type f |while read file; do
350176934Sremko		ldd -f "%p\n" ${file} >> ${TDEPFILE} ; # don't worry on progs been "not dynamic"
351162485Sjulian	done
352162485Sjulian
353162485Sjulian	for libdeplib in `cat ${TDEPFILE} | sort | uniq`; do
354162485Sjulian		ldd -f "%p\n" /${libdeplib} >> ${TDEPFILE} ;
355162485Sjulian	done
356163854Sjulian
357162485Sjulian	for pamdep in `ls -1 /usr/lib/pam*`; do
358162485Sjulian		echo $pamdep >> ${TDEPFILE} ;
359162485Sjulian		ldd -f "%p\n" /${pamdep} >> ${TDEPFILE} ;
360162485Sjulian	done	
361163806Sjulian
362162485Sjulian	for lib in `cat ${TDEPFILE} | sort | uniq`; do
363162485Sjulian		echo "${TS} Copying "${lib}" to "${WORKDIR}${lib}
364162485Sjulian		cp -fp ${lib} ${WORKDIR}${lib} ;
365162485Sjulian	done
366162485Sjulian
367162485Sjulian	for depsymlink in `cat ${TDEPFILE}`; do
368162485Sjulian		echo "${TS} Checking if ${depsymlink} is a symbolic link"
369162485Sjulian		/bin/ls -l $depsymlink | grep "\->" | awk '{print $11":"$9}' >> ${TDEPFILES}
370162485Sjulian	done
371162485Sjulian
372162485Sjulian	for i in `cat ${TDEPFILES}`; do
373162485Sjulian                SOURCE_FILE=`echo $i | awk -F ":" '{print $1}'`
374162485Sjulian                TARGET_FILE=`echo $i | awk -F ":" '{print $2}'`
375162485Sjulian
376162485Sjulian		echo "${TS} Unlinking ${WORKDIR}${TARGET_FILE}"
377163806Sjulian		chroot ${WORKDIR} /bin/chflags 0 ${TARGET_FILE}
378162485Sjulian                chroot ${WORKDIR} /bin/rm -f ${TARGET_FILE}
379162485Sjulian
380162485Sjulian		echo "${TS} Symlinking ${SOURCE_FILE} to ${TARGET_FILE}"
381162485Sjulian                chroot ${WORKDIR} /bin/ln -s ${SOURCE_FILE} ${TARGET_FILE}
382162485Sjulian        done
383162485Sjulian
384162485Sjulian	echo -n "${TS} Unlinking "
385162485Sjulian	rm -fv ${TDEPFILE} ${TDEPFILES}
386162485Sjulian}
387162485Sjulian
388162485Sjuliancreate_etc() {
389162485Sjulian	cd /usr/src/etc/sendmail/
390162485Sjulian	make freebsd.cf freebsd.submit.cf
391162485Sjulian
392162485Sjulian	cd /usr/src/etc/
393162485Sjulian	mkdir -p ${WORKDIR}/var/named/etc/namedb
394162485Sjulian	make distribution DESTDIR=${WORKDIR}
395162485Sjulian}
396162485Sjulian
397163017Sjuliancreate_ssh_keys() {
398163017Sjulian	echo "Creating ssh keys..."
399163017Sjulian	ssh-keygen -t rsa1 -b 1024  -f ${WORKDIR}/etc/ssh/ssh_host_key -N ''
400163017Sjulian	ssh-keygen -t dsa -f ${WORKDIR}/etc/ssh/ssh_host_dsa_key -N ''
401163017Sjulian	ssh-keygen -t rsa -f ${WORKDIR}/etc/ssh/ssh_host_rsa_key -N ''
402163017Sjulian}
403163017Sjulian
404163806Sjulianpersonal_conf() {
405162485Sjulian	echo "${TS} Copying your custom configuration on conf/ ..."
406163806Sjulian	for custom in `find ${CURRENTDIR}/conf/${CONF}/ -type d -depth 1 \! -name CVS`; do
407162485Sjulian		cp -Rp ${custom}/* ${WORKDIR}/${custom#${CURRENTDIR}/conf/${CONF}/}/
408162485Sjulian	done
409163806Sjulian
410163806Sjulian	if [ -f ${CURRENTDIR}/conf/${CONF}/boot.config ]; then
411163806Sjulian		cp ${CURRENTDIR}/conf/${CONF}/boot.config ${WORKDIR}/boot.config
412163806Sjulian	fi
413162485Sjulian}
414162485Sjulian
415162485Sjuliansymlinks() {
416163854Sjulian#set -xv
417176934Sremko	for i in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE}| grep -v "#" | grep ":"`; do
418162485Sjulian		SOURCE_FILE=`echo $i | awk -F ":" {'print $1'}`
419162485Sjulian		TARGET_FILE=`echo $i | awk -F ":" {'print $2'}`
420162485Sjulian		chroot ${WORKDIR} /bin/ln -vs /${SOURCE_FILE} ${TARGET_FILE}
421162485Sjulian	done
422163854Sjulian#set +xv
423162485Sjulian}
424162485Sjulian
425162485Sjulian
426162485Sjuliancreate_image() {
427162485Sjulian	VNODEFILE=`mktemp -t tinybsd`
428162485Sjulian	IMGMNT=`mktemp -d -t tinybsd`
429162485Sjulian
430162485Sjulian	dd if=/dev/zero of=${VNODEFILE} count=${SECTUNIT}
431162485Sjulian
432162485Sjulian	MD=`mdconfig -a -t vnode -f ${VNODEFILE} -x ${SECTRACK} -y ${TRACKCYL}`
433162485Sjulian
434162485Sjulian	diskinfo -v /dev/${MD}
435162485Sjulian
436162485Sjulian	fdisk -I /dev/${MD}
437162485Sjulian	fdisk /dev/${MD}
438162485Sjulian
439162485Sjulian	cp -p /boot/boot0 ${WORKDIR}/boot/boot0
440162485Sjulian	bsdlabel -w -B /dev/${MD}
441162485Sjulian	newfs -O2 -U /dev/${MD}a
442162485Sjulian
443162485Sjulian	mount /dev/${MD}a ${IMGMNT}
444162485Sjulian
445163017Sjulian	if [ ${MFSROOT} = 'yes' ]
446163017Sjulian	then
447163017Sjulian		echo "${TS} Creating MFS root..."
448163017Sjulian		# Update is not done yet
449163017Sjulian		#mkdir -p ${WORKDIR}/usr/local/bin/
450163017Sjulian		#cp -p ${CURRENTDIR}/update/update ${WORKDIR}/usr/local/bin/
451163017Sjulian		rm ${WORKDIR}/etc/fstab
452163017Sjulian		cd ${WORKDIR} && find . -print | sed '/kernel/ d' | cpio -dump ${IMGMNT} || true
453163017Sjulian		umount ${IMGMNT}
454163017Sjulian		dd if=/dev/${MD} of=${CURRENTDIR}/mfsroot.img		
455163017Sjulian		gzip -9 < ${CURRENTDIR}/mfsroot.img > ${CURRENTDIR}/mfsroot.gz
456163017Sjulian		rm ${CURRENTDIR}/mfsroot.img
457163017Sjulian		mount /dev/${MD}a ${IMGMNT}
458163017Sjulian		rm -rf ${IMGMNT}/*
459163017Sjulian		cp -rp ${WORKDIR}/boot ${IMGMNT}
460163017Sjulian		rm ${IMGMNT}/boot/device.hints
461163017Sjulian		( \
462163017Sjulian		echo 'set vfs.root.mountfrom="ufs:/dev/md0a"' ; \
463163017Sjulian		echo 'set bootfile="/boot/kernel/kernel"' ; \
464163017Sjulian		sed -e  '/^#/ d' -e 's/^/set /' < ${WORKDIR}/boot/device.hints ; \
465163017Sjulian		echo 'load /boot/kernel/kernel' ; \
466163017Sjulian		echo 'echo Loading mfsroot' ; \
467163017Sjulian		echo 'load -t mfs_root /mfsroot' ;\
468163017Sjulian		echo 'boot' ; \
469163017Sjulian		) > ${IMGMNT}/boot/loader.rc
470163017Sjulian		mv ${CURRENTDIR}/mfsroot.gz ${IMGMNT}
471163017Sjulian	else
472163017Sjulian		( cd ${WORKDIR} && find . -print | cpio -dump ${IMGMNT} ) || true
473163017Sjulian	fi
474162485Sjulian
475162485Sjulian	df ${IMGMNT}
476163017Sjulian	sleep 1
477162485Sjulian	umount ${IMGMNT}
478162485Sjulian
479162485Sjulian	dd if=/dev/${MD} of=${CURRENTDIR}/${IMG} bs=64k
480162485Sjulian
481162485Sjulian	rm -vf ${VNODEFILE}
482162485Sjulian	rm -rvf ${IMGMNT}
483162485Sjulian	mdconfig -d -u ${MD}
484163017Sjulian	echo ""
485163017Sjulian	echo "${TS} Done!"
486163017Sjulian	echo "${TS} Your configuration options were saved in ${FULLFILENAME}"
487163017Sjulian	echo "${TS} You can see your build log in ${HOME}/tinybsd.log"
488163017Sjulian	echo "${TS} Your final image is in ${CURRENTDIR}/${IMG}"
489163017Sjulian	echo "${TS} Now use dd(1) to write it."
490162485Sjulian}
491162485Sjulian
492162485Sjulian##########################
493162485Sjulian# run things
494163017Sjulian
495163017Sjulian##########################################
496163017Sjulian## The actual program
497163017Sjulian##########################################
498163017Sjuliangetargs $*
499163017Sjuliansetdefaults
500163017Sjulian# Load as many of the configuration options as we can
501163017Sjulianloadconfig
502163017Sjuliansaveconfig
503163017Sjulian
504163806Sjulian# Rotate build log
505163806Sjulianrotate_buidlog
506163806Sjulian
507163017Sjulian# Now start logging.
508163017Sjulian(
509163017Sjulian  # Do the build
510163017Sjulian  prework
511163017Sjulian  check_alt_imgname
512163017Sjulian  create_tree
513163017Sjulian  copy_binaries
514176934Sremko  create_etc
515163854Sjulian  install_ports
516163017Sjulian  make_kernel
517163017Sjulian  copy_libraries
518163017Sjulian  symlinks
519163017Sjulian  create_ssh_keys
520163806Sjulian  personal_conf
521163017Sjulian  create_image
522162485Sjulian#set +xv
523163017Sjulian) 2>&1 |tee -a  ${HOME}/tinybsd.log
524162485Sjulian
525