convert bootable freebsd iso to bootable flash image

Luigi Rizzo rizzo at iet.unipi.it
Fri Nov 14 05:25:25 PST 2008


Just in case people have a similar need, or can point me to better
code to do the same job:

i needed to convert a bootable FreeBSD iso image into a bootable
flash image, and have come up with the following code (derived
from PicoBSD). The nice part is that this is all done without
requiring root permissions -- the iso extraction is done with
bsdtar, the file system is created using makefs, and the
other patching is done with bsdlabel and dd.

Now i need to find something similar to convert a bootable
linux image and a bootable DOS image :)

	cheers
	luigi

----------- cut here --------------------------------

#!/bin/sh
# convert a FreeBSD iso to flash image
#
# based on picobsd tricks.
# requires makefs, bsdlabel, bsdtar, sed and dd

MAKEFS=makefs
MKLABEL=bsdlabel
BSDTAR=tar

make_freebsd_image() {  # tree imagefile
    local tree=$1
    local imagefile=$2
    local boot1=${tree}/boot/boot1
    local boot2=${tree}/boot/boot2

    echo "convert tree $tree image $img"
    ${MAKEFS} -t ffs -o bsize=4096 -o fsize=512 \
        -f 50 ${imagefile} ${tree}
    ${MKLABEL} -w -f ${imagefile} auto # write a label
    # copy partition c: into a: with some sed magic
    ${MKLABEL} -f ${imagefile} | sed -e '/  c:/{p;s/c:/a:/;}' | \
        ${MKLABEL} -R -f ${imagefile} /dev/stdin

    # dump the primary and secondary boot (primary is 512 bytes)
    dd if=${boot1} of=${imagefile} conv=notrunc 2>/dev/null
    # XXX secondary starts after the 0x114 = dec 276 bytes of the label
    # so we skip 276 from the source, and 276+512=788 from dst
    # the old style blocks used 512 and 1024 respectively
    dd if=${boot2} iseek=1 ibs=276 2> /dev/null | \
        dd of=${imagefile} oseek=1 obs=788 conv=notrunc 2>/dev/null
}

tree=$1
image=$2
if [ -f $1 ] ; then
    echo "Extract files from ${image}"
    tmp="${image}.tree"
    mkdir -p $tmp
    (cd $tmp && ${BSDTAR} xf $tree)
    tree=$tmp
fi
make_freebsd_image $tree $image
[ -d "$tmp" ] && (chmod -R +w $tmp && rm -rf $tmp)
#------ end of fil --------------------------------


More information about the freebsd-hackers mailing list