set -x
set -e
# the disk
geom0=ada0
# installation files be here:
bsd=/usr/freebsd-dist
if [ "$(uname -s)" != "FreeBSD" ] ; then
echo "Only works on FreeBSD, Sorry." >&2
exit 1
fi
if [ ! -d $bsd ] ; then
set +x
rdir="$(uname -m)/$(uname -r |sed 's/-.*/-RELEASE/')"
echo "FreeBSD installation files missing..."
echo ""
echo "Enter to fetch, ^c to abort"
read cont
(
mkdir $bsd
cd $bsd
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/$rdir/base.txz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/$rdir/lib32.txz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/$rdir/kernel.txz
)
set -x
fi
if [ ! -f $bsd/base.txz ] ; then
set +x
echo "Can't find FreeBSD installation files in $bsd" >&2
exit 1
fi
bin=$(dirname $0)
[ "$bin" == "." ] && bin=$(pwd) || true
base=/mnt
ufsdir=/xboot
gpart destroy -F $geom0 || true
gpart create -s gpt $geom0
gpart add -b 64 -s 512k -t freebsd-boot $geom0
gpart add -l boot -s 1G -t freebsd-ufs -a 4k $geom0 # 512M is absolute minimum, the kernel is so large.
gpart add -l swap -s 2G -t freebsd-swap -a 4k $geom0
gpart add -l zroot -t freebsd-zfs -a 4k $geom0
geli onetime -d -e AES-XTS -l 256 -s 4096 /dev/gpt/swap
set +x
echo -n Password:
stty -echo
read pw
stty echo
echo $pw > /tmp/pw
echo ""
set -x
geli init -s 4096 -J /tmp/pw /dev/gpt/zroot
geli attach -j /tmp/pw /dev/gpt/zroot
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 $geom0
newfs -U /dev/gpt/boot
pool=tank
zpool create -f -m none -o altroot=$base -o cachefile=/tmp/zpool.cache $pool /dev/gpt/zroot.eli
root=$pool/root
zfs create -o mountpoint=/ $root
zfs create $root/usr
zfs create -o compression=lzjb -o setuid=off $root/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off $root/usr/ports/distfiles
zfs create -o compression=off -o exec=off -o setuid=off $root/usr/ports/packages
zfs create -o compression=lzjb -o exec=off -o setuid=off $root/usr/src
zfs create $root/home
zfs create $root/var
zfs create -o compression=lzjb -o exec=off -o setuid=off $root/var/crash
zfs create -o exec=off -o setuid=off $root/var/db
zfs create -o compression=lzjb -o exec=on -o setuid=off $root/var/db/pkg
zfs create -o exec=off -o setuid=off $root/var/empty
zfs create -o compression=lzjb -o exec=off -o setuid=off $root/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off $root/var/mail
zfs create -o exec=off -o setuid=off $root/var/run
zfs create -o compression=lzjb -o exec=on -o setuid=off $root/var/tmp
tar --unlink -xpJf $bsd/base.txz -C $base
tar --unlink -xpJf $bsd/lib32.txz -C $base
zfs set readonly=on $root/var/empty
if=$(ifconfig -ul ether |awk '{print $1}')
ip=$(ifconfig -f inet:cidr $if inet|awk '/inet/{print $2;exit}')
router=$(netstat -nrf inet|awk '/default/{print $2}')
name=$(hostname)
[ -z "$name" ] && name="setup"
cat << EOM >> $base/etc/rc.conf
# minimal rc.conf
# please set hostname and ip configuration
#
hostname="$name"
ifconfig_$if="$ip"
defaultrouter="$router"
# OR
#ifconfig_$if="DHCP"
zfs_enable="YES"
sshd_enable="YES"
sendmail_enable="NONE"
# existing rc.conf for reference:
EOM
[ -f /etc/rc.conf ] && cat /etc/rc.conf|sed 's/^/#/' >> $base/etc/rc.conf
zpool export $pool
zpool import -o altroot=$base -o cachefile=/tmp/zpool.cache $pool
cp /tmp/zpool.cache $base/boot/zfs/
[ ! -d $base$ufsdir ] && mkdir $base$ufsdir
mount /dev/gpt/boot $base$ufsdir
cp -pRP $base/boot $base$ufsdir
rm -rf $base/boot
ln -s ${ufsdir#/}/boot $base/boot
chflags -h sunlink $base/boot
tar -xpPJf $bsd/kernel.txz -C $base
echo /dev/gpt/boot $ufsdir ufs rw 1 1 >> /mnt/etc/fstab
echo /dev/gpt/swap.eli none swap sw 0 0 >> /mnt/etc/fstab
# If we used ssh, keep the keys
cp /etc/ssh/ssh_host* $base/etc/ssh/ || true
rpw=`grep '^root:[^*]' /etc/master.passwd`
if [ ! -z "$rpw" ] ; then
sed -i '' '/^root:/i\
'"$rpw"'
/^root:/d' $base/etc/master.passwd
pwd_mkdb -p -d $base/etc $base/etc/master.passwd
else
chroot $base passwd root
fi
sed -i '' -e 's/^#\(PermitRootLogin\).*/\1 yes/' $base/etc/ssh/sshd_config
ee $base/etc/rc.conf
echo 'geom_eli_load="YES"' >> $base/boot/loader.conf
echo 'zfs_load="YES"' >> $base/boot/loader.conf
echo vfs.root.mountfrom=\"ufs:/dev/gpt/boot\" >> $base/boot/loader.conf
export ufsdir pool
sh PREBOOT setup $base$ufsdir $base
[ -f bin/dropbear ] && cp bin/dropbear $base$ufsdir/sbin/
[ -d $base$ufsdir/root/.ssh ] || mkdir $base$ufsdir/root/.ssh
[ -f .ssh/authorized_keys ] && cp .ssh/authorized_keys $base$ufsdir/root/.ssh/
echo "All ok"