1# $FreeBSD$ 2 3#- 4# Copyright (c) 2015 M. Warner Losh. 5# Copyright (c) 2010-2011 iXsystems, Inc. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL iXsystems, Inc OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28# 29# This file is heavily derived from both Sam Leffler's Avilia config, 30# as well as the BSDRP project's config file. Neither of these have 31# an explicit copyright/license statement, but are implicitly BSDL. This 32# example has been taken from the FreeNAS project (an early version) and 33# simplified to meet the needs of the example. 34# 35 36# NB: You want the other file as the command line arg :) 37 38# Missing in base: 39# o mkimg setting active partition 40# o mkimg starting at arbitrary offset (needed for A10, et al) 41# o mtools still needed because we have no makefs -t msdos 42# o nanobsd doesn't record changes to WORLDTEMP in customization 43# scripts yet, so we have kludge to pick up all files 44# o easy way for pkg to grab files from other repos and put that 45# data on the image 46# o Need to have some way to create / resize the s4 slice to do ping 47# pong bouncing between s3 and s4 for an arbitrary image. we can resize 48# one slice, not two 49# o hints in the uboot ports for how to create the image 50# 51# Missing here 52# o documentation for how to run the qemu images 53# o msdos mtools fallback 54# o special boot for !x86 !arm platforms 55# o qemu image for arm 56# o qemu image for aarch64 57# o qemu image for armv6/armv7 58# o easy support for different image / vm formats 59# o need to promote much of this to nanobsd.sh and friends 60# o uses old kludge to build image w/o ownership being right 61# for many files. Should move to mtree-dedup.awk. 62# o support for EFI images 63# o support for GPT partitioning 64# 65# Long Term 66# o common tooling for creating images for odd-ball platforms 67# o support for boot loaders other than uboot in the image 68# or via special instructions 69# o no pony support; sadly, you cannot have a pony 70# 71 72if [ -z $NANO_NAME ]; then 73 echo "NANO_NAME not defined. Use foo.cfg instead." 74fi 75 76NANO_SLICE_FAT_SIZE=32m 77NANO_SLICE_CFG_SIZE=32m 78 79NANO_BOOT2CFG="-h -S115200" 80 81NANO_RAM_ETCSIZE=8192 82NANO_RAM_TMPVARSIZE=8192 83NANO_IMAGES=2 84 85NANO_PMAKE="make -j $(sysctl -n hw.ncpu)" 86 87NANO_CFG_BASE=$(pwd) 88NANO_CFG_BASE=$(realpath ${NANO_CFG_BASE}/..) 89NANO_SRC=$(realpath ${NANO_CFG_BASE}/../../..) 90#### XXX share obj 91if [ -z ${NANO_CPUTYPE} ]; then 92 NANO_OBJ=${NANO_SRC}/../embedded/obj 93else 94 # Alas, I can't set OBJTREE to ${MACHINE}.${MACHINE_ARCH}.${CPUTYPE} 95 # so this will have to do until I can. 96 NANO_OBJ=${NANO_SRC}/../embedded/obj.${NANO_CPUTYPE} 97fi 98NANO_LOG=${NANO_OBJ}/../${NANO_NAME} 99NANO_DISKIMGDIR=${NANO_OBJ}/../images 100NANO_WORLDDIR=${NANO_LOG}/_.w 101NANO_INIT_IMG2=0 102NANO_NOPRIV_BUILD=t 103unset MAKEOBJDIRPREFIX 104 105mkdir -p ${NANO_OBJ} 106NANO_OBJ=$(realpath ${NANO_OBJ}) 107mkdir -p ${NANO_LOG} 108NANO_LOG=$(realpath ${NANO_LOG}) 109mkdir -p ${NANO_WORLDDIR} 110NANO_WORLDDIR=$(realpath ${NANO_WORLDDIR}) 111mkdir -p ${NANO_DISKIMGDIR} 112NANO_DISKIMGDIR=$(realpath ${NANO_DISKIMGDIR}) 113 114NANO_FAT_DIR=${NANO_LOG}/_.fat 115 116customize_cmd cust_allow_ssh_root 117 118add_etc_make_conf ( ) ( 119 touch ${NANO_WORLDDIR}/etc/make.conf 120) 121customize_cmd add_etc_make_conf 122 123cust_install_machine_files ( ) ( 124 echo "cd ${NANO_CFG_BASE}/Files" 125 cd ${NANO_CFG_BASE}/Files 126 find . -print | grep -Ev '/(CVS|\.svn|\.hg|\.git)' | cpio -dumpv ${NANO_WORLDDIR} 127) 128customize_cmd cust_install_files 129customize_cmd cust_install_machine_files 130 131# NB: leave c++ enabled so devd can be built 132CONF_BUILD=" 133LOCAL_XTOOL_DIRS=usr.bin/mkimg 134WITHOUT_ACPI=true 135WITHOUT_ATM=true 136WITHOUT_AUDIT=true 137WITHOUT_BIND_DNSSEC=true 138WITHOUT_BIND_ETC=true 139WITHOUT_BIND_LIBS_LWRES=true 140WITHOUT_BLUETOOTH=true 141WITHOUT_CALENDAR=true 142WITHOUT_CVS=true 143WITHOUT_DICT=true 144WITHOUT_EXAMPLES=true 145WITHOUT_FORTRAN=true 146WITHOUT_GAMES=true 147WITHOUT_GCOV=true 148WITHOUT_GPIB=true 149WITHOUT_HTML=true 150WITHOUT_I4B=true 151WITHOUT_IPFILTER=true 152WITHOUT_IPX=true 153WITHOUT_LIBKSE=true 154WITHOUT_LOCALES=true 155WITHOUT_LPR=true 156WITHOUT_MAN=true 157WITHOUT_NETCAT=true 158WITHOUT_NIS=true 159WITHOUT_NLS=true 160WITHOUT_NS_CACHING=true 161WITHOUT_OBJC=true 162WITHOUT_PROFILE=true 163WITHOUT_SENDMAIL=true 164WITHOUT_SHAREDOCS=true 165WITHOUT_SYSCONS=true 166WITHOUT_LIB32=true 167WITHOUT_TESTS=true 168WITHOUT_DEBUG_FILES=t 169WITHOUT_KERNEL_SYMBOLS=t 170" 171CONF_INSTALL="$CONF_BUILD 172INSTALL_NODEBUG=t 173NOPORTDOCS=t 174NO_INSTALL_MANPAGES=t 175" 176# The following would help... 177# WITHOUT_TOOLCHAIN=true can't build ports 178# WITHOUT_INSTALLLIB=true libgcc.a 179# 180# from the build 181# WITHOUT_INFO=true makeinfo 182# WITHOUT_RCS=true 183PKG_ONLY_MAKE_CONF=" 184WITHOUT_TOOLCHAIN=true 185WITHOUT_INSTALLLIB=true 186WITHOUT_INFO=true 187WITHOUT_RCS=true 188" 189 190NANO_PACKAGE_ONLY=1 191 192# Creates images for all the formats that use MBR / GPT 193# split later if the #ifdef soup gets too bad. 194create_diskimage_gpt ( ) ( 195 pprint 2 "build diskimage gpt ${NANO_NAME}" 196 197 create_diskimage_mbr $* 198) 199 200create_diskimage_mbr ( ) ( 201 202 local fmt 203 204 [ -z ${NANO_DISKIMAGE_FORMAT} ] || fmt=".${NANO_DISKIMAGE_FORMAT}" 205 206 pprint 2 "build diskimage ${NANO_NAME}" 207 pprint 3 "log: ${NANO_LOG}/_.di" 208 pprint 3 "image in: ${NANO_DISKIMGDIR}/_.disk.image.${NANO_NAME}${fmt}" 209 210 ( 211 local extra i sz fmt fmtarg bootmbr bootbsd skiparg 212 set -o xtrace 213 # Tell mtools not to be too picky 214 export MTOOLS_SKIP_CHECK=1 215 216 [ -z ${NANO_DISKIMAGE_FORMAT} ] || fmtarg="-f ${NANO_DISKIMAGE_FORMAT}" 217 [ -z ${NANO_DISKIMAGE_FORMAT} ] || fmt=".${NANO_DISKIMAGE_FORMAT}" 218 bootmbr=${NANO_BOOT_MBR:+-b ${NANO_BOOT_MBR}} 219 bootbsd=${NANO_BOOT_BSD:+-b ${NANO_BOOT_BSD}} 220 skiparg=${NANO_MBR_FIRST_SKIP:+-S ${NANO_MBR_FIRST_SKIP}} 221 222 for i in s1 s2 s3 s4 p1 p2 p3 p4 p5 empty; do 223 rm -fr ${NANO_LOG}/_.${i}* 224 done 225 226 # Populate the FAT partition, if needed 227 if [ -n "${NANO_SLICE_FAT}" ]; then 228 echo Creating MSDOS partition for kernel 229 newfs_msdos -C ${NANO_SLICE_FAT_SIZE} -F 16 -L ${NANO_NAME} \ 230 ${NANO_LOG}/_.${NANO_SLICE_FAT} 231 if [ -d ${NANO_FAT_DIR} ]; then 232 # Need to copy files from ${NANO_FATDIR} with mtools, or use 233 # makefs -t msdos once that's supported 234 mcopy -i ${NANO_LOG}/_.${NANO_SLICE_FAT} ${NANO_FAT_DIR}/* :: 235 fi 236 fi 237 238 # Populate the Powerpc boot image, if needed 239 if [ "${NANO_LAYOUT}" = powerpc64-ibm ]; then 240 dd if=${NANO_WORLDDIR}/boot/boot1.elf of=${NANO_LOG}/_.s1 bs=800k count=1 conv=sync 241 fi 242 243 # Populate the / partition, and place it into a slice with a 244 # bsd label 245 [ -z ${NANO_NOPRIV_BUILD} ] || extra="-F ${NANO_METALOG}" 246 sz=${NANO_SLICE_ROOT_SIZE:+-s ${NANO_SLICE_ROOT_SIZE}} 247 eval "${NANO_MAKEFS_UFS}" ${extra} $sz "${NANO_LOG}/_.${NANO_ROOT}" \ 248 "${NANO_WORLDDIR}" 249 case ${NANO_DISK_SCHEME} in 250 mbr) 251 mkimg -s bsd ${bootbsd} -p freebsd-ufs:=${NANO_LOG}/_.${NANO_ROOT} \ 252 -o ${NANO_LOG}/_.${NANO_SLICE_ROOT} 253 eval $NANO_SLICE_CFG=freebsd 254 eval $NANO_SLICE_ROOT=freebsd 255 ;; 256 gpt) 257 eval $NANO_SLICE_CFG=freebsd-ufs 258 eval $NANO_SLICE_ROOT=freebsd-ufs 259 ;; 260 esac 261 262 # Populate the /cfg partition, empty if none given 263 if [ -z "${NANO_CFGDIR}" ]; then 264 echo "Faking cfg dir, it's empty" 265 NANO_CFGDIR=${NANO_LOG}/_.empty 266 mkdir -p ${NANO_CFGDIR} 267 fi 268 # XXX -F cfg-mtree 269 eval "${NANO_MAKEFS_UFS}" -s ${NANO_SLICE_CFG_SIZE} \ 270 "${NANO_LOG}/_.${NANO_SLICE_CFG}" "${NANO_CFGDIR}" 271 272 # data slice not supported since we need the part for FAT for 273 # booting 274 275 # Now shuffle all the slices together into the proper layout 276 if [ -n "$NANO_SLICE_FAT" ]; then 277 eval $NANO_SLICE_FAT=fat16b 278 fi 279 280 out=${NANO_DISKIMGDIR}/_.disk.image.${NANO_NAME}${fmt} 281 # below depends on https://reviews.freebsd.org/D4403 not yet in the tree 282 # but there's problems: it marks all partitions as active, so you have to 283 # boot off partition 3 or 2 by hand if you're playing around with this WIP 284 case ${NANO_LAYOUT} in 285 std-embedded) 286 mkimg -a 3 ${skiparg} ${fmtarg} ${bootmbr} -s mbr -p ${s1}:=${NANO_LOG}/_.s1 \ 287 -p ${s2}:=${NANO_LOG}/_.s2 \ 288 -p ${s3}:=${NANO_LOG}/_.s3 \ 289 -o ${out} 290 ;; 291 std-x86) 292 # s3 is cfg, s1 is /, s2 is other / (s2 is created in first boot script) 293 mkimg -a 1 ${fmtarg} ${bootmbr} -s mbr -p ${s1}:=${NANO_LOG}/_.s1 \ 294 -p- \ 295 -p ${s3}:=${NANO_LOG}/_.s3 \ 296 -o ${out} 297 298 299 ;; 300 std-uefi) 301 # s1 is boot, s2 is cfg, s3 is /, not sure how to make that 302 # boot (marked as active) with mkimg yet 303 mkimg -a 2 ${fmtarg} ${bootmbr} -s mbr \ 304 -p efi:=${NANO_WORLDDIR}/boot/efiboot.img \ 305 -p ${s2}:=${NANO_LOG}/_.s2 \ 306 -p ${s3}:=${NANO_LOG}/_.s3 \ 307 -o ${out} 308 ;; 309 std-uefi-bios) 310 # p1 is boot for uefi, p2 is boot for gpt, p3 is cfg, p4 is / 311 # and p5 is alt-root (after resize) 312 mkimg -a 2 ${fmtarg} ${bootmbr} -s gpt \ 313 -p efi:=${NANO_WORLDDIR}/boot/efiboot.img \ 314 -p freebsd-boot:=${NAANO_WORLDDIR}/boot/gptboot \ 315 -p ${p3}:=${NANO_LOG}/_.p3 \ 316 -p ${p4}:=${NANO_LOG}/_.p4 \ 317 -o ${out} 318 ;; 319 powerpc64-ibm) 320 # A lie to make the boot loader work, it boots the first BSD partition 321 # it finds, regardless of the active flag. 322 s2=fat16b 323 # boot image is on a special partition, ala std-embedded, but that 324 # partition isn't FAT with special files, but a copy of the boot 325 # loader itself. 326 mkimg -a 1 ${fmtarg} -s mbr -p prepboot:=${NANO_LOG}/_.s1 \ 327 -p ${s2}:=${NANO_LOG}/_.s2 \ 328 -p ${s3}:=${NANO_LOG}/_.s3a \ 329 -o ${out} 330 ;; 331 esac 332 rm -f ${out}.xz 333 xz -9 --keep ${out} 334 ) > ${NANO_LOG}/_.di 2>&1 335) 336 337die( ) { 338 echo "$*" 339 exit 1 340} 341 342# Automatically include the packaging port here so it is always first so it 343# builds the port and adds the package so we can add other packages. 344#XXX Doesn't work for cross build, so punting until I can integreate qemu-static 345#XXX or poudriere, both of which require priv'd execution. Or qemu-system, 346#XXX which is super, super slow. 347#add_port ports-mgmt/pkg 348#add_port security/sudo 349#add_port ftp/curl 350 351rp=$(realpath ${NANO_OBJ}/) 352__a=`mount | grep ${rp} | awk '{print length($3), $3;}' | sort -rn | awk '{$1=""; print;}'` 353if [ -n "$__a" ]; then 354 echo "unmounting $__a" 355 umount $__a 356fi 357 358if [ "$DEBUG" = 1 ]; then 359 DEBUG_BUILD=" 360DEBUG_FLAGS= -g 361" 362else 363 DEBUG_INSTALL=" 364INSTALL_NODEBUG= t 365" 366fi 367 368CONF_INSTALL="$CONF_BUILD 369${DEBUG_BUILD} 370" 371CONF_INSTALL="$CONF_INSTALL 372${DEBUG_INSTALL} 373" 374 375if [ "${NANO_PACKAGE_ONLY}" -eq 1 ]; then 376 CONF_INSTALL="${CONF_INSTALL} 377${PKG_ONLY_MAKE_CONF} 378" 379 echo "Automatically building a thin image with packages" 380else 381 echo "Automatically building a * * F A T * * image so we can build ports" 382fi 383 384VARS="MASTER_SITE_BACKUP MASTER_SITE_OVERRIDE PACKAGEROOT PACKAGESITE" 385 386for var in $VARS; do 387 val=$(eval echo "\$$var") 388 if [ -n "$val" ]; then 389 CONF_INSTALL="${CONF_INSTALL} 390$var=$val" 391 fi 392done 393 394typical_embedded ( ) ( 395 # Need to create rc.conf before we copy over /etc to /conf/base/etc 396 # so now's a good time. 397 398 local rc=${NANO_WORLDDIR}/etc/rc.conf 399 400 echo "hostname=nanobsd-${NANO_NAME}" > $rc 401 echo "growfs_enable=YES" >> $rc 402 echo "growfs_type=nanobsd-pingpong" >> $rc 403 echo "ntpdate_enable=YES" >> $rc 404 echo "ifconfig_DEFAULT=DHCP" >> $rc 405 echo "ntpdate_hosts='0.freebsd.pool.ntp.org 1.freebsd.pool.ntp.org'" >> $rc 406 # Make sure that firstboot scripts run so growfs works. 407 # Note: still some issues remvoing this XXX 408 touch ${NANO_WORLDDIR}/firstboot 409) 410customize_cmd typical_embedded 411 412fix_pkg ( ) ( 413 chdir ${NANO_WORLDDIR} 414 mkdir -p pkg 415 mkdir -p pkg/db 416 mkdir -p pkg/cache 417 mkdir -p pkg/tmp # Needed for pkg bootstrap 418 mkdir -p usr/local/etc # Will get moved to local/etc 419 ( 420 echo 'PKG_DBDIR = "/pkg/db"' 421 echo 'PKG_CACHEDIR = "/pkg/cache"' 422 echo 'DEFAULT_ALWAYS_YES = "yes"' 423 echo 'ASSUME_ALWAYS_YES = "yes"' 424 ) >> usr/local/etc/pkg.conf 425 [ -z ${NANO_NOPRIV_BUILD} ] || ( 426 echo "./pkg type=dir uname=root gname=wheel mode=0755" 427 echo "./pkg/cache type=dir uname=root gname=wheel mode=0755" 428 echo "./pkg/db type=dir uname=root gname=wheel mode=0755" 429 echo "./pkg/tmp type=dir uname=root gname=wheel mode=0755" 430 ) >> ${NANO_METALOG} 431) 432customize_cmd fix_pkg 433 434save_build ( ) ( 435 VERSION_FILE=${NANO_WORLDDIR}/etc/version 436 if [ "${SVNREVISION}" = "${REVISION}" ]; then 437 echo "${NANO_NAME}" > "${VERSION_FILE}" 438 else 439 echo "${NANO_NAME} (${SVNREVISION})" > "${VERSION_FILE}" 440 fi 441) 442customize_cmd save_build 443 444shrink_md_fbsize ( ) ( 445 # We have a lot of little files on our memory disks. Let's decrease 446 # the block and frag size to fit more little files on them (this 447 # halves our space requirement by ~50% on /etc and /var on 8.x -- 448 # and gives us more back on 9.x as the default block and frag size 449 # are 4 times larger). 450 sed -i '' -e 's,-S -i 4096,-S -i 4096 -b 4096 -f 512,' \ 451 ${NANO_WORLDDIR}/etc/rc.initdiskless 452) 453customize_cmd shrink_md_fbsize 454 455customize_cmd cust_comconsole 456 457dos_boot_part ( ) ( 458 local d=/usr/local/share/u-boot/${NANO_BOOT_PKG} 459 local f=${NANO_FAT_DIR} 460 461 # For now, just copy all the files. However, for iMX6 and Allwinner, 462 # we'll need to put a special boot block at a fixed location 463 # on the disk as well. 464 rm -rf $f 465 mkdir $f 466 chdir $f 467 cp ${d}/* . 468 469 # Also copy ubldr. u-boot will load it and it will load the kernel 470 # from the ufs partition 471 cp ${NANO_WORLDDIR}/boot/ubldr . 472 cp ${NANO_WORLDDIR}/boot/ubldr.bin . 473 474 # We have to touch the saveenv file 475 touch uEnv.txt 476 477 # Now we need to copy over dtb files from the build. 478 cp ${NANO_WORLDDIR}/boot/dtb/*.dtb . 479) 480 481if [ -n "$NANO_BOOT_PKG" ]; then 482 d=/usr/local/share/u-boot/${NANO_BOOT_PKG} 483 if [ ! -d ${d} ]; then 484 echo ${NANO_BOOT_PKG} not installed. Sadly, it must be. 485 exit 1 486 fi 487 if [ ! -x /usr/local/bin/mcopy ]; then 488 echo mtools not installed. Sadly, we gotta have it. 489 exit 1 490 fi 491 customize_cmd dos_boot_part 492fi 493 494product_custom ( ) ( 495 # not quite ready to tweak these in nopriv build 496 if [ -z ${NANO_NOPRIV_BUILD} ]; then 497 # Last second tweaks -- generally not needed 498 chown -R root:wheel ${NANO_WORLDDIR}/root 499 chmod 0755 ${NANO_WORLDDIR}/root/* 500 chmod 0755 ${NANO_WORLDDIR}/* 501 chown -R root:wheel ${NANO_WORLDDIR}/etc 502 chown -R root:wheel ${NANO_WORLDDIR}/boot 503 chown root:wheel ${NANO_WORLDDIR}/ 504 chown root:wheel ${NANO_WORLDDIR}/usr 505 fi 506) 507late_customize_cmd product_custom 508 509# 510# Convenience routines to bring up many settings for standard environments 511# 512 513# 514# For each architecture, we have a standard set of settings to the extent 515# it makes sense. For architectures that don't have a standard environment 516# cfg files need to either define a lot of settings, provide their own disk 517# imaging, or set which of the variants we support. No subshells, since we 518# set global variables 519# 520 521std_aarch64 ( ) { 522} 523 524std_amd64 ( ) { 525 std_i386 526} 527 528std_arm ( ) { 529} 530 531std_armv6 ( ) { 532} 533 534std_armv7 ( ) { 535} 536 537std_i386 ( ) { 538 # Default values, if not overridden in .cfg file 539 : ${NANO_KERNEL:=GENERIC} 540 : ${NANO_DRIVE:=ada0} 541 : ${NANO_LAYOUT:=std-x86} 542 : ${NANO_BOOT_MBR:=${NANO_WORLDDIR}/boot/boot0sio} 543 : ${NANO_BOOT_BSD:=${NANO_WORLDDIR}/boot/boot} 544} 545 546std_mips ( ) { 547 NANO_ENDIAN=big 548} 549 550std_mipsel ( ) { 551} 552 553std_mips64 ( ) { 554 NANO_ENDIAN=big 555} 556 557std_mips64el ( ) { 558} 559 560std_powerpc ( ) { 561 NANO_ENDIAN=big 562} 563 564std_powerpc64 ( ) { 565 NANO_LAYOUT=powerpc64-ibm 566 NANO_ENDIAN=big 567} 568 569std_sparc64 ( ) { 570 NANO_ENDIAN=big 571} 572 573# 574# QEMU settings for the standard environments 575# 576qemu_env ( ) { 577 578 NANO_DISKIMAGE_FORMAT=qcow2 579} 580 581# other standard environments will go here 582 583eval std_${NANO_ARCH} 584 585# Slice 1: FAT for ROM loading bootstrap 586# Slice 2: Config partition 587# Slice 3: FreeBSD partition (sized exactly) 588# Slice 4: FreeBSD partition (empty) 589# on first boot, we resize slice 3 & 4 to be 1/2 of what's 590# left over on the SD card after slice 1 and 2 are taken 591# off the top. We also resize the 'a' partion on first boot 592# to the size of the partition for the ping/pong upgrade. 593# This feature needs support in the rc.d bootup script. 594# 595# Ideally, we'd not put BSD labels on the MBR disks. 596# However, we can't boot off raw MBR disks. First, 597# boot2 defaults to 'a' partition, and freaks out 598# unless you tell it to use 'c'. But even if we 599# hack that, then /boot/loader wants to load off 600# of 'c' partition. If you fix that, then we'll 601# try to mount root, but sanity checks prevent 602# slices from working. 603# 604 605: ${NANO_ENDIAN:=little} # make -V something to figure it out? 606: ${NANO_LAYOUT:=std-embedded} 607: ${NANO_MAKEFS_UFS:=makefs -t ffs -B ${NANO_ENDIAN}} 608: ${NANO_DISK_SCHEME:=mbr} # No others really supported ATM (well, gpt) 609case ${NANO_LAYOUT} in 610std-embedded) 611 NANO_SLICE_FAT=s1 612 NANO_SLICE_CFG=s2 613 NANO_SLICE_ROOT=s3 614 NANO_SLICE_ALTROOT=s4 615 NANO_ROOT=${NANO_SLICE_ROOT}a 616 NANO_ALTROOT=${NANO_SLICE_ALTROOT}a 617 ;; 618std-x86) 619 NANO_SLICE_CFG=s3 620 NANO_SLICE_ROOT=s1 621 NANO_SLICE_ALTROOT=s2 622 NANO_ROOT=${NANO_SLICE_ROOT}a 623 NANO_ALTROOT=${NANO_SLICE_ALTROOT}a 624 ;; 625powerpc64-ibm) 626 NANO_SLICE_PPCBOOT=s1 627 NANO_SLICE_CFG=s2 628 NANO_SLICE_ROOT=s3 629 NANO_SLICE_ALTROOT=s4 630 NANO_ROOT=${NANO_SLICE_ROOT}a 631 NANO_ALTROOT=${NANO_SLICE_ALTROOT}a 632 ;; 633powerpc64-apple) 634 echo Not yet 635 exit 1 636 ;; 637std-uefi) 638 NANO_SLICE_UEFI=s1 639 NANO_SLICE_CFG=s2 640 NANO_SLICE_ROOT=s3 641 NANO_SLICE_ALTROOT=s4 642 NANO_ROOT=${NANO_SLICE_ROOT} 643 NANO_ALTROOT=${NANO_SLICE_ALTROOT} 644 ;; 645std-uefi-bios) 646 NANO_DISK_SCHEME=gpt 647 NANO_SLICE_UEFI=p1 648 NANO_SLICE_BOOT=p2 649 NANO_SLICE_CFG=p3 650 NANO_SLICE_ROOT=p4 651 NANO_SLICE_ALTROOT=p5 652 NANO_ROOT=${NANO_SLICE_ROOT} 653 NANO_ALTROOT=${NANO_SLICE_ALTROOT} 654 ;; 655*) 656 echo Unknown Layout ${NANO_LAYOUT} 657 exit 1 658 ;; 659esac 660 661 662NANO_SLICE_DATA= # Not included 663 664# Each major disk scheme has its own routine. Generally 665# this is for mbr, gpt, etc. These are generally are widely 666# shared, but some specialized formats won't be shared. 667create_diskimage ( ) ( 668 eval create_diskimage_${NANO_DISK_SCHEME} 669) 670 671# Set the path to the same path we use for buldworld to use latest mkimg 672NANO_TARGET=$(cd ${NANO_SRC}; ${NANO_MAKE} TARGET_ARCH=${NANO_ARCH} -V _TARGET) 673NANO_TMPPATH=$(cd ${NANO_SRC}; ${NANO_MAKE} MK_AUTO_OBJ=no TARGET=${NANO_TARGET} TARGET_ARCH=${NANO_ARCH} -f Makefile.inc1 buildenv -V TMPPATH) 674export PATH="${NANO_TMPPATH}:${PATH}" 675