#!/bin/sh
#
# HOWTO/script to create a USB mounted bootable "root" install for
# bootstrapping a root-on-ZFS and the like.
#
# -- Yarema
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
program=`basename $0`
if [ -f "$0.rc" ];then
. "$0.rc"
fi
: ${RELEASE:="8.0-RELEASE"}
: ${DESTDIR:="/media"}
if [ $# -lt 2 ]; then
echo "Usage: ${program} "
echo " where is the path to the distribution"
echo " files, usually an .iso mounted on /dist"
echo " and is usually da0"
exit 1
fi
dist="$1"
vdev="$2"
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
ask() {
local question default answer
question=$1
default=$2
read -p "${question} [${default}]? " answer
if [ -z "${answer}" ]; then
answer=${default}
fi
echo ${answer}
}
yesno() {
local question default answer
question=$1
default=$2
while :; do
answer=$(ask "${question}" "${default}")
case "${answer}" in
[Yy]*) return 0;;
[Nn]*) return 1;;
esac
echo "Please answer yes or no."
done
}
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
if yesno "Create one slice covering the entire ${vdev}" n; then
dd if=/dev/zero of=/dev/${vdev} bs=512 count=79
fdisk -BIv /dev/${vdev}
else
exit 1
fi
if yesno "Initialize the BSD label" y; then
bsdlabel -wB /dev/${vdev}s1
fi
bsdlabel /dev/${vdev}s1
while yesno "(Re)Edit the BSD label" n; do
bsdlabel -e /dev/${vdev}s1
bsdlabel /dev/${vdev}s1
done
newfs -U /dev/${vdev}s1a
[ -d ${DESTDIR} ] || mkdir -p ${DESTDIR}
mount /dev/${vdev}s1a ${DESTDIR}
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
: ${dists:="base games manpages info dict"}
for i in ${dists}; do
echo " Extracting the ${i} distribution into ${DESTDIR}..."
cat ${dist}/${RELEASE}/${i}/${i}.?? | tar --unlink -xpzf - -C ${DESTDIR}
done
echo " Extracting the GENERIC kernel into ${DESTDIR}/boot/"
cat ${dist}/${RELEASE}/kernels/generic.?? | tar --unlink -xpzf - -C ${DESTDIR}/boot && ln -f ${DESTDIR}/boot/GENERIC/* ${DESTDIR}/boot/kernel/
echo " Copying ${dist}/${RELEASE}/ to ${DESTDIR}..."
tar cf - ${dist}/${RELEASE}/* | tar --unlink -xpf - -C ${DESTDIR}
# Mounting /var on tmpfs will work for both tmp directories
# by creating a softlink from /tmp to /var/tmp
rm -rf ${DESTDIR}/tmp
ln -sf var/tmp ${DESTDIR}/tmp
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
if [ -f $0.local ];then
. $0.local
fi
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
echo "nullfs_load=\"YES\" # Null filesystem" >> ${DESTDIR}/boot/loader.conf.local
echo "zfs_load=\"YES\" # ZFS" >> ${DESTDIR}/boot/loader.conf.local
echo "geom_eli_load=\"YES\" # Disk encryption driver (see geli(8))" >> ${DESTDIR}/boot/loader.conf.local
echo "geom_mirror_load=\"YES\" # RAID1 disk driver (see gmirror(8))" >> ${DESTDIR}/boot/loader.conf.local
${EDITOR:-"vi"} ${DESTDIR}/boot/loader.conf.local
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
echo "# Device Mountpoint FStype Options Dump Pass#" > ${DESTDIR}/etc/fstab
echo "/dev/${vdev}s1a / ufs rw,noatime 0 0" >> ${DESTDIR}/etc/fstab
echo "tmpfs /var tmpfs rw,nosuid 0 0" >> ${DESTDIR}/etc/fstab
echo "proc /proc procfs rw 0 0" >> ${DESTDIR}/etc/fstab
echo "# Device Mountpoint FStype Options Dump Pass#" >> ${DESTDIR}/etc/fstab
echo "/dev/acd0 /cdrom cd9660 ro,nodev,noauto,nosuid 0 0" >> ${DESTDIR}/etc/fstab
echo "/dev/fd0 /media/fd ufs rw,nodev,noauto,nosuid 0 0" >> ${DESTDIR}/etc/fstab
echo "/dev/fd0 /media/floppy msdosfs rw,nodev,noauto,nosuid 0 0" >> ${DESTDIR}/etc/fstab
${EDITOR:-"vi"} ${DESTDIR}/etc/fstab
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
umount /dev/${vdev}s1a
#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#===#
# EOF