1#!/bin/sh 2# 3# Copyright (c) 2005 Poul-Henning Kamp. 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25# SUCH DAMAGE. 26# 27# $FreeBSD$ 28# 29 30set -e 31 32####################################################################### 33# 34# Setup default values for all controlling variables. 35# These values can be overridden from the config file(s) 36# 37####################################################################### 38 39# Name of this NanoBSD build. (Used to construct workdir names) 40NANO_NAME=full 41 42# Source tree directory 43NANO_SRC=/usr/src 44 45# Where nanobsd additional files live under the source tree 46NANO_TOOLS=tools/tools/nanobsd 47 48# Where cust_pkgng() finds packages to install 49NANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg 50NANO_PACKAGE_LIST="*" 51 52# where package metadata gets placed 53NANO_PKG_META_BASE=/var/db 54 55# Path to mtree file to apply to anything copied by cust_install_files(). 56# If you specify this, the mtree file *must* have an entry for every file and 57# directory located in Files. 58#NANO_CUST_FILES_MTREE="" 59 60# Object tree directory 61# default is subdir of /usr/obj 62#NANO_OBJ="" 63 64# The directory to put the final images 65# default is ${NANO_OBJ} 66#NANO_DISKIMGDIR="" 67 68# Make & parallel Make 69NANO_MAKE="make" 70NANO_PMAKE="make -j 3" 71 72# The default name for any image we create. 73NANO_IMGNAME="_.disk.full" 74NANO_IMG1NAME="_.disk.image" 75 76# Options to put in make.conf during buildworld only 77CONF_BUILD=' ' 78 79# Options to put in make.conf during installworld only 80CONF_INSTALL=' ' 81 82# Options to put in make.conf during both build- & installworld. 83CONF_WORLD=' ' 84 85# Kernel config file to use 86NANO_KERNEL=GENERIC 87 88# Kernel modules to install. If empty, no modules are installed. 89# Use "default" to install all built modules. 90NANO_MODULES= 91 92# Early customize commands. 93NANO_EARLY_CUSTOMIZE="" 94 95# Customize commands. 96NANO_CUSTOMIZE="" 97 98# Late customize commands. 99NANO_LATE_CUSTOMIZE="" 100 101# Newfs parameters to use 102NANO_NEWFS="-b 4096 -f 512 -i 8192 -U" 103 104# The drive name of the media at runtime 105NANO_DRIVE=ada0 106 107# Target media size in 512 bytes sectors 108NANO_MEDIASIZE=2000000 109 110# Number of code images on media (1 or 2) 111NANO_IMAGES=2 112 113# 0 -> Leave second image all zeroes so it compresses better. 114# 1 -> Initialize second image with a copy of the first 115NANO_INIT_IMG2=1 116 117# Size of code file system in 512 bytes sectors 118# If zero, size will be as large as possible. 119NANO_CODESIZE=0 120 121# Size of configuration file system in 512 bytes sectors 122# Cannot be zero. 123NANO_CONFSIZE=2048 124 125# Size of data file system in 512 bytes sectors 126# If zero: no partition configured. 127# If negative: max size possible 128NANO_DATASIZE=0 129 130# Size of the /etc ramdisk in 512 bytes sectors 131NANO_RAM_ETCSIZE=10240 132 133# Size of the /tmp+/var ramdisk in 512 bytes sectors 134NANO_RAM_TMPVARSIZE=10240 135 136# boot0 flags/options and configuration 137NANO_BOOT0CFG="-o packet -s 1 -m 3" 138NANO_BOOTLOADER="boot/boot0sio" 139 140# boot2 flags/options 141# default force serial console 142NANO_BOOT2CFG="-h -S115200" 143 144# Backing type of md(4) device 145# Can be "file" or "swap" 146NANO_MD_BACKING="file" 147 148# for swap type md(4) backing, write out the mbr only 149NANO_IMAGE_MBRONLY=true 150 151# Progress Print level 152PPLEVEL=3 153 154# Set NANO_LABEL to non-blank to form the basis for using /dev/ufs/label 155# in preference to /dev/${NANO_DRIVE} 156# Root partition will be ${NANO_LABEL}s{1,2} 157# /cfg partition will be ${NANO_LABEL}s3 158# /data partition will be ${NANO_LABEL}s4 159NANO_LABEL="" 160NANO_SLICE_ROOT=s1 161NANO_SLICE_ALTROOT=s2 162NANO_SLICE_CFG=s3 163NANO_SLICE_DATA=s4 164NANO_ROOT=s1a 165NANO_ALTROOT=s2a 166 167# Default ownwership for nopriv build 168NANO_DEF_UNAME=root 169NANO_DEF_GNAME=wheel 170 171####################################################################### 172# Architecture to build. Corresponds to TARGET_ARCH in a buildworld. 173# Unfortunately, there's no way to set TARGET at this time, and it 174# conflates the two, so architectures where TARGET != TARGET_ARCH and 175# TARGET can't be guessed from TARGET_ARCH do not work. This defaults 176# to the arch of the current machine. 177NANO_ARCH=`uname -p` 178 179# CPUTYPE defaults to "" which is the default when CPUTYPE isn't 180# defined. 181NANO_CPUTYPE="" 182 183# Directory to populate /cfg from 184NANO_CFGDIR="" 185 186# Directory to populate /data from 187NANO_DATADIR="" 188 189# We don't need SRCCONF or SRC_ENV_CONF. NanoBSD puts everything we 190# need for the build in files included with __MAKE_CONF. Override in your 191# config file if you really must. We set them unconditionally here, though 192# in case they are stray in the build environment 193SRCCONF=/dev/null 194SRC_ENV_CONF=/dev/null 195 196####################################################################### 197# 198# The functions which do the real work. 199# Can be overridden from the config file(s) 200# 201####################################################################### 202 203# Export values into the shell. Must use { } instead of ( ) like 204# other functions to avoid a subshell. 205# We set __MAKE_CONF as a global since it is easier to get quoting 206# right for paths with spaces in them. 207make_export ( ) { 208 # Similar to export_var, except puts the data out to stdout 209 var=$1 210 eval val=\$$var 211 echo "Setting variable: $var=\"$val\"" 212 export $1 213} 214 215nano_make_build_env ( ) { 216 __MAKE_CONF="${NANO_MAKE_CONF_BUILD}" 217 make_export __MAKE_CONF 218} 219 220nano_make_install_env ( ) { 221 __MAKE_CONF="${NANO_MAKE_CONF_INSTALL}" 222 make_export __MAKE_CONF 223} 224 225# Extra environment variables for kernel builds 226nano_make_kernel_env ( ) { 227 if [ -f "${NANO_KERNEL}" ] ; then 228 KERNCONFDIR="$(realpath $(dirname ${NANO_KERNEL}))" 229 KERNCONF="$(basename ${NANO_KERNEL})" 230 make_export KERNCONFDIR 231 make_export KERNCONF 232 else 233 export KERNCONF="${NANO_KERNEL}" 234 make_export KERNCONF 235 fi 236} 237 238nano_global_make_env ( ) ( 239 # global settings for the make.conf file, if set 240 [ -z "${NANO_ARCH}" ] || echo TARGET_ARCH="${NANO_ARCH}" 241 [ -z "${NANO_CPUTYPE}" ] || echo TARGET_CPUTYPE="${NANO_CPUTYPE}" 242) 243 244# rm doesn't know -x prior to FreeBSD 10, so cope with a variety of build 245# hosts for now. This will go away when support in the base goes away. 246rm ( ) { 247 echo "NANO RM $*" 248 case $(uname -r) in 249 7*|8*|9*) command rm $* ;; 250 *) command rm -x $* ;; 251 esac 252} 253 254# 255# Create empty files in the target tree, and record the fact. All paths 256# are relative to NANO_WORLDDIR. 257# 258tgt_touch ( ) ( 259 260 cd "${NANO_WORLDDIR}" 261 for i; do 262 touch $i 263 echo "./${i} type=file" >> ${NANO_METALOG} 264 done 265) 266 267# 268# Convert a directory into a symlink. Takes two arguments, the 269# current directory and what it should become a symlink to. The 270# directory is removed and a symlink is created. If we're doing 271# a nopriv build, then append this fact to the metalog 272# 273tgt_dir2symlink () ( 274 dir=$1 275 symlink=$2 276 277 cd "${NANO_WORLDDIR}" 278 rm -rf "$dir" 279 ln -s "$symlink" "$dir" 280 if [ -n "$NANO_METALOG" ]; then 281 echo "./${dir} type=link mode=0777 link=${symlink}" >> ${NANO_METALOG} 282 fi 283) 284 285# run in the world chroot, errors fatal 286CR ( ) { 287 chroot "${NANO_WORLDDIR}" /bin/sh -exc "$*" 288} 289 290# run in the world chroot, errors not fatal 291CR0 ( ) { 292 chroot "${NANO_WORLDDIR}" /bin/sh -c "$*" || true 293} 294 295nano_cleanup ( ) ( 296 [ $? -eq 0 ] || echo "Error encountered. Check for errors in last log file." 1>&2 297 exit $? 298) 299 300clean_build ( ) ( 301 pprint 2 "Clean and create object directory (${MAKEOBJDIRPREFIX})" 302 303 if ! rm -rf ${MAKEOBJDIRPREFIX}/ > /dev/null 2>&1 ; then 304 chflags -R noschg ${MAKEOBJDIRPREFIX}/ 305 rm -r ${MAKEOBJDIRPREFIX}/ 306 fi 307) 308 309make_conf_build ( ) ( 310 pprint 2 "Construct build make.conf ($NANO_MAKE_CONF_BUILD)" 311 312 mkdir -p ${MAKEOBJDIRPREFIX} 313 printenv > ${MAKEOBJDIRPREFIX}/_.env 314 315 # Make sure we get all the global settings that NanoBSD wants 316 # in addition to the user's global settings 317 ( 318 nano_global_make_env 319 echo "${CONF_WORLD}" 320 echo "${CONF_BUILD}" 321 ) > ${NANO_MAKE_CONF_BUILD} 322) 323 324build_world ( ) ( 325 pprint 2 "run buildworld" 326 pprint 3 "log: ${MAKEOBJDIRPREFIX}/_.bw" 327 328 ( 329 nano_make_build_env 330 set -o xtrace 331 cd "${NANO_SRC}" 332 ${NANO_PMAKE} buildworld 333 ) > ${MAKEOBJDIRPREFIX}/_.bw 2>&1 334) 335 336build_kernel ( ) ( 337 local extra 338 339 pprint 2 "build kernel ($NANO_KERNEL)" 340 pprint 3 "log: ${MAKEOBJDIRPREFIX}/_.bk" 341 342 ( 343 nano_make_build_env 344 nano_make_kernel_env 345 346 # Note: We intentionally build all modules, not only the ones in 347 # NANO_MODULES so the built world can be reused by multiple images. 348 # Although MODULES_OVERRIDE can be defined in the kernel config 349 # file to override this behavior. Just set NANO_MODULES=default. 350 set -o xtrace 351 cd "${NANO_SRC}" 352 ${NANO_PMAKE} buildkernel 353 ) > ${MAKEOBJDIRPREFIX}/_.bk 2>&1 354) 355 356clean_world ( ) ( 357 if [ "${NANO_OBJ}" != "${MAKEOBJDIRPREFIX}" ]; then 358 pprint 2 "Clean and create object directory (${NANO_OBJ})" 359 if ! rm -rf ${NANO_OBJ}/ > /dev/null 2>&1 ; then 360 chflags -R noschg ${NANO_OBJ} 361 rm -r ${NANO_OBJ}/ 362 fi 363 mkdir -p "${NANO_OBJ}" "${NANO_WORLDDIR}" 364 printenv > ${NANO_LOG}/_.env 365 else 366 pprint 2 "Clean and create world directory (${NANO_WORLDDIR})" 367 if ! rm -rf "${NANO_WORLDDIR}/" > /dev/null 2>&1 ; then 368 chflags -R noschg "${NANO_WORLDDIR}" 369 rm -rf "${NANO_WORLDDIR}/" 370 fi 371 mkdir -p "${NANO_WORLDDIR}" 372 fi 373) 374 375make_conf_install ( ) ( 376 pprint 2 "Construct install make.conf ($NANO_MAKE_CONF_INSTALL)" 377 378 # Make sure we get all the global settings that NanoBSD wants 379 # in addition to the user's global settings 380 ( 381 nano_global_make_env 382 echo "${CONF_WORLD}" 383 echo "${CONF_INSTALL}" 384 if [ -n "${NANO_NOPRIV_BUILD}" ]; then 385 echo NO_ROOT=t 386 echo METALOG=${NANO_METALOG} 387 fi 388 ) > ${NANO_MAKE_CONF_INSTALL} 389) 390 391install_world ( ) ( 392 pprint 2 "installworld" 393 pprint 3 "log: ${NANO_LOG}/_.iw" 394 395 ( 396 nano_make_install_env 397 set -o xtrace 398 cd "${NANO_SRC}" 399 ${NANO_MAKE} installworld DESTDIR="${NANO_WORLDDIR}" 400 chflags -R noschg "${NANO_WORLDDIR}" 401 ) > ${NANO_LOG}/_.iw 2>&1 402) 403 404install_etc ( ) ( 405 406 pprint 2 "install /etc" 407 pprint 3 "log: ${NANO_LOG}/_.etc" 408 409 ( 410 nano_make_install_env 411 set -o xtrace 412 cd "${NANO_SRC}" 413 ${NANO_MAKE} distribution DESTDIR="${NANO_WORLDDIR}" 414 # make.conf doesn't get created by default, but some ports need it 415 # so they can spam it. 416 cp /dev/null "${NANO_WORLDDIR}"/etc/make.conf 417 ) > ${NANO_LOG}/_.etc 2>&1 418) 419 420install_kernel ( ) ( 421 local extra 422 423 pprint 2 "install kernel ($NANO_KERNEL)" 424 pprint 3 "log: ${NANO_LOG}/_.ik" 425 426 ( 427 428 nano_make_install_env 429 nano_make_kernel_env 430 431 if [ "${NANO_MODULES}" != "default" ]; then 432 MODULES_OVERRIDE="${NANO_MODULES}" 433 make_export MODULES_OVERRIDE 434 fi 435 436 set -o xtrace 437 cd "${NANO_SRC}" 438 ${NANO_MAKE} installkernel DESTDIR="${NANO_WORLDDIR}" 439 440 ) > ${NANO_LOG}/_.ik 2>&1 441) 442 443native_xtools ( ) ( 444 print 2 "Installing the optimized native build tools for cross env" 445 pprint 3 "log: ${NANO_LOG}/_.native_xtools" 446 447 ( 448 449 nano_make_install_env 450 set -o xtrace 451 cd "${NANO_SRC}" 452 ${NANO_MAKE} native-xtools DESTDIR="${NANO_WORLDDIR}" 453 454 ) > ${NANO_LOG}/_.native_xtools 2>&1 455) 456 457# 458# Run the requested set of early customization scripts, run before 459# buildworld. 460# 461run_early_customize() { 462 463 pprint 2 "run early customize scripts" 464 for c in $NANO_EARLY_CUSTOMIZE 465 do 466 pprint 2 "early customize \"$c\"" 467 pprint 3 "log: ${NANO_LOG}/_.early_cust.$c" 468 pprint 4 "`type $c`" 469 { set -x ; $c ; set +x ; } >${NANO_LOG}/_.early_cust.$c 2>&1 470 done 471} 472 473# 474# Run the requested set of customization scripts, run after we've 475# done an installworld, installed the etc files, installed the kernel 476# and tweaked them in the standard way. 477# 478run_customize ( ) ( 479 480 pprint 2 "run customize scripts" 481 for c in $NANO_CUSTOMIZE 482 do 483 pprint 2 "customize \"$c\"" 484 pprint 3 "log: ${NANO_LOG}/_.cust.$c" 485 pprint 4 "`type $c`" 486 ( set -x ; $c ) > ${NANO_LOG}/_.cust.$c 2>&1 487 done 488) 489 490# 491# Run any last-minute customization commands after we've had a chance to 492# setup nanobsd, prune empty dirs from /usr, etc 493# 494run_late_customize ( ) ( 495 496 pprint 2 "run late customize scripts" 497 for c in $NANO_LATE_CUSTOMIZE 498 do 499 pprint 2 "late customize \"$c\"" 500 pprint 3 "log: ${NANO_LOG}/_.late_cust.$c" 501 pprint 4 "`type $c`" 502 ( set -x ; $c ) > ${NANO_LOG}/_.late_cust.$c 2>&1 503 done 504) 505 506# 507# Hook called after we run all the late customize commands, but 508# before we invoke the disk imager. The nopriv build uses it to 509# read in the meta log, apply the changes other parts of nanobsd 510# have been recording their actions. It's not anticipated that 511# a user's cfg file would override this. 512# 513fixup_before_diskimage ( ) ( 514 515 # Run the deduplication script that takes the matalog journal and 516 # combines multiple entries for the same file (see source for 517 # details). We take the extra step of removing the size keywords. This 518 # script, and many of the user scripts, copies, appeneds and otherwise 519 # modifies files in the build, changing their sizes. These actions are 520 # impossible to trap, so go ahead remove the size= keyword. For this 521 # narrow use, it doesn't buy us any protection and just gets in the way. 522 # The dedup tool's output must be sorted due to limitations in awk. 523 if [ -n "${NANO_METALOG}" ]; then 524 pprint 2 "Fixing metalog" 525 cp ${NANO_METALOG} ${NANO_METALOG}.pre 526 echo "/set uname=${NANO_DEF_UNAME} gname=${NANO_DEF_GNAME}" > ${NANO_METALOG} 527 cat ${NANO_METALOG}.pre | ${NANO_TOOLS}/mtree-dedup.awk | \ 528 sed -e 's/ size=[0-9][0-9]*//' | sort >> ${NANO_METALOG} 529 fi 530) 531 532setup_nanobsd ( ) ( 533 pprint 2 "configure nanobsd setup" 534 pprint 3 "log: ${NANO_LOG}/_.dl" 535 536 ( 537 cd "${NANO_WORLDDIR}" 538 539 # Move /usr/local/etc to /etc/local so that the /cfg stuff 540 # can stomp on it. Otherwise packages like ipsec-tools which 541 # have hardcoded paths under ${prefix}/etc are not tweakable. 542 if [ -d usr/local/etc ] ; then 543 ( 544 mkdir -p etc/local 545 cd usr/local/etc 546 find . -print | cpio -dumpl ../../../etc/local 547 cd .. 548 rm -rf etc 549 ln -s ../../etc/local etc 550 ) 551 fi 552 553 for d in var etc 554 do 555 # link /$d under /conf 556 # we use hard links so we have them both places. 557 # the files in /$d will be hidden by the mount. 558 mkdir -p conf/base/$d conf/default/$d 559 find $d -print | cpio -dumpl conf/base/ 560 done 561 562 echo "$NANO_RAM_ETCSIZE" > conf/base/etc/md_size 563 echo "$NANO_RAM_TMPVARSIZE" > conf/base/var/md_size 564 565 # pick up config files from the special partition 566 echo "mount -o ro /dev/${NANO_DRIVE}${NANO_SLICE_CFG}" > conf/default/etc/remount 567 568 # Put /tmp on the /var ramdisk (could be symlink already) 569 tgt_dir2symlink tmp var/tmp 570 571 ) > ${NANO_LOG}/_.dl 2>&1 572) 573 574setup_nanobsd_etc ( ) ( 575 pprint 2 "configure nanobsd /etc" 576 577 ( 578 cd "${NANO_WORLDDIR}" 579 580 # create diskless marker file 581 touch etc/diskless 582 583 [ -n "${NANO_NOPRIV_BUILD}" ] && chmod 666 etc/defaults/rc.conf 584 585 # Make root filesystem R/O by default 586 echo "root_rw_mount=NO" >> etc/defaults/rc.conf 587 # Disable entropy file, since / is read-only /var/db/entropy should be enough? 588 echo "entropy_file=NO" >> etc/defaults/rc.conf 589 590 [ -n "${NANO_NOPRIV_BUILD}" ] && chmod 444 etc/defaults/rc.conf 591 592 # save config file for scripts 593 echo "NANO_DRIVE=${NANO_DRIVE}" > etc/nanobsd.conf 594 595 echo "/dev/${NANO_DRIVE}${NANO_ROOT} / ufs ro 1 1" > etc/fstab 596 echo "/dev/${NANO_DRIVE}${NANO_SLICE_CFG} /cfg ufs rw,noauto 2 2" >> etc/fstab 597 mkdir -p cfg 598 ) 599) 600 601prune_usr ( ) ( 602 603 # Remove all empty directories in /usr 604 find "${NANO_WORLDDIR}"/usr -type d -depth -print | 605 while read d 606 do 607 rmdir $d > /dev/null 2>&1 || true 608 done 609) 610 611newfs_part ( ) ( 612 local dev mnt lbl 613 dev=$1 614 mnt=$2 615 lbl=$3 616 echo newfs ${NANO_NEWFS} ${NANO_LABEL:+-L${NANO_LABEL}${lbl}} ${dev} 617 newfs ${NANO_NEWFS} ${NANO_LABEL:+-L${NANO_LABEL}${lbl}} ${dev} 618 mount -o async ${dev} ${mnt} 619) 620 621# Convenient spot to work around any umount issues that your build environment 622# hits by overriding this method. 623nano_umount ( ) ( 624 umount ${1} 625) 626 627populate_slice ( ) ( 628 local dev dir mnt lbl 629 dev=$1 630 dir=$2 631 mnt=$3 632 lbl=$4 633 echo "Creating ${dev} (mounting on ${mnt})" 634 newfs_part ${dev} ${mnt} ${lbl} 635 if [ -n "${dir}" -a -d "${dir}" ]; then 636 echo "Populating ${lbl} from ${dir}" 637 cd "${dir}" 638 find . -print | grep -Ev '/(CVS|\.svn|\.hg|\.git)/' | cpio -dumpv ${mnt} 639 fi 640 df -i ${mnt} 641 nano_umount ${mnt} 642) 643 644populate_cfg_slice ( ) ( 645 populate_slice "$1" "$2" "$3" "$4" 646) 647 648populate_data_slice ( ) ( 649 populate_slice "$1" "$2" "$3" "$4" 650) 651 652last_orders ( ) ( 653 # Redefine this function with any last orders you may have 654 # after the build completed, for instance to copy the finished 655 # image to a more convenient place: 656 # cp ${NANO_DISKIMGDIR}/${NANO_IMG1NAME} /home/ftp/pub/nanobsd.disk 657 true 658) 659 660####################################################################### 661# 662# Optional convenience functions. 663# 664####################################################################### 665 666####################################################################### 667# Common Flash device geometries 668# 669 670FlashDevice ( ) { 671 if [ -d ${NANO_TOOLS} ] ; then 672 . ${NANO_TOOLS}/FlashDevice.sub 673 else 674 . ${NANO_SRC}/${NANO_TOOLS}/FlashDevice.sub 675 fi 676 sub_FlashDevice $1 $2 677} 678 679####################################################################### 680# USB device geometries 681# 682# Usage: 683# UsbDevice Generic 1000 # a generic flash key sold as having 1GB 684# 685# This function will set NANO_MEDIASIZE, NANO_HEADS and NANO_SECTS for you. 686# 687# Note that the capacity of a flash key is usually advertised in MB or 688# GB, *not* MiB/GiB. As such, the precise number of cylinders available 689# for C/H/S geometry may vary depending on the actual flash geometry. 690# 691# The following generic device layouts are understood: 692# generic An alias for generic-hdd. 693# generic-hdd 255H 63S/T xxxxC with no MBR restrictions. 694# generic-fdd 64H 32S/T xxxxC with no MBR restrictions. 695# 696# The generic-hdd device is preferred for flash devices larger than 1GB. 697# 698 699UsbDevice ( ) { 700 a1=`echo $1 | tr '[:upper:]' '[:lower:]'` 701 case $a1 in 702 generic-fdd) 703 NANO_HEADS=64 704 NANO_SECTS=32 705 NANO_MEDIASIZE=$(( $2 * 1000 * 1000 / 512 )) 706 ;; 707 generic|generic-hdd) 708 NANO_HEADS=255 709 NANO_SECTS=63 710 NANO_MEDIASIZE=$(( $2 * 1000 * 1000 / 512 )) 711 ;; 712 *) 713 echo "Unknown USB flash device" 714 exit 2 715 ;; 716 esac 717} 718 719####################################################################### 720# Setup serial console 721 722cust_comconsole ( ) ( 723 # Enable getty on console 724 sed -i "" -e /tty[du]0/s/off/on/ ${NANO_WORLDDIR}/etc/ttys 725 726 # Disable getty on syscons devices 727 sed -i "" -e '/^ttyv[0-8]/s/ on/ off/' ${NANO_WORLDDIR}/etc/ttys 728 729 # Tell loader to use serial console early. 730 echo "${NANO_BOOT2CFG}" > ${NANO_WORLDDIR}/boot.config 731) 732 733####################################################################### 734# Allow root login via ssh 735 736cust_allow_ssh_root ( ) ( 737 sed -i "" -e '/PermitRootLogin/s/.*/PermitRootLogin yes/' \ 738 ${NANO_WORLDDIR}/etc/ssh/sshd_config 739) 740 741####################################################################### 742# Install the stuff under ./Files 743 744cust_install_files ( ) ( 745 cd "${NANO_TOOLS}/Files" 746 find . -print | grep -Ev '/(CVS|\.svn|\.hg|\.git)/' | cpio -Ldumpv ${NANO_WORLDDIR} 747 748 if [ -n "${NANO_CUST_FILES_MTREE}" -a -f ${NANO_CUST_FILES_MTREE} ]; then 749 CR "mtree -eiU -p /" <${NANO_CUST_FILES_MTREE} 750 fi 751) 752 753####################################################################### 754# Install packages from ${NANO_PACKAGE_DIR} 755 756cust_pkgng ( ) ( 757 758 mkdir -p ${NANO_WORLDDIR}/usr/local/etc 759 local PKG_CONF="${NANO_WORLDDIR}/usr/local/etc/pkg.conf" 760 local PKGCMD="env ASSUME_ALWAYS_YES=YES PKG_DBDIR=${NANO_PKG_META_BASE}/pkg SIGNATURE_TYPE=none /usr/sbin/pkg" 761 762 # Ensure pkg.conf points pkg to where the package meta data lives. 763 touch ${PKG_CONF} 764 if grep -Eiq '^PKG_DBDIR:.*' ${PKG_CONF}; then 765 sed -i -e "\|^PKG_DBDIR:.*|Is||PKG_DBDIR: "\"${NANO_PKG_META_BASE}/pkg\""|" ${PKG_CONF} 766 else 767 echo "PKG_DBDIR: \"${NANO_PKG_META_BASE}/pkg\"" >> ${PKG_CONF} 768 fi 769 770 # If the package directory doesn't exist, we're done. 771 if [ ! -d ${NANO_PACKAGE_DIR} ]; then 772 echo "DONE 0 packages" 773 return 0 774 fi 775 776 # Find a pkg-* package 777 for x in `find -s ${NANO_PACKAGE_DIR} -iname 'pkg-*'`; do 778 _NANO_PKG_PACKAGE=`basename "$x"` 779 done 780 if [ -z "${_NANO_PKG_PACKAGE}" -o ! -f "${NANO_PACKAGE_DIR}/${_NANO_PKG_PACKAGE}" ]; then 781 echo "FAILED: need a pkg/ package for bootstrapping" 782 exit 2 783 fi 784 785 # Mount packages into chroot 786 mkdir -p ${NANO_WORLDDIR}/_.p 787 mount -t nullfs -o noatime -o ro ${NANO_PACKAGE_DIR} ${NANO_WORLDDIR}/_.p 788 789 trap "umount ${NANO_WORLDDIR}/_.p ; rm -rf ${NANO_WORLDDIR}/_.p" 1 2 15 EXIT 790 791 # Install pkg-* package 792 CR "${PKGCMD} add /_.p/${_NANO_PKG_PACKAGE}" 793 794 ( 795 # Expand any glob characters in pacakge list 796 cd "${NANO_PACKAGE_DIR}" 797 _PKGS=`find ${NANO_PACKAGE_LIST} -not -name "${_NANO_PKG_PACKAGE}" -print | sort | uniq` 798 799 # Show todo 800 todo=`echo "$_PKGS" | wc -l` 801 echo "=== TODO: $todo" 802 echo "$_PKGS" 803 echo "===" 804 805 # Install packages 806 for _PKG in $_PKGS; do 807 CR "${PKGCMD} add /_.p/${_PKG}" 808 done 809 ) 810 811 CR0 "${PKGCMD} info" 812 813 trap - 1 2 15 EXIT 814 umount ${NANO_WORLDDIR}/_.p 815 rm -rf ${NANO_WORLDDIR}/_.p 816) 817 818####################################################################### 819# Convenience function: 820# Register all args as early customize function to run just before 821# build commences. 822 823early_customize_cmd () { 824 NANO_EARLY_CUSTOMIZE="$NANO_EARLY_CUSTOMIZE $*" 825} 826 827####################################################################### 828# Convenience function: 829# Register all args as customize function. 830 831customize_cmd ( ) { 832 NANO_CUSTOMIZE="$NANO_CUSTOMIZE $*" 833} 834 835####################################################################### 836# Convenience function: 837# Register all args as late customize function to run just before 838# image creation. 839 840late_customize_cmd ( ) { 841 NANO_LATE_CUSTOMIZE="$NANO_LATE_CUSTOMIZE $*" 842} 843 844####################################################################### 845# 846# All set up to go... 847# 848####################################################################### 849 850# Progress Print 851# Print $2 at level $1. 852pprint ( ) ( 853 if [ "$1" -le $PPLEVEL ]; then 854 runtime=$(( `date +%s` - $NANO_STARTTIME )) 855 printf "%s %.${1}s %s\n" "`date -u -r $runtime +%H:%M:%S`" "#####" "$2" 1>&3 856 fi 857) 858 859usage ( ) { 860 ( 861 echo "Usage: $0 [-bfhiKknqvwX] [-c config_file]" 862 echo " -b suppress builds (both kernel and world)" 863 echo " -c specify config file" 864 echo " -f suppress code slice extraction" 865 echo " -h print this help summary page" 866 echo " -i suppress disk image build" 867 echo " -K suppress installkernel" 868 echo " -k suppress buildkernel" 869 echo " -n add -DNO_CLEAN to buildworld, buildkernel, etc" 870 echo " -q make output more quiet" 871 echo " -v make output more verbose" 872 echo " -w suppress buildworld" 873 echo " -X make native-xtools" 874 ) 1>&2 875 exit 2 876} 877 878####################################################################### 879# Setup and Export Internal variables 880# 881 882export_var ( ) { # Don't wawnt a subshell 883 var=$1 884 # Lookup value of the variable. 885 eval val=\$$var 886 pprint 3 "Setting variable: $var=\"$val\"" 887 export $1 888} 889 890# Call this function to set defaults _after_ parsing options. 891# dont want a subshell otherwise variable setting is thrown away. 892set_defaults_and_export ( ) { 893 : ${NANO_OBJ:=/usr/obj/nanobsd.${NANO_NAME}} 894 : ${MAKEOBJDIRPREFIX:=${NANO_OBJ}} 895 : ${NANO_DISKIMGDIR:=${NANO_OBJ}} 896 : ${NANO_WORLDDIR:=${NANO_OBJ}/_.w} 897 : ${NANO_LOG:=${NANO_OBJ}} 898 NANO_MAKE_CONF_BUILD=${MAKEOBJDIRPREFIX}/make.conf.build 899 NANO_MAKE_CONF_INSTALL=${NANO_OBJ}/make.conf.install 900 901 # Override user's NANO_DRIVE if they specified a NANO_LABEL 902 [ -n "${NANO_LABEL}" ] && NANO_DRIVE="ufs/${NANO_LABEL}" || true 903 904 # Set a default NANO_TOOLS to NANO_SRC/NANO_TOOLS if it exists. 905 [ ! -d "${NANO_TOOLS}" ] && [ -d "${NANO_SRC}/${NANO_TOOLS}" ] && \ 906 NANO_TOOLS="${NANO_SRC}/${NANO_TOOLS}" || true 907 908 [ -n "${NANO_NOPRIV_BUILD}" ] && [ -z "${NANO_METALOG}" ] && \ 909 NANO_METALOG=${NANO_OBJ}/_.metalog || true 910 911 NANO_STARTTIME=`date +%s` 912 pprint 3 "Exporting NanoBSD variables" 913 export_var MAKEOBJDIRPREFIX 914 export_var NANO_ARCH 915 export_var NANO_CODESIZE 916 export_var NANO_CONFSIZE 917 export_var NANO_CUSTOMIZE 918 export_var NANO_DATASIZE 919 export_var NANO_DRIVE 920 export_var NANO_HEADS 921 export_var NANO_IMAGES 922 export_var NANO_IMGNAME 923 export_var NANO_IMG1NAME 924 export_var NANO_MAKE 925 export_var NANO_MAKE_CONF_BUILD 926 export_var NANO_MAKE_CONF_INSTALL 927 export_var NANO_MEDIASIZE 928 export_var NANO_NAME 929 export_var NANO_NEWFS 930 export_var NANO_OBJ 931 export_var NANO_PMAKE 932 export_var NANO_SECTS 933 export_var NANO_SRC 934 export_var NANO_TOOLS 935 export_var NANO_WORLDDIR 936 export_var NANO_BOOT0CFG 937 export_var NANO_BOOTLOADER 938 export_var NANO_LABEL 939 export_var NANO_MODULES 940 export_var NANO_NOPRIV_BUILD 941 export_var NANO_METALOG 942 export_var NANO_LOG 943 export_var SRCCONF 944 export_var SRC_ENV_CONF 945} 946