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