mirror of
https://github.com/opnsense/src.git
synced 2026-02-21 00:40:33 -05:00
nanobsd: Use gpart and create code image before full disk image
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").
imp@ applied Patch by hand to new legacy.sh, plus tweaked for NANO_LOG vs
NANO_OBJ confusion in original.
PR: 186030
Reviewed by: imp@
Differential Revision: https://reviews.freebsd.org/D31102
This commit is contained in:
parent
ee37f64cf8
commit
587c054bea
3 changed files with 103 additions and 50 deletions
|
|
@ -161,6 +161,8 @@ NANO_SLICE_ROOT=s1
|
|||
NANO_SLICE_ALTROOT=s2
|
||||
NANO_SLICE_CFG=s3
|
||||
NANO_SLICE_DATA=s4
|
||||
NANO_PARTITION_ROOT=a
|
||||
NANO_PARTITION_ALTROOT=a
|
||||
NANO_ROOT=s1a
|
||||
NANO_ALTROOT=s2a
|
||||
|
||||
|
|
@ -853,7 +855,7 @@ usage ( ) {
|
|||
echo "Usage: $0 [-bfhiKknqvwX] [-c config_file]"
|
||||
echo " -b suppress builds (both kernel and world)"
|
||||
echo " -c specify config file"
|
||||
echo " -f suppress code slice extraction"
|
||||
echo " -f suppress code slice extraction (implies -i)"
|
||||
echo " -h print this help summary page"
|
||||
echo " -i suppress disk image build"
|
||||
echo " -K suppress installkernel"
|
||||
|
|
|
|||
|
|
@ -35,30 +35,18 @@
|
|||
# Functions and variable definitions used by the legacy nanobsd
|
||||
# image building system.
|
||||
|
||||
create_diskimage ( ) (
|
||||
pprint 2 "build diskimage"
|
||||
pprint 3 "log: ${NANO_LOG}/_.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)
|
||||
|
|
@ -69,44 +57,100 @@ create_diskimage ( ) (
|
|||
# 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_LOG}/_.fdisk
|
||||
' > ${NANO_LOG}/_.partitioning
|
||||
)
|
||||
|
||||
create_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_LOG}/_.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 ${MD}
|
||||
if [ -f ${NANO_WORLDDIR}/boot/boot ]; then
|
||||
echo "Making bootable partition"
|
||||
gpart bootcode -b ${NANO_WORLDDIR}/boot/boot ${MD}
|
||||
else
|
||||
echo "Partition will not be bootable"
|
||||
fi
|
||||
bsdlabel ${MD}
|
||||
|
||||
# Create first image
|
||||
populate_slice /dev/${MD}${NANO_PARTITION_ROOT} ${NANO_WORLDDIR} ${MNT} "${NANO_ROOT}"
|
||||
mount /dev/${MD}a ${MNT}
|
||||
echo "Generating mtree..."
|
||||
( cd ${MNT} && mtree -c ) > ${NANO_OBJ}/_.mtree
|
||||
( cd ${MNT} && du -k ) > ${NANO_OBJ}/_.du
|
||||
nano_umount ${MNT}
|
||||
|
||||
if [ "${NANO_MD_BACKING}" = "swap" ] ; then
|
||||
echo "Writing out _.disk.image..."
|
||||
dd conv=sparse 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_diskimage ( ) (
|
||||
pprint 2 "build diskimage"
|
||||
pprint 3 "log: ${NANO_OBJ}/_.di"
|
||||
|
||||
(
|
||||
|
||||
IMG=${NANO_DISKIMGDIR}/${NANO_IMGNAME}
|
||||
MNT=${NANO_OBJ}/_.mnt
|
||||
|
|
@ -123,29 +167,34 @@ create_diskimage ( ) (
|
|||
-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_LOG}/_.partitioning > ${NANO_OBJ}/_.gpart
|
||||
|
||||
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_LOG}/_.fdisk ${MD}
|
||||
fdisk ${MD}
|
||||
sh ${NANO_OBJ}/_.gpart ${MD}
|
||||
gpart show ${MD}
|
||||
# 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}
|
||||
gpart bootcode -b ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ${NANO_BOOTFLAGS} ${MD}
|
||||
fi
|
||||
if [ -f ${NANO_WORLDDIR}/boot/boot ]; then
|
||||
bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}${NANO_SLICE_ROOT}
|
||||
else
|
||||
bsdlabel -w ${MD}${NANO_SLICE_ROOT}
|
||||
fi
|
||||
bsdlabel ${MD}${NANO_SLICE_ROOT}
|
||||
|
||||
# Create first image
|
||||
populate_slice /dev/${MD}${NANO_ROOT} ${NANO_WORLDDIR} ${MNT} "${NANO_ROOT}"
|
||||
mount /dev/${MD}${NANO_ROOT} ${MNT}
|
||||
echo "Generating mtree..."
|
||||
( cd "${MNT}" && mtree -c ) > ${NANO_LOG}/_.mtree
|
||||
( cd "${MNT}" && du -k ) > ${NANO_LOG}/_.du
|
||||
nano_umount "${MNT}"
|
||||
echo "Writing code image..."
|
||||
dd conv=sparse if=${NANO_DISKIMGDIR}/_.disk.image of=/dev/${MD}${NANO_SLICE_ROOT} bs=64k
|
||||
|
||||
if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
|
||||
# Duplicate to second image (if present)
|
||||
|
|
@ -190,11 +239,6 @@ create_diskimage ( ) (
|
|||
dd conv=sparse if=/dev/${MD} of=${IMG} bs=64k
|
||||
fi
|
||||
|
||||
if ${do_copyout_partition} ; then
|
||||
echo "Writing out ${NANO_IMG1NAME}..."
|
||||
dd conv=sparse if=/dev/${MD}${NANO_SLICE_ROOT} \
|
||||
of=${NANO_DISKIMGDIR}/${NANO_IMG1NAME} bs=64k
|
||||
fi
|
||||
mdconfig -d -u $MD
|
||||
|
||||
trap - 1 2 15 EXIT
|
||||
|
|
|
|||
|
|
@ -40,9 +40,9 @@ do_clean=true
|
|||
do_kernel=true
|
||||
do_installkernel=true
|
||||
do_world=true
|
||||
do_code=true
|
||||
do_installworld=true
|
||||
do_image=true
|
||||
do_copyout_partition=true
|
||||
do_native_xtools=false
|
||||
do_prep_image=true
|
||||
|
||||
|
|
@ -94,7 +94,8 @@ do
|
|||
shift
|
||||
;;
|
||||
-f)
|
||||
do_copyout_partition=false
|
||||
do_code=false
|
||||
do_image=false
|
||||
shift
|
||||
;;
|
||||
-h)
|
||||
|
|
@ -215,10 +216,16 @@ if $do_prep_image ; then
|
|||
else
|
||||
pprint 2 "Skipping image prep (as instructed)"
|
||||
fi
|
||||
if $do_image ; then
|
||||
create_diskimage
|
||||
if $do_code ; then
|
||||
calculate_partitioning
|
||||
create_code_slice
|
||||
if $do_image ; then
|
||||
create_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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue