FiveFeet

How to put a FreeBSD installation ISO onto a USB Flash Drive

Assumes USB drive uses device da0, which is usually the case. Modify device names as needed. Unless special permissions have been set up, the commands usually need to be run as root.

./fbsd-install-iso2img.sh ./7.2-RELEASE-i386-bootonly.iso ./7.2-RELEASE-i386-bootonly.img
Use fbsd-install-iso2img.sh scriptto convert the ISO into an appropriate disk image. (Paths assume script and all files are in the current directory; modify paths as appropriate.)

NOTE THAT MEMORYSTICK IMAGES ARE NOW AVAILABLE FOR FREEBSD STARTING WITH VERSION 8, SO THE ISO-TO-IMG CONVERSION STEP ABOVE IS NOT NEEDED. Just download and use the memorystick image with the steps below.

 

fdisk -BI /dev/da0
Create a bootable BSD slice on the USB flash drive, using the entire disk. THIS DESTROYS ALL DATA ON THE FLASH DRIVE! (Ignore the "Geom not found" warning.)

 

bsdlabel -B -w da0s1
Put a BSD label on the flash drive and copy bootstrap code to it.

 

newfs -U -L FreeBSDboot /dev/da0s1a
Create a FreeBSD file system on the flash drive.

 

dd if=7.2-RELEASE-i386-bootonly.img of=/dev/da0 bs=10240 conv=sync
Copy the image file to the USB flash drive.

 


File fbsd-install-iso2img.sh

#!/bin/sh

# You can set some variables here. Edit them to fit your needs.

# Set serial variable to 0 if you don't want serial console at all,
# 1 if you want comconsole and 2 if you want comconsole and vidconsole
serial=0

set -u

if [ $# -lt 2 ]; then
    echo "Usage: $0 source-iso-path output-img-path"
    exit 1
fi

isoimage=$1; shift
imgoutfile=$1; shift

export tmpdir=$(mktemp -d -t fbsdmount)
# Temp file and directory to be used later
export tmpfile=$(mktemp -t bsdmount)

export isodev=$(mdconfig -a -t vnode -f ${isoimage})

echo "#### Building bootable UFS image ####"

ISOSIZE=$(du -k ${isoimage} | awk '{print $1}')
SECTS=$((($ISOSIZE + ($ISOSIZE/5))*2))

# Root partition size

echo "Initializing image..."
dd if=/dev/zero of=${imgoutfile} count=${SECTS}
ls -l ${imgoutfile}
export imgdev=$(mdconfig -a -t vnode -f ${imgoutfile})

bsdlabel -w -B ${imgdev}
newfs -O1 /dev/${imgdev}a

mkdir -p ${tmpdir}/iso ${tmpdir}/img

mount -t cd9660 /dev/${isodev} ${tmpdir}/iso
mount /dev/${imgdev}a ${tmpdir}/img

echo "Copying files to the image..."
( cd ${tmpdir}/iso && find . -print -depth | cpio -dump ${tmpdir}/img )
#bzcat ${tmpdir}/iso/dist/root.dist.bz2 | mtree -PUr -p ${tmpdir}/img 2>&1 > /dev/null

#echo "/dev/ufs/${UFS_LABEL} / ufs ro 1 1" > ${tmpdir}/img/etc/fstab

if [ ${serial} -eq 2 ]; then
        echo "-D" > ${tmpdir}/img/boot.config
        echo 'console="comconsole, vidconsole"' >> ${tmpdir}/img/boot/loader.conf
elif [ ${serial} -eq 1 ]; then
        echo "-h" > ${tmpdir}/img/boot.config
        echo 'console="comconsole"' >> ${tmpdir}/img/boot/loader.conf
fi

cleanup() {
    umount ${tmpdir}/iso
    mdconfig -d -u ${isodev}
    umount ${tmpdir}/img
    mdconfig -d -u ${imgdev}
    rm -rf ${tmpdir} ${tmpfile}
}

cleanup

ls -lh ${imgoutfile}


Source