After having a very interesting discussion over new years in person with someone I thought lived on the opposite side of the country (long story), we got onto the topic of reliable, high performance data storage for personal use. Both of us, being photographers, have massive stores of unique data which is not intended for distribution (camera raws are basically negatives). I was using a Windows workstation with a pair of 500G drives in a mirror configuration and a subscription to Backblaze to maintain a collection of just over 400G of raw files. He brought up an interesting point though. What about bit-rot, or data corruption at the point of storage? I had no answer for him. But he had an answer for me: FreeNAS.
FreeNAS is a freely available network addressable storage (NAS) operating system based on FreeBSD that turns any compatible computer with hard drives and a usb port into a stand-alone NAS appliance. Normally I wouldn't care, as I had strong independent workstation who don't need no NAS, but there's one little feature that really caught my attention: FreeNAS 8 includes solid ZFS support, a luxury I didn't have access to on either Linux or Windows at the time.
The combination of FreeBSD, ZFS, and near read-only root on USB were to me the killer feature of this operating system. I had heard of ZFS when it was announced almost a decade ago. The thing that kept me from adopting it was the disruption to my environment that would be caused by switching systems over to OpenSolaris. Most of my photography work is done on Windows and most of my development work is done on Linux, so the obvious solution would have been to setup an OpenSolaris based server with NFS for Linux clients and Samba for Windows clients. I wasn't really interested in doing that either. If disk latency was the enemy of performance, than disk latency + network latency and min( disk bandwidth, network bandwidth ) really didn't seem like a good idea.
Plugins are also supported by using the FreeBSD Jail facilities. This is very similar to Open Virtuozzo, which I had plenty of experience working with at my last job. I was immediately curious how easily my applications currently running on Linux would fare within one of these jails.
I downloaded the latest version of the ISO from the FreeNAS website (at the time, 8.3.1-RELEASE-x64) and setup a small (1 core, 4G RAM, 20G Disk) VM to test with on my workstation. Note: ZFS is very RAM intensive. Fortunately, RAM is cheap nowadays. The minimum recommended system memory is basically as much as your system can support, trust me, you'll like it that way. 4G seemed reasonable for testing.
Installing FreeNAS onto a USB drive is easier than any other installation experience I've had with FreeBSD. After the CD boots, you hit enter 3 times, watch a percentage indicator spin to 100%, then hit enter once more, the down arrow twice, and enter to reboot.
After booting into your installed FreeNAS environment, you are presented with a console view giving you some basic network configuration and reset options. Major configuration is done through the browser.
Since only the administrator account exists, and the password has not been set, you are able to login directly without authenticating. The first thing you should do is set an administrator password.
Pretty much everything is straight forward, though I would hardly describe it as user friendly. Terms like Cron, NTP, Rsync, SMART, Sysctls and Tunables permeate the navigation pane, which I can appreciate, but I could see many others getting confused. This is obviously a tool for people with previous system administration experience who don't necessarily enjoy the command-line.
Here's roughly what I did:
- Storage -> Volumes -> Volume Manager: Added two test disks to a pool in a mirror configuration
- Storage -> ZFS Scrubs: Scheduled a periodic scrub task to the pool
- Storage -> Periodic Snapshot Tasks: Scheduled several sets of periodic snapshots for the pool (hourly, daily, weekly, monthly)
- Account -> Users: Added accounts for day to day access of resources
- Services -> Control Services: activated the following services
Accessing Samba from windows was a primary concern, as the purpose of this system was to hold my collection of camera raws for lightroom. Performance wise, initial tests within VMWare were excellent, but after testing on dedicated hardware, I found that my data transfer was limited to around 530Mbps. This turned out to be a limitation of the on-board Gigabit on my workstation. It does everything I expect a NAS to do.
The FreeNAS implementation of ZFS did not support the smooth drive hot-swapping I had been hearing about for years from Sun. Whenever I removed a drive and plugged it back in, I was forced to confirm with the control panel that I was replacing this drive with a different one, despite it being the same drive in the same port. In reading, this is something that will be addresses in upcoming releases.
After a few weeks, I couldn't help myself, and began to experiment with the plugins. Specifically, I was curious about the MiniDLNA plugin, as well as the architecture in general so that I could potentially use it to run a jailed environment for my own uses. As it turns out, this part of the project needs polish.
First of all, the FreeNAS Plugin system doesn't come out of the box fully functional. Additional downloads and configuration adjustments are required for it to function. Secondly, since these systems function within a jail, the configuration UIs are typically spread across several IP addresses (one for FreeNAS relevant configuration, and one for the specific application being configured within the jail). This flies in the face of the concept of FreeNAS, which is a simple to install, configure, and use NAS operating system.
MiniDLNA was intended for use under Linux (specifically, within Netgear ReadyNAS products) it makes use of the inotify facility provided by Linux, which is absent in FreeBSD. While FreeBSD does have kernel queues, and one could patch the code to make use of either, it would likely be wiser still to modify MiniDLNA to use libevent, which would make it compatible with many different file monitoring services through one interface. This is unlikely though, as the specific focus of MiniDLNA is Linux. Unlikely and unfortunate.
This slight technical inconvenience made using the MiniDLNA plugin a nightmare. I would have to manually reboot the jail to get it to recognize any changes to the media collection. I didn't have the patience to try any of the other (more complicated) plugins, or attempt to deploy more traditional unix applications within a FreeNAS jail.
At it's core mission of being a stand-alone NAS, FreeNAS solidly hits the mark. It is a simple to install, easy to configure, low maintenance, high performance, reliable NAS operating system.
It does have some competition in this field, specifically from Nextenta which covers almost all of the feature set of FreeNAS, except for perhaps a read-only USB boot option.
FreeNAS falls short though when dealing with plugins, or really getting anywhere near FreeBSD's jail system. This IS understandable as the product wasn't designed to deal with this, but it's also unfortunate for me, as I was seriously hoping to utilize this feature to reduce the complexity of my installation.