misc/186030: [nanobsd] [patch] Use gpart instead of fdisk, and create code image before full disk image
Arrigo Marchiori
ardovm at yahoo.it
Thu Jan 23 11:20:00 UTC 2014
>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 at 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:
More information about the freebsd-bugs
mailing list