FreeBSD Core Server

FreeNAS + Roon

Hardware Setup:

Intel NUC (NUC5i3RYH with i3)
16MB RAM (zfs already requires 8GB)
128GB SSD (Transcend MTS400 M.2) for Roon
1TB HDD for data/music
64 GB USB3 for FreeNAS

FreeNAS Setup:

Install on USB3
Setup SSD as volume “ssd”
Setup HDD as volume “disk”
Enable SSH service and permit root login with password
Add to System->Tunables (rc.conf):

iohyve_enable=“YES”
iohyve_flags=“kmod=1 net=em0”

###Create Virtual Machine (with bhyve):
Login with ssh to FreeNAS as root.

Setup pool “ssd” for virtual machine:

iohyve setup pool=ssd

Setup network bridge (check your interfaces with ifconfig):

iohyve setup net=em0

Load kernel modules:

iohyve setup kmod=1

Fetch Arch Linux ISO:

iohyve fetchiso http://mirror.23media.de/archlinux/iso/2016.05.01/archlinux-2016.05.01-dual.iso

Create Arch Linux Guest:

iohyve create archguest 50GB

Set options:

iohyve set archguest ram=4GB
iohyve set archguest cpu=2
iohyve set archguest loader=grub-bhyve
iohyve set archguest os=arch
iohyve set archguest boot=1 (starts Arch with FreeNAS)

Start installation (boot the ISO):

iohyve install archguest archlinux-2016.05.01-dual.iso

Connect to virtual serial console (login root, no pw, exit the console with ~~. ):

iohyve console archguest

Now follow the usual Arch Linux installation e.g. the instructions from this forum. Just skip the bootloader stuff and do:

pacman -S grub
grub-install --target=i386-pc /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg
exit
umount /mnt
reboot (this will shut down the guest)

And test with:

iohyve start archlinux

SSH into the Arch Linux (check your router to see the IP Arch got via DHCP).
Follow the official instructions for Roon Server

Export your own music library on FreeNAS via Windows share and point Roon to the URL. Didnt find an easier way to mount the music directely from the host into the virtual machine.

Results:

  • SSD Benchmark from inside the virtual machine with bonnie++: ~80MB/s write, ~430MB/s read
  • The VM/bhyve uses ~2-5% CPU for Tidal Lossless playing. No drop outs, instant play/stop. Even with background indexing. Perfect :slight_smile:
  • Power consumption 10-12Watt, no matter if streaming or idle.

References:


https://wiki.archlinux.org/index.php/GRUB

1 Like

Thanks! I’ll give it a try this weekend.

Just did some spot performance testing, on the NAS with Debian in bhyve I can stream to two Roon endpoints, run a 1080p movie in Plex and hammer a share with a backup from my Mac easily. I have not yet seen the CPU crest 20% and no hiccups anywhere. I am running on an i3-4170 3.7GHz CPU with 8GB of RAM. I’ll pop in another 8GB SIMM to bring my total to 16GB as my memory utilization gets close to 100%.

Thats great news :slight_smile:

I’ve been eagerly awaiting native FreeNAS integration but might have to give this a try in the near future. Originally built a FreeNAS build several years ago for a Plex server to all the rooms in the home and having it be able to do Roon natively would be way better than my old MBP as a server. If you’re only getting 20% usage @pwright92 on an i3 and 8G of ram, hoping that my E3 1220 and 32G will do just as well.

I posted my installation steps if you are interested:

one small addition is to add a time service:
apt-get install ntpd

Enjoy!

1 Like

+1 for requesting direct FreeBSD support for roon core.

FreeBSD also has a linux binary compatibility layer, with supposed 64 bit linux support since FreeBSD 10.3. Has anyone tried running the roon binaries directly in a jail using this instead of a full vm?

Hi @brian

I do not have deep details about Roon (of course) but you should not have any major problem to compile it on plain FreeBSD, almost certainly all dependencies are available in there already - you would just need to install the packages. I just do not know how the Mono support is on FreeBSD, I do not use Mono.

FreeNAS is a high customized version of FreeBSD, one time there is a FreeBSD Port it is quite easy to have it running on FreeNAS.

Indeed, it is often easier to support FreeBSD¹ than Linux, and you can always rely on FreeBSD support channels, specially the Mailing Lists where most devs hang.

Cheers! :beers:

EDIT: If you prefer to have a full desktop running right after the installation, you can install GhostBSD, what is exactly it - a pre-configured FreeBSD Desktop, using “Mate Desktop”.

EDIT_2: probably the only major difference rely on the fact FreeBSD use OSS (Open Sound Server) instead of Alsa as default sound server. Still, Alsa can be used on FreeBSD, it is on Ports system, but would be a less elegant solution².

¹while there are some derivatives, do exist just one FreeBSD (what is a complete system), one Ports system, etc.

²basically all features you find in “Alsa + Pulse Audio” are already present in OSS alone. Using Alsa instead OSS could be considered a downgrade. :wink:

Mono works fine on freebsd. I’ve used it with other apps.

I’m trying to see how far I can get running roon server using 64 bit linux emulation in a jail. I’ve been able to get check.sh to pass, but the RoonServer program itself crashes inside of mono. Since it appears that mono is embedded in the binary, I don’t see how I could try to get it to run under a different mono version.

Any ideas??

root@roon:~/RoonServer # ./start.sh
TYPE: 7
V: mono_create_corlib_exception_0

  • Assertion at mini-amd64.c:203, condition `amd64_is_imm32 (disp)’ not met

Stacktrace:

at <0xffffffff>
at System.DateTime…cctor () <IL 0x00000, 0x00013>
at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) <IL 0x0001f, 0x00061>
at <0xffffffff>
at Base.Utils…cctor () [0x00000] in /home/roon/roon/Base/utils.cs:37
at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) <IL 0x0001f, 0x00061>
at <0xffffffff>
at Sooloos.App.Main (string[]) [0x00000] in /home/roon/roon/Client/Server/main.cs:33
at (wrapper runtime-invoke) .runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00051, 0x000bf>

Native stacktrace:

/root/RoonServer/Mono/bin/RoonServer() [0x505132]
/root/RoonServer/Mono/bin/RoonServer() [0x5a330c]
[0x7ffffffff614]
/lib64/libc.so.6(gsignal+0x37) [0x8022351d7]
/lib64/libc.so.6(abort+0x148) [0x8022368c8]
/root/RoonServer/Mono/bin/RoonServer() [0x7a99bd]
/root/RoonServer/Mono/bin/RoonServer() [0x7a97a6]
/root/RoonServer/Mono/bin/RoonServer() [0x7a990b]
/root/RoonServer/Mono/bin/RoonServer() [0x54580e]
/root/RoonServer/Mono/bin/RoonServer() [0x586da5]
/root/RoonServer/Mono/bin/RoonServer() [0x5aaa7a]
/root/RoonServer/Mono/bin/RoonServer() [0x5aec68]
/root/RoonServer/Mono/bin/RoonServer() [0x5afab6]
/root/RoonServer/Mono/bin/RoonServer() [0x419bc9]
/root/RoonServer/Mono/bin/RoonServer() [0x419d62]
/root/RoonServer/Mono/bin/RoonServer() [0x5080b0]
/root/RoonServer/Mono/bin/RoonServer() [0x508642]
[0x800b1d28c]

=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.

./start.sh: line 52: 44318 Abort trap (core dumped) “$P” “$@”
./start.sh: line 34: kill: (44318) - No such process

I used bhyve with the following steps:

Add to System->Tunnels (rc.conf):

ng_ther_load=“YES”
iohyve_enable="YES"
iohyve_flags="kmod=1 net=em0"

Setup pool “ssd” for virtual machine:

iohyve setup pool=ssd

Setup network bridge (check your interfaces with ifconfig):

iohyve setup net=em0

Load kernel modules:

iohyve setup kmod=1

Fetch Debian network install ISO

iohyve fetchiso http://cdimage.debian.org/debian-cd/8.4.0/amd64/iso-cd/debian-8.4.0-amd64-netinst.iso

Set up VM

iohyve create roonserver 50GB
iohyve set roonserver ram=2GB
iohyve set roonserver cpu=1
iohyve set roonserver loader=grub-bhyve
iohyve set roonserver boot=1

Start installation (boot the ISO):

iohyve install roonserver debian-8.4.0-amd64-netinst.iso

Connect to virtual serial console (login root, no pw, exit the console with ~~. ):

iohyve console roonserver

Follow the on screen GUI to install

When asked for packages, deselect the GUI and select SSH

Edit the network interface file

vi /etc/network/interfaces

In the interfaces file look for a line such as:

iface eth0 inet dhcp

Put a hash at the beginning of the line to disable it or delete it:

#iface eth0 inet dhcp

Add the following lines

# The loopback interface
 auto lo
 iface lo inet loopback
 auto eth0
 iface eth0 inet static
 #your static IP
 address 192.168.0.225  
 #your gateway IP
 gateway 192.168.0.1
 netmask 255.255.255.0
 #your network address "family"
 network 192.168.0.0
 broadcast 192.168.0.255

Enable root login via ssh:
cd /etc/ssh/
cp sshd_config sshd_config.org
vi sshd_config

Find the following line in /etc/ssh/sshd_config

Remove the # and change prohibit-password to yes from the line below:

#PermitRootLogin prohibit-password

becomes:

PermitRootLogin yes

Stop the system

init 0

And test with:

iohyve destroy roonserver
iohyve start roonserver
iohyve console roonserver

Make vertain your freenas has the NFS share set up

Enter:

mkdir /mnt/MusicStore
mount -t nfs NFSserver:/mnt/DataVault/MusicStore /mnt/MusicStore

Edit /etc/fstab to include the mount using a line:

mount -t nfs titan:/mnt/DataVault/MusicStore /mnt/MusicStore

Also add the following lines for SSDs:

tmpfs /var/log tmpfs defaults 0 0
tmpfs /var/tmp tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0

##Save and test using the following commands:
umount /mnt/MusicStore
mount -av

IMPORTANT There should not any error messages!!!

RoonServer Installation

apt-get install cifs-utils
apt-get install curl

Make directories

cd /opt

curl -O http://download.roonlabs.com/builds/roonserver-installer-linuxx64.sh
chmod +x roonserver-installer-linuxx64.sh
./roonserver-installer-linuxx64.sh

Follow the prompts

Set up ntp

apt-get install ntp

I have migrated my FN 9.10 server to FN 10, and am using Docker for Plex Media Server and the FN10 VM wrapper (debian 8.40 template).
Roon is very easy to install with Debian Jess and seems stable, with backups and streaming working fine - same as pre-upgrade.
I would have migrated to Docker but there is no official Docker image and it doesn’t appear in the “official” parameterized Freenas list of Docker container images.

FYI, the VM system also supports FreeBSD vm’s, so if you ever port Roon to FreeBSD it would also be able to run with less virtualization overhead…But maybe I would suggest an official Docker release now.

There is the official Debian Jessie docker image… You could go that route and install the core there instead of waiting for an “official” image made by somebody else…

I have FN10 with RoonCore in a Ubuntu VM. I use 9P virtio to mount the NASs share instead of SAMBA. This is very fast and easy to set up. See: Suggested hardware

I will try the docker image being worked on as well. See: Docker images for Roon

+1 for native Core on FreeBSD please

A FreeNas plugin similar to what we see with pelx’s media server plugin would be fantastic. I am going to take a stab at trying the solutions that others have posted but I would love to see official support for FreeNas from Roon.

+1 too, for a native Core on FreeBSD or a FreeNas plugin
Thanks in advance

Would absolutely love this feature. Just setup FreeNas for use as a media hub and not looking forward to the complicated task of trying to get Roon running in a linux jail. Would be great to be able to just install a plugin.

Another +1 for a native FreeBSD Roon

+1 Roon Server plugin on FreeBSD please.

Is Peter Wright’s solution the most up to date ?
Any other links please.
Here’s a current update from Dave Hamby:

Dave’s instructions seem accurate, he uses iohyve instead of bhyve, which seems to be the current 11.1 default VM tool. Honestly, it is easier to buy an Intel NUC and install ROCK. I did that but I plan to run at my backup location with bhyve on my Freenas server (instead of buying another NUC). In order to use bhyve/iohyve, you need a fair amount of “extra” RAM for virtual machines in addition to the RAM for the core OS (freenas) and ZFS use.

I missed using NFS with bhyve on Freenas for Roon Server. (SMB has more limitations on ‘edge case’ file names etc).
I do like separating the file server from the application server. I may move in that direction in the future.