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