===== Acknowledgements ===== This tutorial is mainly based on the great & exhaustive work of Nicole Reid - http://cooltrainer.org/projects/freebsd-kirkwood/ and the patch and script for embedding a geli master key directly into the %%FreeBSD%% Kernel provided by Olivier Houchard %%<%%cognet@%%FreeBSD%%.org> (cognet@ at IRC) . Special thanks also go out to the folks at #bsdmips chatroom @efnet.xs4all.nl and ##freebsd @freenode.net. ===== What we will have ===== An USB-Stick with two partitions: - Fat Partition with the kernel (& embedded Master Key) (this can be put onto an SD-Card as well, which can be removed after booting) - Encrypted UFS Root Partition with %%FreeBSD%% 8.2 Stable ===== Prerequisites ===== * Marvell Sheevaplug * 2GB USB Drive * Working %%FreeBSD%% 8.2 (e.g. in a VM) with sources at /usr/src for Building ===== Prepare a Drive ===== Delete any existing partitions on USB Stick # gpart delete -i 1 da0 da0s1 deleted # gpart destroy da0 da0 destroyed Then create a 32MiB FAT partition (for booting the kernel) and fill the rest of the drive with a %%FreeBSD%% slice (this will be the root partition). # gpart create -s MBR da0 da0 created # gpart add -s 32M -t freebsd da0 da0s1 added # newfs_msdos /dev/da0s1 ### create fat partition # gpart add -t freebsd da0 da0s2 added Init encrypted root Partition # dd if=/dev/random of=/dev/da0s2 bs=1m ### write random data on the partition (obfuscating encrypted data space) # kldload geom_eli ### load geli kernel module # dd if=/dev/random of=/root/da0s2.key bs=256 count=1 ### prepare Master Key File 256bit key; 128bit or else is possible too # geli init -b -s 4096 -K /root/da0s2.key /dev/da0s2 ### init encrypted partition with Key File Enter new passphrase: Reenter new passphrase: # geli attach -k /root/da0s2.key /dev/da0s2 ### attach encrypted partition Enter passphrase: # ls /dev/da0s2* /dev/da0s2 /dev/da0s2.eli ### The new plaintext device will be named /dev/da0s2.eli. # newfs /dev/da0s2.eli ### new fs inside encrypted partition * TODO: use bsdlabel to label the encrypted partition ... ===== Patching the source ===== apply the patches from https://github.com/okeeblow/FreeBSD-kirkwood ===== Build world ===== Build it, but don't install anything # cd /usr/src # make -j 8 buildworld TARGET_ARCH=arm ===== Patching the Kernel ===== use this Kernel Conf [[MichaelSchöne/SHEEVAPLUG_ELI|SHEEVAPLUG_ELI]] # cp /root/SHEEVAPLUG_ELI /usr/src/sys/arm/conf/ Patches from cognet@bsdmips cognet@freebsd.freenode.org. You will be able to define option GELI_PROVIDER & GELI_KEY_SIZE in the kernel conf. GELI_PROVIDER is the name of the partition we initialised with geli init (da0s2 in this case) and GELI_KEY_SIZE is to be set to the size of the Master Key File you created earlier. [[MichaelSchöne/hardcode_geli_key.patch]] ### based on http://people.freebsd.org/~cognet/hardcode_geli_key.diff ===== Build the Kernel ===== # cd /usr/src # make buildkernel TARGET_ARCH=arm KERNCONF=SHEEVAPLUG_ELI ==== embed geli key into the kernel ==== get the [[MichaelSchöne/embed_gelikey.sh|script]] from cognet to embed the geli key into the kernel ### http://people.freebsd.org/~cognet/embed_gelikey.sh # cd /root # cp /usr/obj/arm/usr/src/sys/SHEEVAPLUG_ELI/kernel.bin ./ # sh embed_gelikey.sh kernel.bin /root/da0s2.key ===== Install the Kernel ===== # mount -tmsdosfs /dev/da0s1 /mnt # cp kernel.bin /mnt # umount /mnt ===== Install World ===== # mount /dev/da0s2.eli /mnt ### mount encrypted partition # setenv DESTDIR /mnt # cd /usr/src # make installworld distrib-dirs distribution TARGET_ARCH=arm ===== Configure some Niceties ===== Set the hostname, turn on DHCP, and enable SSHd. # echo 'hostname="my_preferred_hostname"' >> $DESTDIR/etc/rc.conf # echo 'ifconfig_mge0="DHCP"' >> $DESTDIR/etc/rc.conf # echo 'sshd_enable="YES"' >> $DESTDIR/etc/rc.conf Enable automatic fsck, so we can get back into the OS in the event of power loss or an unclean shutdown. # echo 'fsck_y_enable="YES"' >> $DESTDIR/etc/rc.conf # echo 'background_fsck="NO"' >> $DESTDIR/etc/rc.conf # echo 'force_fsck="YES"' >> $DESTDIR/etc/rc.conf # echo 'force_fsck_list="/"' >> $DESTDIR/etc/rc.conf # echo 'ntpd_enable="YES"' >> $DESTDIR/etc/rc.conf # echo 'ntpd_sync_on_start="YES"' >> $DESTDIR/etc/rc.conf Tell Ports not to build X11. # echo 'WITHOUT_X11=yes' >> $DESTDIR/etc/make.conf Set some mount options for our root filesystem. Disabling clustered reads and writes is Reccommended on ARM # echo '# Device Mountpoint FStype Options Dump Pass#' > $DESTDIR/etc/fstab # echo '/dev/da0s2.eli / ufs rw,noclusterr,noclusterw 1 1' >> $DESTDIR/etc/fstab # umount /mnt ===== Setting up U-boot to boot from USB Stick ===== Connect your Sheevaplug to your Computer via miniUSB and start a console. Update the boot command: (as i memorize it ...) set bootcmd 'usb start; fatload usb 0:1 0x900000 kernel.bin; go 0x900000;'