nanobsd.sh revision 181460
1148422Sphk#!/bin/sh 2150366Sphk# 3148422Sphk# Copyright (c) 2005 Poul-Henning Kamp. 4150366Sphk# All rights reserved. 5148422Sphk# 6150366Sphk# Redistribution and use in source and binary forms, with or without 7150366Sphk# modification, are permitted provided that the following conditions 8150366Sphk# are met: 9150366Sphk# 1. Redistributions of source code must retain the above copyright 10150366Sphk# notice, this list of conditions and the following disclaimer. 11150366Sphk# 2. Redistributions in binary form must reproduce the above copyright 12150366Sphk# notice, this list of conditions and the following disclaimer in the 13150366Sphk# documentation and/or other materials provided with the distribution. 14148422Sphk# 15150366Sphk# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16150366Sphk# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17150366Sphk# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18150366Sphk# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19150366Sphk# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20150366Sphk# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21150366Sphk# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22150366Sphk# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23150366Sphk# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24150366Sphk# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25150366Sphk# SUCH DAMAGE. 26150366Sphk# 27148422Sphk# $FreeBSD: head/tools/tools/nanobsd/nanobsd.sh 181460 2008-08-09 09:27:54Z phk $ 28148422Sphk# 29148422Sphk 30148422Sphkset -e 31148422Sphk 32150366Sphk####################################################################### 33150366Sphk# 34150366Sphk# Setup default values for all controlling variables. 35150366Sphk# These values can be overridden from the config file(s) 36150366Sphk# 37150366Sphk####################################################################### 38150366Sphk 39148422Sphk# Name of this NanoBSD build. (Used to construct workdir names) 40148422SphkNANO_NAME=full 41148422Sphk 42148422Sphk# Source tree directory 43148422SphkNANO_SRC=/usr/src 44148422Sphk 45150366Sphk# Where nanobsd additional files live under the source tree 46150366SphkNANO_TOOLS=tools/tools/nanobsd 47150366Sphk 48170607Sphk# Where cust_pkg() finds packages to install 49170607SphkNANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg 50170607Sphk 51148422Sphk# Object tree directory 52148422Sphk# default is subdir of /usr/obj 53148422Sphk# XXX: MAKEOBJDIRPREFIX handling... ? 54148648Sphk#NANO_OBJ="" 55148422Sphk 56175258Ssimon# The directory to put the final images 57175258Ssimon# default is ${NANO_OBJ} 58175258Ssimon#NANO_DISKIMGDIR="" 59175258Ssimon 60148422Sphk# Parallel Make 61148422SphkNANO_PMAKE="make -j 3" 62148422Sphk 63148422Sphk# Options to put in make.conf during buildworld only 64148422SphkCONF_BUILD=' ' 65148422Sphk 66148422Sphk# Options to put in make.conf during installworld only 67148422SphkCONF_INSTALL=' ' 68148422Sphk 69148422Sphk# Options to put in make.conf during both build- & installworld. 70148422SphkCONF_WORLD=' ' 71148422Sphk 72148422Sphk# Kernel config file to use 73148422SphkNANO_KERNEL=GENERIC 74148422Sphk 75149073Sphk# Customize commands. 76149073SphkNANO_CUSTOMIZE="" 77149073Sphk 78148648Sphk# Newfs paramters to use 79148648SphkNANO_NEWFS="-b 4096 -f 512 -i 8192 -O1 -U" 80148648Sphk 81149082Sphk# The drive name of the media at runtime 82149082SphkNANO_DRIVE=ad0 83149082Sphk 84148648Sphk# Target media size in 512 bytes sectors 85170607SphkNANO_MEDIASIZE=1000000 86148648Sphk 87148648Sphk# Number of code images on media (1 or 2) 88148422SphkNANO_IMAGES=2 89148648Sphk 90171986Sphk# 0 -> Leave second image all zeroes so it compresses better. 91171986Sphk# 1 -> Initialize second image with a copy of the first 92171986SphkNANO_INIT_IMG2=1 93171986Sphk 94149535Ssimon# Size of code file system in 512 bytes sectors 95149120Sphk# If zero, size will be as large as possible. 96149120SphkNANO_CODESIZE=0 97149120Sphk 98149120Sphk# Size of configuration file system in 512 bytes sectors 99149120Sphk# Cannot be zero. 100148422SphkNANO_CONFSIZE=2048 101148648Sphk 102148648Sphk# Size of data file system in 512 bytes sectors 103149120Sphk# If zero: no partition configured. 104149120Sphk# If negative: max size possible 105149120SphkNANO_DATASIZE=0 106148422Sphk 107154466Sphk# Size of the /etc ramdisk in 512 bytes sectors 108154466SphkNANO_RAM_ETCSIZE=10240 109154466Sphk 110154466Sphk# Size of the /tmp+/var ramdisk in 512 bytes sectors 111154466SphkNANO_RAM_TMPVARSIZE=10240 112154466Sphk 113148422Sphk# Media geometry, only relevant if bios doesn't understand LBA. 114170607SphkNANO_SECTS=63 115148422SphkNANO_HEADS=16 116148422Sphk 117168894Sadrian# boot0 flags/options and configuration 118168894SadrianNANO_BOOT0CFG="-o packet -s 1 -m 3" 119168894SadrianNANO_BOOTLOADER="boot/boot0sio" 120168894Sadrian 121175258Ssimon# Backing type of md(4) device 122175258Ssimon# Can be "file" or "swap" 123175258SsimonNANO_MD_BACKING="file" 124175258Ssimon 125148422Sphk####################################################################### 126148648Sphk# Not a variable at this time 127148648Sphk 128148648SphkNANO_ARCH=i386 129148648Sphk 130148648Sphk####################################################################### 131150366Sphk# 132150366Sphk# The functions which do the real work. 133150366Sphk# Can be overridden from the config file(s) 134150366Sphk# 135150366Sphk####################################################################### 136148422Sphk 137149120Sphkclean_build ( ) ( 138148422Sphk echo "## Clean and create object directory (${MAKEOBJDIRPREFIX})" 139148422Sphk 140148422Sphk if rm -rf ${MAKEOBJDIRPREFIX} > /dev/null 2>&1 ; then 141148422Sphk true 142148422Sphk else 143148422Sphk chflags -R noschg ${MAKEOBJDIRPREFIX} 144148422Sphk rm -rf ${MAKEOBJDIRPREFIX} 145148422Sphk fi 146148422Sphk mkdir -p ${MAKEOBJDIRPREFIX} 147150343Sphk printenv > ${MAKEOBJDIRPREFIX}/_.env 148148422Sphk) 149148422Sphk 150148422Sphkmake_conf_build ( ) ( 151148422Sphk echo "## Construct build make.conf ($NANO_MAKE_CONF)" 152148422Sphk 153148648Sphk echo "${CONF_WORLD}" > ${NANO_MAKE_CONF} 154148648Sphk echo "${CONF_BUILD}" >> ${NANO_MAKE_CONF} 155148422Sphk) 156148422Sphk 157148422Sphkbuild_world ( ) ( 158148422Sphk echo "## run buildworld" 159148422Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.bw" 160148422Sphk 161148422Sphk cd ${NANO_SRC} 162148422Sphk ${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} buildworld \ 163148422Sphk > ${MAKEOBJDIRPREFIX}/_.bw 2>&1 164148422Sphk) 165148422Sphk 166148422Sphkbuild_kernel ( ) ( 167150321Sphk echo "## build kernel ($NANO_KERNEL)" 168148422Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.bk" 169148422Sphk 170148422Sphk if [ -f ${NANO_KERNEL} ] ; then 171148422Sphk cp ${NANO_KERNEL} ${NANO_SRC}/sys/${NANO_ARCH}/conf 172148422Sphk fi 173148422Sphk 174181083Ssam (cd ${NANO_SRC}; 175181083Ssam # unset these just in case to avoid compiler complaints 176181083Ssam # when cross-building 177181083Ssam unset TARGET_CPUTYPE 178181083Ssam unset TARGET_BIG_ENDIAN 179148422Sphk ${NANO_PMAKE} buildkernel \ 180163922Sn_hibma __MAKE_CONF=${NANO_MAKE_CONF} KERNCONF=`basename ${NANO_KERNEL}` \ 181148422Sphk > ${MAKEOBJDIRPREFIX}/_.bk 2>&1 182181083Ssam ) 183148422Sphk) 184148422Sphk 185148422Sphkclean_world ( ) ( 186148422Sphk echo "## Clean and create world directory (${NANO_WORLDDIR})" 187148422Sphk if rm -rf ${NANO_WORLDDIR}/ > /dev/null 2>&1 ; then 188148422Sphk true 189148422Sphk else 190148422Sphk chflags -R noschg ${NANO_WORLDDIR}/ 191148422Sphk rm -rf ${NANO_WORLDDIR}/ 192148422Sphk fi 193148422Sphk mkdir -p ${NANO_WORLDDIR}/ 194148422Sphk) 195148422Sphk 196148422Sphkmake_conf_install ( ) ( 197148422Sphk echo "## Construct install make.conf ($NANO_MAKE_CONF)" 198148422Sphk 199148648Sphk echo "${CONF_WORLD}" > ${NANO_MAKE_CONF} 200148648Sphk echo "${CONF_INSTALL}" >> ${NANO_MAKE_CONF} 201148422Sphk) 202148422Sphk 203148422Sphkinstall_world ( ) ( 204148422Sphk echo "## installworld" 205148422Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.iw" 206148422Sphk 207148422Sphk cd ${NANO_SRC} 208148422Sphk ${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} installworld \ 209148422Sphk DESTDIR=${NANO_WORLDDIR} \ 210148422Sphk > ${MAKEOBJDIRPREFIX}/_.iw 2>&1 211148422Sphk chflags -R noschg ${NANO_WORLDDIR} 212148422Sphk) 213148422Sphk 214148422Sphkinstall_etc ( ) ( 215148422Sphk 216148422Sphk echo "## install /etc" 217148422Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.etc" 218148422Sphk 219160783Sthomas cd ${NANO_SRC} 220148422Sphk ${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} distribution \ 221148422Sphk DESTDIR=${NANO_WORLDDIR} \ 222148422Sphk > ${MAKEOBJDIRPREFIX}/_.etc 2>&1 223148422Sphk) 224148422Sphk 225148422Sphkinstall_kernel ( ) ( 226148422Sphk echo "## install kernel" 227148422Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.ik" 228148422Sphk 229148422Sphk cd ${NANO_SRC} 230148422Sphk ${NANO_PMAKE} installkernel \ 231148422Sphk DESTDIR=${NANO_WORLDDIR} \ 232164660Sn_hibma __MAKE_CONF=${NANO_MAKE_CONF} KERNCONF=`basename ${NANO_KERNEL}` \ 233148422Sphk > ${MAKEOBJDIRPREFIX}/_.ik 2>&1 234148422Sphk) 235148422Sphk 236150366Sphkrun_customize() ( 237150366Sphk 238150366Sphk echo "## run customize scripts" 239150366Sphk for c in $NANO_CUSTOMIZE 240150366Sphk do 241150366Sphk echo "## customize \"$c\"" 242150366Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.cust.$c" 243150366Sphk echo "### `type $c`" 244150366Sphk ( $c ) > ${MAKEOBJDIRPREFIX}/_.cust.$c 2>&1 245150366Sphk done 246150366Sphk) 247150366Sphk 248150366Sphksetup_nanobsd ( ) ( 249150366Sphk echo "## configure nanobsd setup" 250149103Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.dl" 251148422Sphk 252149103Sphk ( 253148422Sphk cd ${NANO_WORLDDIR} 254148422Sphk 255170607Sphk # Move /usr/local/etc to /etc/local so that the /cfg stuff 256170607Sphk # can stomp on it. Otherwise packages like ipsec-tools which 257170607Sphk # have hardcoded paths under ${prefix}/etc are not tweakable. 258170607Sphk if [ -d usr/local/etc ] ; then 259170607Sphk ( 260170607Sphk mkdir etc/local 261170607Sphk cd usr/local/etc 262170607Sphk find . -print | cpio -dumpl ../../../etc/local 263170607Sphk cd .. 264170607Sphk rm -rf etc 265170607Sphk ln -s ../../etc/local etc 266170607Sphk ) 267170607Sphk fi 268170607Sphk 269149082Sphk for d in var etc 270149082Sphk do 271149082Sphk # link /$d under /conf 272149082Sphk # we use hard links so we have them both places. 273149082Sphk # the files in /$d will be hidden by the mount. 274149082Sphk # XXX: configure /$d ramdisk size 275149082Sphk mkdir -p conf/base/$d conf/default/$d 276149082Sphk find $d -print | cpio -dumpl conf/base/ 277149082Sphk done 278148422Sphk 279154466Sphk echo "$NANO_RAM_ETCSIZE" > conf/base/etc/md_size 280154466Sphk echo "$NANO_RAM_TMPVARSIZE" > conf/base/var/md_size 281154466Sphk 282148422Sphk # pick up config files from the special partition 283149082Sphk echo "mount -o ro /dev/${NANO_DRIVE}s3" > conf/default/etc/remount 284148422Sphk 285149082Sphk # Put /tmp on the /var ramdisk (could be symlink already) 286149082Sphk rmdir tmp || true 287149082Sphk rm tmp || true 288148422Sphk ln -s var/tmp tmp 289149082Sphk 290149103Sphk ) > ${MAKEOBJDIRPREFIX}/_.dl 2>&1 291148422Sphk) 292148422Sphk 293161341Ssimonsetup_nanobsd_etc ( ) ( 294161341Ssimon echo "## configure nanobsd /etc" 295161341Ssimon 296161341Ssimon ( 297161341Ssimon cd ${NANO_WORLDDIR} 298161341Ssimon 299161341Ssimon # create diskless marker file 300161341Ssimon touch etc/diskless 301161341Ssimon 302170324Sphk # Make root filesystem R/O by default 303170324Sphk echo "root_rw_mount=NO" >> etc/defaults/rc.conf 304170324Sphk 305161341Ssimon # save config file for scripts 306161341Ssimon echo "NANO_DRIVE=${NANO_DRIVE}" > etc/nanobsd.conf 307161341Ssimon 308161341Ssimon echo "/dev/${NANO_DRIVE}s1a / ufs ro 1 1" > etc/fstab 309161341Ssimon echo "/dev/${NANO_DRIVE}s3 /cfg ufs rw,noauto 2 2" >> etc/fstab 310161341Ssimon mkdir -p cfg 311161341Ssimon ) 312161341Ssimon) 313161341Ssimon 314149014Sphkprune_usr() ( 315149014Sphk 316149014Sphk # Remove all empty directories in /usr 317149014Sphk find ${NANO_WORLDDIR}/usr -type d -depth -print | 318149014Sphk while read d 319149014Sphk do 320149014Sphk rmdir $d > /dev/null 2>&1 || true 321149014Sphk done 322149014Sphk) 323149014Sphk 324148422Sphkcreate_i386_diskimage ( ) ( 325149103Sphk echo "## build diskimage" 326149103Sphk echo "### log: ${MAKEOBJDIRPREFIX}/_.di" 327148422Sphk 328149103Sphk ( 329149120Sphk echo $NANO_MEDIASIZE $NANO_IMAGES \ 330149120Sphk $NANO_SECTS $NANO_HEADS \ 331149120Sphk $NANO_CODESIZE $NANO_CONFSIZE $NANO_DATASIZE | 332148422Sphk awk ' 333150717Sphk { 334149120Sphk printf "# %s\n", $0 335149120Sphk 336148422Sphk # size of cylinder in sectors 337149120Sphk cs = $3 * $4 338148422Sphk 339148422Sphk # number of full cylinders on media 340148422Sphk cyl = int ($1 / cs) 341148422Sphk 342149120Sphk # output fdisk geometry spec, truncate cyls to 1023 343148422Sphk if (cyl <= 1023) 344149120Sphk print "g c" cyl " h" $4 " s" $3 345148422Sphk else 346149120Sphk print "g c" 1023 " h" $4 " s" $3 347148422Sphk 348149120Sphk if ($7 > 0) { 349149120Sphk # size of data partition in full cylinders 350149120Sphk dsl = int (($7 + cs - 1) / cs) 351149120Sphk } else { 352149120Sphk dsl = 0; 353149120Sphk } 354148422Sphk 355148422Sphk # size of config partition in full cylinders 356149120Sphk csl = int (($6 + cs - 1) / cs) 357148422Sphk 358150717Sphk if ($5 == 0) { 359149120Sphk # size of image partition(s) in full cylinders 360149120Sphk isl = int ((cyl - dsl - csl) / $2) 361149120Sphk } else { 362149120Sphk isl = int (($5 + cs - 1) / cs) 363149120Sphk } 364148422Sphk 365148422Sphk # First image partition start at second track 366149120Sphk print "p 1 165 " $3, isl * cs - $3 367148422Sphk c = isl * cs; 368148422Sphk 369148422Sphk # Second image partition (if any) also starts offset one 370148422Sphk # track to keep them identical. 371148422Sphk if ($2 > 1) { 372149120Sphk print "p 2 165 " $3 + c, isl * cs - $3 373148422Sphk c += isl * cs; 374148422Sphk } 375148422Sphk 376148422Sphk # Config partition starts at cylinder boundary. 377148422Sphk print "p 3 165 " c, csl * cs 378148422Sphk c += csl * cs 379148422Sphk 380148422Sphk # Data partition (if any) starts at cylinder boundary. 381149120Sphk if ($7 > 0) { 382148422Sphk print "p 4 165 " c, dsl * cs 383174936Ssimon } else if ($7 < 0 && $1 > c) { 384174936Ssimon print "p 4 165 " c, $1 - c 385150717Sphk } else if ($1 < c) { 386150717Sphk print "Disk space overcommitted by", \ 387150717Sphk c - $1, "sectors" > "/dev/stderr" 388150717Sphk exit 2 389148422Sphk } 390150717Sphk } 391148422Sphk ' > ${MAKEOBJDIRPREFIX}/_.fdisk 392148422Sphk 393175258Ssimon IMG=${NANO_DISKIMGDIR}/_.disk.full 394148422Sphk MNT=${MAKEOBJDIRPREFIX}/_.mnt 395148422Sphk mkdir -p ${MNT} 396148422Sphk 397175258Ssimon if [ "${NANO_MD_BACKING}" = "swap" ] ; then 398175258Ssimon MD=`mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} \ 399175258Ssimon -y ${NANO_HEADS}` 400175258Ssimon else 401175258Ssimon echo "Creating md backing file..." 402175258Ssimon dd if=/dev/zero of=${IMG} bs=${NANO_SECTS}b \ 403175258Ssimon count=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}` 404175258Ssimon MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} \ 405175258Ssimon -y ${NANO_HEADS}` 406175258Ssimon fi 407148422Sphk 408149014Sphk trap "df -i ${MNT} ; umount ${MNT} || true ; mdconfig -d -u $MD" 1 2 15 EXIT 409148422Sphk 410148422Sphk fdisk -i -f ${MAKEOBJDIRPREFIX}/_.fdisk ${MD} 411149120Sphk fdisk ${MD} 412148422Sphk # XXX: params 413148422Sphk # XXX: pick up cached boot* files, they may not be in image anymore. 414168894Sadrian boot0cfg -B -b ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ${NANO_BOOT0CFG} ${MD} 415160388Sthomas bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}s1 416149120Sphk bsdlabel ${MD}s1 417148422Sphk 418148422Sphk # Create first image 419148648Sphk newfs ${NANO_NEWFS} /dev/${MD}s1a 420148422Sphk mount /dev/${MD}s1a ${MNT} 421149014Sphk df -i ${MNT} 422175258Ssimon echo "Copying worlddir..." 423148422Sphk ( cd ${NANO_WORLDDIR} && find . -print | cpio -dump ${MNT} ) 424148422Sphk df -i ${MNT} 425175258Ssimon echo "Generating mtree..." 426148648Sphk ( cd ${MNT} && mtree -c ) > ${MAKEOBJDIRPREFIX}/_.mtree 427148648Sphk ( cd ${MNT} && du -k ) > ${MAKEOBJDIRPREFIX}/_.du 428148422Sphk umount ${MNT} 429148422Sphk 430171986Sphk if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then 431148422Sphk # Duplicate to second image (if present) 432175258Ssimon echo "Duplicating to second image..." 433148422Sphk dd if=/dev/${MD}s1 of=/dev/${MD}s2 bs=64k 434170322Sphk mount /dev/${MD}s2a ${MNT} 435170322Sphk for f in ${MNT}/etc/fstab ${MNT}/conf/base/etc/fstab 436170322Sphk do 437170322Sphk sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/g" $f 438170322Sphk done 439170322Sphk umount ${MNT} 440170322Sphk 441148422Sphk fi 442148422Sphk 443148422Sphk # Create Config slice 444148648Sphk newfs ${NANO_NEWFS} /dev/${MD}s3 445148422Sphk # XXX: fill from where ? 446148422Sphk 447148422Sphk # Create Data slice, if any. 448148422Sphk if [ $NANO_DATASIZE -gt 0 ] ; then 449148648Sphk newfs ${NANO_NEWFS} /dev/${MD}s4 450148422Sphk # XXX: fill from where ? 451148422Sphk fi 452148422Sphk 453175258Ssimon if [ "${NANO_MD_BACKING}" = "swap" ] ; then 454175258Ssimon echo "Writing out _.disk.full..." 455175258Ssimon dd if=/dev/${MD} of=${IMG} bs=64k 456175258Ssimon fi 457175258Ssimon 458175258Ssimon echo "Writing out _.disk.image..." 459175258Ssimon dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k 460148422Sphk mdconfig -d -u $MD 461149103Sphk ) > ${MAKEOBJDIRPREFIX}/_.di 2>&1 462148422Sphk) 463148422Sphk 464154466Sphklast_orders () ( 465154466Sphk # Redefine this function with any last orders you may have 466154466Sphk # after the build completed, for instance to copy the finished 467154466Sphk # image to a more convenient place: 468154466Sphk # cp ${MAKEOBJDIRPREFIX}/_.disk.image /home/ftp/pub/nanobsd.disk 469154466Sphk) 470154466Sphk 471148422Sphk####################################################################### 472148422Sphk# 473150366Sphk# Optional convenience functions. 474148422Sphk# 475148422Sphk####################################################################### 476148422Sphk 477149014Sphk####################################################################### 478150367Sphk# Common Flash device geometries 479150367Sphk# 480150367Sphk 481150367SphkFlashDevice () { 482150717Sphk if [ -d ${NANO_TOOLS} ] ; then 483150717Sphk . ${NANO_TOOLS}/FlashDevice.sub 484150717Sphk else 485150717Sphk . ${NANO_SRC}/${NANO_TOOLS}/FlashDevice.sub 486150717Sphk fi 487150367Sphk sub_FlashDevice $1 $2 488150367Sphk} 489150367Sphk 490150367Sphk 491150367Sphk####################################################################### 492150366Sphk# Setup serial console 493150343Sphk 494150366Sphkcust_comconsole () ( 495150366Sphk # Enable getty on console 496181459Sphk sed -i "" -e /ttyu0/s/off/on/ ${NANO_WORLDDIR}/etc/ttys 497150366Sphk 498150366Sphk # Disable getty on syscons devices 499150366Sphk sed -i "" -e '/^ttyv[0-8]/s/ on/ off/' ${NANO_WORLDDIR}/etc/ttys 500150366Sphk 501150366Sphk # Tell loader to use serial console early. 502150366Sphk echo " -h" > ${NANO_WORLDDIR}/boot.config 503150366Sphk) 504150366Sphk 505150366Sphk####################################################################### 506150366Sphk# Allow root login via ssh 507150366Sphk 508150366Sphkcust_allow_ssh_root () ( 509150366Sphk sed -i "" -e '/PermitRootLogin/s/.*/PermitRootLogin yes/' \ 510150366Sphk ${NANO_WORLDDIR}/etc/ssh/sshd_config 511150366Sphk) 512150366Sphk 513150366Sphk####################################################################### 514150366Sphk# Install the stuff under ./Files 515150366Sphk 516150366Sphkcust_install_files () ( 517150511Ssimon cd ${NANO_TOOLS}/Files 518150366Sphk find . -print | grep -v /CVS | cpio -dumpv ${NANO_WORLDDIR} 519150366Sphk) 520150366Sphk 521150366Sphk####################################################################### 522170607Sphk# Install packages from ${NANO_PACKAGE_DIR} 523170607Sphk 524170607Sphkcust_pkg () ( 525170607Sphk 526170607Sphk # Copy packages into chroot 527170607Sphk mkdir -p ${NANO_WORLDDIR}/Pkg 528170607Sphk cp ${NANO_PACKAGE_DIR}/* ${NANO_WORLDDIR}/Pkg 529170607Sphk 530170607Sphk # Count & report how many we have to install 531170607Sphk todo=`ls ${NANO_WORLDDIR}/Pkg | wc -l` 532170607Sphk echo "=== TODO: $todo" 533170607Sphk ls ${NANO_WORLDDIR}/Pkg 534170607Sphk echo "===" 535170607Sphk while true 536170607Sphk do 537170607Sphk # Record how may we have now 538170607Sphk have=`ls ${NANO_WORLDDIR}/var/db/pkg | wc -l` 539170607Sphk 540171986Sphk # Attempt to install more packages 541171986Sphk # ...but no more than 200 at a time due to pkg_add's internal 542171986Sphk # limitations. 543171986Sphk chroot ${NANO_WORLDDIR} sh -c \ 544171986Sphk 'ls Pkg/*tbz | xargs -n 200 pkg_add -F' || true 545170607Sphk 546170607Sphk # See what that got us 547170607Sphk now=`ls ${NANO_WORLDDIR}/var/db/pkg | wc -l` 548170607Sphk echo "=== NOW $now" 549170607Sphk ls ${NANO_WORLDDIR}/var/db/pkg 550170607Sphk echo "===" 551170607Sphk 552170607Sphk 553170607Sphk if [ $now -eq $todo ] ; then 554170607Sphk echo "DONE $now packages" 555170607Sphk break 556170607Sphk elif [ $now -eq $have ] ; then 557170607Sphk echo "FAILED: Nothing happened on this pass" 558170607Sphk exit 2 559170607Sphk fi 560170607Sphk done 561170607Sphk rm -rf ${NANO_WORLDDIR}/Pkg 562170607Sphk) 563170607Sphk 564170607Sphk####################################################################### 565150366Sphk# Convenience function: 566150366Sphk# Register $1 as customize function. 567150366Sphk 568150343Sphkcustomize_cmd () { 569150343Sphk NANO_CUSTOMIZE="$NANO_CUSTOMIZE $1" 570150343Sphk} 571150343Sphk 572150343Sphk####################################################################### 573150366Sphk# 574150366Sphk# All set up to go... 575150366Sphk# 576150366Sphk####################################################################### 577150366Sphk 578156496Sphkusage () { 579156496Sphk ( 580156496Sphk echo "Usage: $0 [-b/-k/-w] [-c config_file]" 581156496Sphk echo " -b suppress builds (both kernel and world)" 582156496Sphk echo " -k suppress buildkernel" 583156496Sphk echo " -w suppress buildworld" 584181460Sphk echo " -i suppress disk image build" 585156496Sphk echo " -c specify config file" 586156496Sphk ) 1>&2 587156496Sphk exit 2 588156496Sphk} 589156496Sphk 590150366Sphk####################################################################### 591149014Sphk# Parse arguments 592148422Sphk 593156496Sphkdo_kernel=true 594156496Sphkdo_world=true 595181460Sphkdo_image=true 596150366Sphk 597156496Sphkset +e 598181460Sphkargs=`getopt bc:hkwi $*` 599149014Sphkif [ $? -ne 0 ] ; then 600156496Sphk usage 601149014Sphk exit 2 602149014Sphkfi 603156496Sphkset -e 604149014Sphk 605149014Sphkset -- $args 606149014Sphkfor i 607149014Sphkdo 608149014Sphk case "$i" 609149014Sphk in 610150366Sphk -b) 611150366Sphk shift; 612156496Sphk do_world=false 613156496Sphk do_kernel=false 614150366Sphk ;; 615156496Sphk -k) 616156496Sphk shift; 617156496Sphk do_kernel=false 618156496Sphk ;; 619149014Sphk -c) 620149014Sphk . "$2" 621149014Sphk shift; 622149014Sphk shift; 623149014Sphk ;; 624150366Sphk -h) 625156496Sphk usage 626150366Sphk ;; 627181460Sphk -i) 628181460Sphk do_image=false 629156496Sphk -w) 630156496Sphk shift; 631156496Sphk do_world=false 632156496Sphk ;; 633149014Sphk --) 634149014Sphk shift; 635149014Sphk break; 636149014Sphk esac 637149014Sphkdone 638149014Sphk 639150366Sphkif [ $# -gt 0 ] ; then 640156496Sphk echo "$0: Extraneous arguments supplied" 641156496Sphk usage 642150366Sphkfi 643150366Sphk 644148422Sphk####################################################################### 645150366Sphk# Setup and Export Internal variables 646150366Sphk# 647148422Sphkif [ "x${NANO_OBJ}" = "x" ] ; then 648148422Sphk MAKEOBJDIRPREFIX=/usr/obj/nanobsd.${NANO_NAME}/ 649149073Sphk NANO_OBJ=${MAKEOBJDIRPREFIX} 650148422Sphkelse 651148422Sphk MAKEOBJDIRPREFIX=${NANO_OBJ} 652148422Sphkfi 653148422Sphk 654175258Ssimonif [ "x${NANO_DISKIMGDIR}" = "x" ] ; then 655175258Ssimon NANO_DISKIMGDIR=${MAKEOBJDIRPREFIX} 656175258Ssimonfi 657175258Ssimon 658148422SphkNANO_WORLDDIR=${MAKEOBJDIRPREFIX}/_.w 659148422SphkNANO_MAKE_CONF=${MAKEOBJDIRPREFIX}/make.conf 660148422Sphk 661150511Ssimonif [ -d ${NANO_TOOLS} ] ; then 662150511Ssimon true 663150511Ssimonelif [ -d ${NANO_SRC}/${NANO_TOOLS} ] ; then 664150511Ssimon NANO_TOOLS=${NANO_SRC}/${NANO_TOOLS} 665150511Ssimonelse 666150511Ssimon echo "NANO_TOOLS directory does not exist" 1>&2 667150511Ssimon exit 1 668150511Ssimonfi 669150511Ssimon 670148422Sphkexport MAKEOBJDIRPREFIX 671148422Sphk 672148422Sphkexport NANO_ARCH 673149120Sphkexport NANO_CODESIZE 674148422Sphkexport NANO_CONFSIZE 675149073Sphkexport NANO_CUSTOMIZE 676148422Sphkexport NANO_DATASIZE 677149082Sphkexport NANO_DRIVE 678148422Sphkexport NANO_HEADS 679148648Sphkexport NANO_IMAGES 680148648Sphkexport NANO_MAKE_CONF 681149120Sphkexport NANO_MEDIASIZE 682148648Sphkexport NANO_NAME 683148648Sphkexport NANO_NEWFS 684148648Sphkexport NANO_OBJ 685148422Sphkexport NANO_PMAKE 686148648Sphkexport NANO_SECTS 687148422Sphkexport NANO_SRC 688150366Sphkexport NANO_TOOLS 689148648Sphkexport NANO_WORLDDIR 690168894Sadrianexport NANO_BOOT0CFG 691168894Sadrianexport NANO_BOOTLOADER 692148422Sphk 693148422Sphk####################################################################### 694150366Sphk# And then it is as simple as that... 695148422Sphk 696156496Sphkif $do_world ; then 697150366Sphk clean_build 698150366Sphk make_conf_build 699150366Sphk build_world 700156496Sphkelse 701156496Sphk echo "## Skipping buildworld (as instructed)" 702156496Sphkfi 703156496Sphk 704156496Sphkif $do_kernel ; then 705150366Sphk build_kernel 706150366Sphkelse 707156496Sphk echo "## Skipping buildkernel (as instructed)" 708150366Sphkfi 709149120Sphk 710149120Sphkclean_world 711149082Sphkmake_conf_install 712148422Sphkinstall_world 713148422Sphkinstall_etc 714161341Ssimonsetup_nanobsd_etc 715148422Sphkinstall_kernel 716149120Sphk 717149082Sphkrun_customize 718150366Sphksetup_nanobsd 719149014Sphkprune_usr 720181460Sphkif $do_image ; then 721181460Sphk create_${NANO_ARCH}_diskimage 722181460Sphkelse 723181460Sphk echo "## Skipping image build (as instructed)" 724181460Sphkfi 725154466Sphklast_orders 726149120Sphk 727149120Sphkecho "# NanoBSD image completed" 728