This is a runbook for setting up a FreeBSD file server on a Raspberry Pi 2 with a USB-attached SSD.
Keep the FreeBSD docs handy: https://www.freebsd.org/doc/handbook/
Download the latest image from: ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/11.0/ (I would rather use RELEASE than CURRENT, but 10.1 doesn’t offer a RPi2 image. Here’s to life on the bleeding edge!)
Decompress it with unxz
, and dd
it to the sd card.
Boot the Pi.
Default accounts:
u: root p: root
u: freebsd p: freebsd
Reset the root password. su
and passwd
.
Add your user account with adduser
. Add it to the wheel group.
Disable the “freebsd” user with pw lock freebsd
.
Set a static IP by editing /etc/rc.conf.local
:
ifconfig_ue0="inet 10.0.1.44 netmask 255.255.255.0"
defaultrouter="10.0.1.1"
(Manually add the default route until next reboot: route add default 10.0.1.1
.)
Set up ntp (especially because Pi doesn’t have hardware RTC).
Run ln -s /usr/share/zoneinfo/America/Detroit /etc/localtime
.
Edit /etc/rc.conf.local
:
ntpd_enable="YES"
ntpd_sync_on_start="YES"
Run service ntpd start
.
Install some software.
portsnap fetch
and portsnap extract
.
cd /usr/ports/sysutils/tmux; make install clean
cd /usr/ports/security/sudo; make install clean
cd /usr/ports/editors/vim; make install clean
cd /usr/ports/net/rsync; make install clean
cd /usr/ports/ftp/wget; make install clean
cd /usr/ports/shells/bash; make install clean
cd /usr/ports/devel/git; make install clean
cd /usr/ports/irc/irssi; make install clean
cd /usr/ports/ports-mgmt/portmaster; make install clean
Search ports like cd /usr/ports/
and make search name=foo
. May need to get an index first like make fetchindex
.
(I’d rather use binary packages, but they don’t seem to be available. Maybe once Pi2 gets into STABLE.)
After initial setup of the ports collection, normal updates can be done with portsnap fetch update
. Do upgrades with portmaster -a
.
https://www.freebsd.org/doc/handbook/ports-using.html
Run makewhatis
to rebuild the man page index. (apropos
and whatis
work, but not man -k
. Why?)
Add user account to sudoers.
Change user account shell to bash with vipw
.
Note that the default tmux shell is set in ~/.tmux.conf
like:
set-option -g default-shell /usr/local/bin/bash
After adding ~/.bashrc
, do ln -s ~/.bashrc ~/.bash_profile
.
(BSD ls differs from GNU ls. -G instead of –color. Instead of dircolors, export LSCOLORS=gxfxfgxgbxdgxgBxBxegeg
.)
Run ssh-keygen
as user. Copy key from .ssh/id_rsa.pub
to remote server(s).
https://www.freebsd.org/doc/handbook/usb-disks.html https://www.freebsd.org/doc/handbook/disks-adding.html
Find the device with dmesg | grep -A6 umass
. Mine seems to be da0
.
Look for existing partitions with gpart list
.
Delete existing partition: gpart delete -i 1 da0
.
Add a FreeBSD ufs partition: gpart add -t freebsd-ufs da0
.
Format the partition: newfs -U -t /dev/da0p1
. (-t is for TRIM.)
mkdir ssd
Add to /etc/fstab
:
/dev/da0p1 /ssd ufs rw,noatime 0 2
Do mount /ssd
.
Create a 4Gb swap file on the ssd:
dd if=/dev/zero of=/ssd/swap bs=128k count=32768
chmod 0600 /ssd/swap
Add to /etc/fstab
:
md99 none swap sw,file=/usr/swap0 0 0
And turn on swap: swapon -aq
.
Easiest to set up: scp the IP to a server with a fixed address. On the pi, run something like this shell script as an hourly cron job:
#!/bin/tcsh
/usr/bin/host myip.opendns.com resolver1.opendns.com | /usr/bin/grep "has address" | /usr/bin/awk '{print $NF}' > /tmp/ip.txt
/usr/bin/scp -q /tmp/ip.txt paulgorman.org:w/
(I wanted to tunnel NFS over SSH, but never got it working. I ended up using sshfs on the client instead. Nevertheless, the following NFS stuff works OK for LAN, albeit with some UID/GID mismatches.)
https://www.freebsd.org/doc/handbook/network-nfs.html
On the pi/server, edit /etc/exports
(exports(5)) to add:
/ssd localhost
Add to /etc/rc.conf.local
:
rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_enable="YES"
mountd_flags="-r"
Start nfsd, rpcbind, and mountd with service nfsd start
.
Make a mount point on the client: mkdir /pi
.
mount -v -t nfs pi:/ssd /pi
”/ssd” is the path on the server we want to mount.