Index: tools/tools/nanobsd/defaults.sh =================================================================== --- tools/tools/nanobsd/defaults.sh +++ tools/tools/nanobsd/defaults.sh @@ -140,9 +140,12 @@ # Can be "file" or "swap" NANO_MD_BACKING="file" -# for swap type md(4) backing, write out the mbr only +# For swap type md(4) backing, write out the mbr only NANO_IMAGE_MBRONLY=true +# Partitioning scheme: MBR or GPT +NANO_PART_SCHEME=MBR + # Progress Print level PPLEVEL=3 @@ -419,7 +422,7 @@ echo "$NANO_RAM_TMPVARSIZE" > conf/base/var/md_size # pick up config files from the special partition - echo "mount -o ro /dev/${NANO_DRIVE}s3" > conf/default/etc/remount + echo "mount -o ro /dev/${NANO_DRIVE}${SLICE}3" > conf/default/etc/remount # Put /tmp on the /var ramdisk (could be symlink already) nano_rm -rf tmp @@ -443,8 +446,8 @@ # save config file for scripts echo "NANO_DRIVE=${NANO_DRIVE}" > etc/nanobsd.conf - echo "/dev/${NANO_DRIVE}s1a / ufs ro 1 1" > etc/fstab - echo "/dev/${NANO_DRIVE}s3 /cfg ufs rw,noauto 2 2" >> etc/fstab + echo "/dev/${NANO_DRIVE}${SYS1_SLICE} / ufs ro 1 1" > etc/fstab + echo "/dev/${NANO_DRIVE}${SLICE}3 /cfg ufs rw,noauto 2 2" >> etc/fstab mkdir -p cfg ) ) @@ -505,25 +508,37 @@ pprint 3 "log: ${NANO_OBJ}/_.di" ( - echo $NANO_MEDIASIZE $NANO_IMAGES \ + case $NANO_PART_SCHEME in + MBR) + unset GPART_LABEL + GPART_BOOTFL="active" + GPART_UFS="freebsd" + NANO_GPART_MEDIASIZE=${NANO_MEDIASIZE} + ;; + GPT) + GPART_LABEL="-l ${NANO_LABEL}" + GPART_BOOTFL="bootme" + GPART_UFS="freebsd-ufs" + NANO_GPART_MEDIASIZE=$((${NANO_MEDIASIZE} - 256)) + # Reserve 256 sectors for boot partition + ;; + esac + echo $NANO_GPART_MEDIASIZE $NANO_IMAGES \ $NANO_SECTS $NANO_HEADS \ $NANO_CODESIZE $NANO_CONFSIZE $NANO_DATASIZE | + awk ' { printf "# %s\n", $0 + print "create -s '$NANO_PART_SCHEME'" + # size of cylinder in sectors cs = $3 * $4 # number of full cylinders on media cyl = int ($1 / cs) - # output fdisk geometry spec, truncate cyls to 1023 - if (cyl <= 1023) - print "g c" cyl " h" $4 " s" $3 - else - print "g c" 1023 " h" $4 " s" $3 - if ($7 > 0) { # size of data partition in full cylinders dsl = int (($7 + cs - 1) / cs) @@ -542,36 +557,35 @@ } # First image partition start at second track - print "p 1 165 " $3, isl * cs - $3 + print "add -t ${GPART_UFS} -b " $3 " -s " isl * cs - $3 " -i 1 ${GPART_LABEL+${GPART_LABEL}${SLICE}1}" + print "set -i 1 -a ${GPART_BOOTFL}" c = isl * cs; # Second image partition (if any) also starts offset one # track to keep them identical. if ($2 > 1) { - print "p 2 165 " $3 + c, isl * cs - $3 + print "add -t ${GPART_UFS} -b " $3 + c " -s " isl * cs - $3 " -i 2 ${GPART_LABEL+${GPART_LABEL}${SLICE}2}" c += isl * cs; } # Config partition starts at cylinder boundary. - print "p 3 165 " c, csl * cs + print "add -t ${GPART_UFS} -b " c " -s " csl * cs " -i 3 ${GPART_LABEL+${GPART_LABEL}${SLICE}3}" c += csl * cs # Data partition (if any) starts at cylinder boundary. if ($7 > 0) { - print "p 4 165 " c, dsl * cs + print "add -t ${GPART_UFS} -b " c " -s " dsl * cs " -i 4 ${GPART_LABEL+${GPART_LABEL}${SLICE}4}" } else if ($7 < 0 && $1 > c) { - print "p 4 165 " c, $1 - c + print "add -t ${GPART_UFS} -b " c " -s " $1 - c " -i 4 ${GPART_LABEL+${GPART_LABEL}${SLICE}4}" } else if ($1 < c) { print "Disk space overcommitted by", \ c - $1, "sectors" > "/dev/stderr" exit 2 } - - # Force slice 1 to be marked active. This is necessary - # for booting the image from a USB device to work. - print "a 1" + print "commit!" + print "show!" } - ' > ${NANO_OBJ}/_.fdisk + ' | sed -e 's/^[^#]/gpart &/' -e 's/[^!]$/& -f x!/' -e 's/!$/ ${MD}/' > ${NANO_OBJ}/_.gpart IMG=${NANO_DISKIMGDIR}/${NANO_IMGNAME} MNT=${NANO_OBJ}/_.mnt @@ -590,23 +604,39 @@ trap "echo 'Running exit trap code' ; df -i ${MNT} ; nano_umount ${MNT} || true ; mdconfig -d -u $MD" 1 2 15 EXIT - fdisk -i -f ${NANO_OBJ}/_.fdisk ${MD} - fdisk ${MD} + (set -x; . ${NANO_OBJ}/_.gpart) # XXX: params # XXX: pick up cached boot* files, they may not be in image anymore. - if [ -f ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ]; then - boot0cfg -B -b ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ${NANO_BOOT0CFG} ${MD} - fi - if [ -f ${NANO_WORLDDIR}/boot/boot ]; then - bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}s1 - else - bsdlabel -w ${MD}s1 - fi - bsdlabel ${MD}s1 + + case $NANO_PART_SCHEME in + MBR) + # For MBR, we need to create a disklabel in the system slice to hold the + # boot blocks. + if [ -f ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ]; then + boot0cfg -B -b ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ${NANO_BOOT0CFG} ${MD} + fi + if [ -f ${NANO_WORLDDIR}/boot/boot ]; then + bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}s1 + else + bsdlabel -w ${MD}s1 + fi + bsdlabel ${MD}s1 + ;; + GPT) + # For GPT, no bsdlabel is required, since the boot blocks live in their + # own freebsd-boot partition, and in any case gptboot expects freebsd-ufs + # partitions to contain an UFS filesystem, *not* a bsdlabel. + gpart add -t freebsd-boot -s 256 -i 15 ${GPART_LABEL}boot -f x ${MD} + if [ -f ${NANO_WORLDDIR}/boot/pmbr -a -f ${NANO_WORLDDIR}/boot/gptboot ]; then + gpart bootcode -b ${NANO_WORLDDIR}/boot/pmbr -p ${NANO_WORLDDIR}/boot/gptboot -i 15 -f x ${MD} + fi + gpart commit ${MD} + ;; + esac # Create first image - populate_slice /dev/${MD}s1a ${NANO_WORLDDIR} ${MNT} "s1a" - mount /dev/${MD}s1a ${MNT} + populate_slice /dev/${MD}${SYS1_SLICE} ${NANO_WORLDDIR} ${MNT} "${SYS1_SLICE}" + mount /dev/${MD}${SYS1_SLICE} ${MNT} echo "Generating mtree..." ( cd ${MNT} && mtree -c ) > ${NANO_OBJ}/_.mtree ( cd ${MNT} && du -k ) > ${NANO_OBJ}/_.du @@ -615,26 +645,26 @@ if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then # Duplicate to second image (if present) echo "Duplicating to second image..." - dd conv=sparse if=/dev/${MD}s1 of=/dev/${MD}s2 bs=64k - mount /dev/${MD}s2a ${MNT} + dd conv=sparse if=/dev/${MD}${SLICE}1 of=/dev/${MD}${SLICE}2 bs=64k + mount /dev/${MD}${SYS2_SLICE} ${MNT} for f in ${MNT}/etc/fstab ${MNT}/conf/base/etc/fstab do - sed -i "" "s=${NANO_DRIVE}s1=${NANO_DRIVE}s2=g" $f + sed -i "" "s=${NANO_DRIVE}${SLICE}1=${NANO_DRIVE}${SLICE}2=g" $f done nano_umount ${MNT} # Override the label from the first partition so we # don't confuse glabel with duplicates. if [ ! -z ${NANO_LABEL} ]; then - tunefs -L ${NANO_LABEL}"s2a" /dev/${MD}s2a + tunefs -L ${NANO_LABEL}"${SYS2_SLICE}" /dev/${MD}${SYS2_SLICE} fi fi # Create Config slice - populate_cfg_slice /dev/${MD}s3 "${NANO_CFGDIR}" ${MNT} "s3" + populate_cfg_slice /dev/${MD}${SLICE}3 "${NANO_CFGDIR}" ${MNT} "${SLICE}3" # Create Data slice, if any. if [ $NANO_DATASIZE -ne 0 ] ; then - populate_data_slice /dev/${MD}s4 "${NANO_DATADIR}" ${MNT} "s4" + populate_data_slice /dev/${MD}${SLICE}4 "${NANO_DATADIR}" ${MNT} "${SLICE}4" fi if [ "${NANO_MD_BACKING}" = "swap" ] ; then @@ -652,7 +682,7 @@ if ${do_copyout_partition} ; then echo "Writing out _.disk.image..." - dd conv=sparse if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k + dd conv=sparse if=/dev/${MD}${SLICE}1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k fi mdconfig -d -u $MD @@ -948,6 +978,20 @@ # Override user's NANO_DRIVE if they specified a NANO_LABEL [ ! -z "${NANO_LABEL}" ] && NANO_DRIVE="ufs/${NANO_LABEL}" + # Set SLICE prefix character according to partitioning scheme + case ${NANO_PART_SCHEME} in + MBR) + SLICE=s + SYS1_SLICE=${SLICE}1a + SYS2_SLICE=${SLICE}2a + ;; + GPT) + SLICE=p + SYS1_SLICE=${SLICE}1 + SYS2_SLICE=${SLICE}2 + ;; + esac + # Set a default NANO_TOOLS to NANO_SRC/NANO_TOOLS if it exists. [ ! -d "${NANO_TOOLS}" ] && [ -d "${NANO_SRC}/${NANO_TOOLS}" ] && \ NANO_TOOLS="${NANO_SRC}/${NANO_TOOLS}"