#! /bin/sh # # Description:: Install a complete dedibox system remotely after booting through mfsbsd # # Author:: Ollivier Robert # Copyright:: 2012 © by Ollivier Robert # # This script is under the BSD License with 2 clauses. # # $Id: dedi-install.txt,v 2af8d053b9c5 2013/08/29 15:38:59 roberto $ BASEFTP="ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/" pause() { read a } load_kernel_bits() { echo 'Going to fetch missing bits...' cd /tmp fetch ${BASEFTP}/9.1-RELEASE/kernel.txz tar xfj kernel.txz pause echo 'Loading modules cd boot/kernel kldload ./zlib.ko kldload ./crypto.ko kldload ./geom_eli.ko kldload ./aesni.ko kldload ./geom_mirror.ko kldstat } wipe_disks() { disk=$1 echo " Erasing boot blocks on da${disk}..." dd if=/dev/zero of=/dev/da$disk bs=512 count=10 } create_gpt() { disk=$1 echo " Creating GPT..." gpart create -s gpt da$disk } add_parts() { disk=$1 echo " Adding partitions on da${disk}..." gpart add -s 64K -a 4k -t freebsd-boot da$disk gpart add -s 2G -a 4k -t freebsd-zfs -l boot$disk da$disk gpart add -s 32G -a 4k -t freebsd-swap -l swap$disk da$disk gpart add -a 4k -t freebsd-zfs -l tank$disk da$disk } bootme() { disk=$1 echo " Adding bootcode on da${disk}..." gpart set -a bootme -i 2 da$disk gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da$disk } do_disk_part() { disk=$1 echo "Partitioning disk da$disk..." wipe_disks $disk create_gpt $disk add_parts $disk ls /dev/gpt pause bootme $disk gpart show } create_keys() { echo "Creating main GELI keys..." [ ! -d /root/keys] && mkdir /root/keys dd if=/dev/random of=/root/keys/boot.key bs=128k count=1 } do_geli() { echo "Create GELI partitions and attach on da${disk}..." geli init -b -K /root/keys/boot.key -s 4096 -l 256 /dev/gpt/tank$disk geli attach -k /root/keys/boot.key /dev/gpt/tank$disk } create_zpool() { echo "Creating zpools..." zpool create zboot mirror gpt/boot0 gpt/boot1 zpool create tank mirror gpt/tank0.eli gpt/tank1.eli zpool list pause } create_swap() { echo 'Creating mirrored swap...' gmirror label swap gpt/swap0 gpt/swap1 } set_checksum() { zfs set checksum=fletcher4 zboot zfs set checksum=fletcher4 tank } TBASE="/tank/root" create_fs() { compression=$1 zfs set compression=${compression} tank # / zfs create -o compression=off tank/root # /usr zfs create -o mountpoint=${TBASE}/usr tank/usr zfs create -o mountpoint=${TBASE}/usr/local tank/usr/local zfs create -o mountpoint=${TBASE}/usr/obj tank/usr/obj zfs create -o mountpoint=${TBASE}/usr/src tank/usr/src # /var zfs create -o mountpoint=${TBASE}/var tank/var zfs create -o exec=off -o setuid=off tank/var/empty zfs create -o exec=off -o setuid=off tank/var/named zfs create -o exec=off -o setuid=off tank/var/run zfs create -o mountpoint=${TBASE}/var/tmp tank/var/tmp zfs set exec=off tank/var/tmp zfs set setuid=off tank/var/tmp chmod 1777 ${TBASE}/var/tmp zfs create -o mountpoint=${TBASE}/tmp tank/tmp zfs set exec=off tank/tmp zfs set setuid=off tank/tmp chmod 1777 ${TBASE}/tmp # /home zfs create -o mountpoint=${TBASE}/home tank/home zfs create -o mountpoint=${TBASE}/home/staff tank/home/staff # OPTIONAL - /usr/ports zfs create -o mountpoint=${TBASE}/usr/ports -o setuid=off tank/usr/ports zfs create -o mountpoint=${TBASE}/usr/ports/distfiles -o compression=off -o exec=off -o setuid=off tank/usr/ports/distfiles zfs create -o mountpoint=${TBASE}/usr/ports/packages -o compression=off -o exec=off -o setuid=off tank/usr/ports/packages # special stuff zfs set reservation=512m tank } before_install() { load_kernel_bits pause do_disk_part 0 do_disk_part 1 create_keys do_geli 0 do_geli 1 create_zpool create_swap zpool list set_checksum create_fs 'lzjb' } BASEFTP="ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/" extract_dist() { dist=$1 cd /tmp for i in base doc games kernel lib32 src; do echo "Installing $i..." fetch ${BASEFTP}/${dist}/$i.txz xz -d -c $i.txz | tar -C ${TBASE}/ -xf - done } # Usage: dedi-install 9.1-RELEASE # # Will prepare the disks as planned then extract the named release. # do_install() { release=$1 before_install extract_dist $release }