Building a FreeBSD NAS, part II: Base system setup
This is part II of my journey into the wonderful world of building my own NAS. Check out part I for an explanation of the hardware I used.
I quickly chose FreeBSD as the operating system for the NAS because it is the one operating system that I am familiar with that also seems suitable for servers. See the FreeBSD wiki for some other compelling reasons.
After grabbing the
memstick image from the FTP
I started installing the base system. I you have never done this before,
I would recommend reading the FreeBSD handbook
in particular its section about the
They describe it way better than I possibly could. Assuming you now
know what you are doing, you should disable journaling for all
partitions on your SSD. You can do so prior to committing the
file system changes in the FreeBSD installer by selecting the advanced
options of your partitioning scheme. If you do not install the system on
an SSD, you need not heed my advice.
Apart from the journaling, I went with the standard options. After the
setup finished, I of course downloaded the most recent ports collections
portsnap fetch extract.
I like to use
htop for additional sysadmin coolness, so I always
enable the Linux compatibility first. I first added the line
/etc/rc.conf. I then created the necessary
mkdir -p /usr/compat/linux/proc, and for
compatibility reasons, create a symbolic link via
ln -s /usr/compat /compat. Last, I added the following line into
linproc /compat/linux/proc linprocfs rw 0 0
After a reboot, the new file system should be mounted and finally, the
htop can be installed.
In the first article, I talked at
lengths about trying to reduce the power consumption of the NAS. This is
powerd comes in handy. I added the following lines to
powerd_enable="YES" powerd_flags="-a adaptive -b adaptive" economy_cx_lowest="C2" performance_cx_lowest="C2"
This basically tells
powerd to always try to adjust the system
performance, depending on the current load of the system. The other two
options instruct the CPU to use the C2 state as its lowest state,
regardless of the system load. The CPU in my NAS is only capable of C2.
If your CPU manages the C3 state, the results will even be better. Use
sysctl dev.cpu.0.cx_supported to query the supported states for the
first CPU, for example. See the FreeBSD wiki for further power
consumption tuning tips.
For the time being, I decided not to run my own mail server on the NAS
because I do not think I am qualified to do so. Since I still want to
rely on the reporting capabilities of daemons, I installed
ssmtp as an
alternative. Here’s an excerpt of its
ssmtp is a send-only sendmail emulator for machines which normally pick their mail up from a centralized mailhub (via pop, imap, nfs mounts or other means). It provides the functionality required for humans and programs to send mail via the standard or /usr/bin/mail user agents.
In a previous post, I already
talked about how to set up
ssmtp for Google Mail. This is exactly how
I proceeded this time. To completely disable
sendmail, the default MTA in
FreeBSD, I added the following lines to
sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO"
Furthermore, I modified
/etc/mail/mailer.conf and replaced all entries
ssmtp. To wit:
sendmail /usr/local/sbin/ssmtp send-mail /usr/local/sbin/ssmtp mailq /usr/local/sbin/ssmtp newaliases /usr/local/sbin/ssmtp hoststat /usr/bin/true purgestat /usr/bin/true
This procedure seems to be the official way of replacing
ssmtp. At least, it is suggested by the maintainers of the
As a last touch, I disabled some of the periodic reports that are sent
by FreeBSD. These are the relevant parts of the
daily_status_network_enable="NO" daily_status_mailq_enable="NO" daily_status_mail_rejects_enable="NO" daily_status_mail_rejects_enable="NO"
This leaves with periodic e-mails about the disk status, user accounts, and some other stuff. I don’t need to be informed about the network or mail status.
Installing NTFS write support
Some of my data is still on hard drives that were regularly read
and written to by Microsoft Windows (you may want to shudder now and
shun me, so go ahead). Since the default NTFS driver included in
FreeBSD is rather slow and cannot actually write to these disks, I
installed the port
fusefs-ntfs. Its configuration was again very
simple and required only the line
/etc/rc.conf, as well as the line
/etc/sysctl.conf. After rebooting, you should be able to use the
driver by issuing
ntfs-3g /dev/da0s1 /mnt, for example.
This concludes the basic system setup. For the next part, I plan on explaining my ZFS configuration as well as some tools that simplify managing the server. Stay tuned.