>Number:         186030
>Category:       misc
>Synopsis:       [nanobsd] [patch] Use gpart instead of fdisk, and create code 
>image before full disk image
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jan 23 11:20:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Arrigo Marchiori
>Release:        9-STABLE
>Organization:
>Environment:
FreeBSD myhost 9.2-STABLE FreeBSD 9.2-STABLE #58 r260903: Mon Jan 20 09:13:51 
CET 2014     root@myhost:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
The attached patch brings two main changes to the nanobsd script:

 1- gpart is used instead of fdisk;

 2- the code image is created first, and then used to ``assemble'' the full 
disk image.

The patch was first proposed on the freebsd-embedded list:
http://lists.freebsd.org/pipermail/freebsd-embedded/2012-June/001580.html
and is currently under discussion:
http://lists.freebsd.org/pipermail/freebsd-embedded/2014-January/002216.html

Another effect is that the -f option ("suppress code slice extraction") now 
imples the -i option ("suppress disk image build").
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- nanobsd.sh.originale        2012-04-10 12:41:31.000000000 +0200
+++ nanobsd.sh  2012-06-12 16:52:04.000000000 +0200
@@ -431,30 +431,18 @@
        populate_slice "$1" "$2" "$3" "$4"
 )
 
-create_i386_diskimage ( ) (
-       pprint 2 "build diskimage"
-       pprint 3 "log: ${NANO_OBJ}/_.di"
-
-       (
+calculate_partitioning ( ) (
        echo $NANO_MEDIASIZE $NANO_IMAGES \
                $NANO_SECTS $NANO_HEADS \
                $NANO_CODESIZE $NANO_CONFSIZE $NANO_DATASIZE |
        awk '
        {
-               printf "# %s\n", $0
-
                # 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)
@@ -465,45 +453,94 @@
                # size of config partition in full cylinders
                csl = int (($6 + cs - 1) / cs)
 
+               # size of image partition(s) in full cylinders
                if ($5 == 0) {
-                       # size of image partition(s) in full cylinders
                        isl = int ((cyl - dsl - csl) / $2)
                } else {
                        isl = int (($5 + cs - 1) / cs)
                }
 
                # First image partition start at second track
-               print "p 1 165 " $3, isl * cs - $3
+               print $3, isl * cs - $3
                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 $3 + c, isl * cs - $3
                        c += isl * cs;
                }
 
                # Config partition starts at cylinder boundary.
-               print "p 3 165 " c, csl * cs
+               print c, csl * cs
                c += csl * cs
 
                # Data partition (if any) starts at cylinder boundary.
                if ($7 > 0) {
-                       print "p 4 165 " c, dsl * cs
+                       print c, dsl * cs
                } else if ($7 < 0 && $1 > c) {
-                       print "p 4 165 " c, $1 - c
+                       print c, $1 - c
                } 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"
        }
-       ' > ${NANO_OBJ}/_.fdisk
+       ' > ${NANO_OBJ}/_.partitioning
+
+)
+
+create_i386_code_slice ( ) (
+       pprint 2 "build code slice"
+       pprint 3 "log: ${NANO_OBJ}/_.cs"
+
+       (
+       IMG=${NANO_DISKIMGDIR}/_.disk.image
+       MNT=${NANO_OBJ}/_.mnt
+       mkdir -p ${MNT}
+       CODE_SIZE=`head -n 1 ${NANO_OBJ}/_.partitioning | awk '{ print $2 }'`
+
+       if [ "${NANO_MD_BACKING}" = "swap" ] ; then
+               MD=`mdconfig -a -t swap -s ${CODE_SIZE} -x ${NANO_SECTS} \
+                       -y ${NANO_HEADS}`
+       else
+               echo "Creating md backing file..."
+               rm -f ${IMG}
+               dd if=/dev/zero of=${IMG} seek=${CODE_SIZE} count=0
+               MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} \
+                       -y ${NANO_HEADS}`
+       fi
+
+       trap "echo 'Running exit trap code' ; df -i ${MNT} ; umount ${MNT} || 
true ; mdconfig -d -u $MD" 1 2 15 EXIT
+
+       bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}
+       bsdlabel ${MD}
+
+       # Create first image
+       populate_slice /dev/${MD}a ${NANO_WORLDDIR} ${MNT} "s1a"
+       mount /dev/${MD}a ${MNT}
+       echo "Generating mtree..."
+       ( cd ${MNT} && mtree -c ) > ${NANO_OBJ}/_.mtree
+       ( cd ${MNT} && du -k ) > ${NANO_OBJ}/_.du
+       umount ${MNT}
 
+       if [ "${NANO_MD_BACKING}" = "swap" ] ; then
+               echo "Writing out _.disk.image..."
+               dd if=/dev/${MD} of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
+       fi
+       mdconfig -d -u $MD
+
+       trap - 1 2 15 EXIT
+
+       ) > ${NANO_OBJ}/_.cs 2>&1
+)
+
+
+create_i386_diskimage ( ) (
+       pprint 2 "build diskimage"
+       pprint 3 "log: ${NANO_OBJ}/_.di"
+
+       (
        IMG=${NANO_DISKIMGDIR}/${NANO_IMGNAME}
        MNT=${NANO_OBJ}/_.mnt
        mkdir -p ${MNT}
@@ -519,9 +556,26 @@
                        -y ${NANO_HEADS}`
        fi
 
+       awk '
+       BEGIN {
+               # Create MBR partition table
+               print "gpart create -s mbr $1"
+       }
+       {
+               # Make partition
+               print "gpart add -t freebsd -b ", $1, " -s ", $2, " $1"
+       }
+       END {
+               # Force slice 1 to be marked active. This is necessary
+               # for booting the image from a USB device to work.
+               print "gpart set -a active -i 1 $1"
+       }
+       ' ${NANO_OBJ}/_.partitioning > ${NANO_OBJ}/_.gpart
+
        trap "echo 'Running exit trap code' ; df -i ${MNT} ; umount ${MNT} || 
true ; mdconfig -d -u $MD" 1 2 15 EXIT
 
-       fdisk -i -f ${NANO_OBJ}/_.fdisk ${MD}
+       sh ${NANO_OBJ}/_.gpart ${MD}
+       gpart show ${MD}
        fdisk ${MD}
        # XXX: params
        # XXX: pick up cached boot* files, they may not be in image anymore.
@@ -529,13 +583,8 @@
        bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}s1
        bsdlabel ${MD}s1
 
-       # Create first image
-       populate_slice /dev/${MD}s1a ${NANO_WORLDDIR} ${MNT} "s1a"
-       mount /dev/${MD}s1a ${MNT}
-       echo "Generating mtree..."
-       ( cd ${MNT} && mtree -c ) > ${NANO_OBJ}/_.mtree
-       ( cd ${MNT} && du -k ) > ${NANO_OBJ}/_.du
-       umount ${MNT}
+       echo "Writing code image..."
+       dd if=${NANO_DISKIMGDIR}/_.disk.image of=/dev/${MD}s1 bs=64k
 
        if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
                # Duplicate to second image (if present)
@@ -567,10 +616,6 @@
                dd if=/dev/${MD} of=${IMG} bs=64k
        fi
 
-       if ${do_copyout_partition} ; then
-               echo "Writing out _.disk.image..."
-               dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
-       fi
        mdconfig -d -u $MD
 
        trap - 1 2 15 EXIT
@@ -578,6 +623,11 @@
        ) > ${NANO_OBJ}/_.di 2>&1
 )
 
+# i386 and amd64 are identical for code partitions
+create_amd64_code_slice ( ) (
+       create_i386_code_slice
+)
+
 # i386 and amd64 are identical for disk images
 create_amd64_diskimage ( ) (
        create_i386_diskimage
@@ -768,7 +818,7 @@
        (
        echo "Usage: $0 [-bfiknqvw] [-c config_file]"
        echo "  -b      suppress builds (both kernel and world)"
-       echo "  -f      suppress code slice extraction"
+       echo "  -f      suppress code slice extraction (implies -i)"
        echo "  -i      suppress disk image build"
        echo "  -k      suppress buildkernel"
        echo "  -n      add -DNO_CLEAN to buildworld, buildkernel, etc"
@@ -786,8 +836,8 @@
 do_clean=true
 do_kernel=true
 do_world=true
+do_code=true
 do_image=true
-do_copyout_partition=true
 
 set +e
 args=`getopt bc:fhiknqvw $*`
@@ -817,7 +867,8 @@
                shift
                ;;
        -f)
-               do_copyout_partition=false
+               do_code=false
+               do_image=false
                shift
                ;;
        -h)
@@ -952,10 +1003,16 @@
 setup_nanobsd
 prune_usr
 run_late_customize
-if $do_image ; then
-       create_${NANO_ARCH}_diskimage
+if $do_code ; then
+       calculate_partitioning
+       create_${NANO_ARCH}_code_slice
+       if $do_image ; then
+               create_${NANO_ARCH}_diskimage
+       else
+               pprint 2 "Skipping image build (as instructed)"
+       fi
 else
-       pprint 2 "Skipping image build (as instructed)"
+       pprint 2 "Skipping code and image build (as instructed)"
 fi
 last_orders
 


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to