PC Nerding

A passwordless NAS using a Rapsberry Pi and Samba 4

Being paranoid about my data, I find it’s always cool to have one more backup device on my LAN. I had a spare 2TB powered USB hard disk and a spare Raspberry PI. So, while I made one for myself, I wrote this guide. Today I want to show you how to get a fully working NAS using Samba, using a passwordless configuration that will allow all your pc to access it without prompts.
IMPORTANT NOTE: being passwordless means that ANYONE on your LAN can access this device. Don’t do such things on shared LANs and make sure your firewall does not allow incoming connections through TCP ports 139 and 445. If you don’t think your network is safe, don’t follow this guide.

I will be using Raspian image (on a 4GB card) for this particular guide because raspi-config utility makes a first steps a little faster, Arch linux should work the same but your mileage may vary. I did everything headless through SSH, you can use a keyboard and monitor, your choice. We do not need more than the command line.

Starting Up

Start by copying Raspbian image to your SD using your favorite method and powering it up.
Do the usual

sudo apt-get update && sudo apt-get upgrade

Now in raspi-config use option 1 to expand filesystem, option 2 to change default password, option 3 to make Pi boot to text console, change PI’s hostname (8 Advanced Option -> A2 Hostname) to something catchy (mine’s called “rpi-backup”) and set GPU memory (8 Advanced Option -> A3 Memory Split) to 16 since we won’t use it. You may want to overclock, but for this setup I value stability over speed.

Hard Disk Setup

Now if you haven’t yet plugged your hard disk, do so now. If you have already formatted your disk continue. If not a little google search will help you.

First thing to do is to create a mount point and change its owner to pi user. Then we will mount our disk in this newly created mount point.

sudo mkdir /media/backup
sudo chown -R pi /media/backup
mount /dev/sda1 /media/backup

Now, to make sure Raspberry does this automatically each boot we must edit the filesystems table file.

sudo nano /etc/fstab

Add this line at the bottom: (NOTE: mine’s filesystem is ext4, if your disk use another filesystem change that value. “auto” will work in most cases)

/dev/sda1   /media/backup    ext4    defaults,user   0   1

Samba Setup

Start this part by installing the required packages

sudo apt-get install samba samba-common-bin

Delete the default configuration file and make a new one

sudo rm /etc/samba/smb.conf
sudo nano /etc/samba/smb.conf

pasting in it those lines:

   workgroup = WORKGROUP
   guest account = pi
   map to guest = bad user

   path = /media/backup
   guest ok = yes
   read only = no

Remember to change workgroup to the one you use.

Now restart your samba server using

sudo /etc/init.d/samba restart

and you are ready to copy/access your files from your Windows, Mac and Linux machines.

Final Notes

I get roughly 10MB/s write and 7MB/s read speed, it could be a little faster while reading but I’m fairly ok with this setup.
As I said in the first lines, this passwordless device is accessible, and writable, by anyone in your LAN. Make sure your LAN is safe before storing critical data.

Game Development PC Nerding

Raspberry PI and Random values

I’m developing a simple rpg game, testing it with .NET on Win and Mono on Win/Mac/Linux works perfectly. Today I decided to test it on my Arch Raspberry PI to see if it could run well on this device and the result is that the game won’t even start for some “Array out of index” exception that does not appear with other systems.
After some time debugging here and there, I found out that the Random.Next function does not behave correctly on RPi.
Running this test code:
Random r = new Random();
for (int i = 0; i<10; i++) { Console.WriteLine(r.Next(0,7)); }

on the RPi prints ten times the number seven!
This is wrong for two reasons: First obliviously it's not returning random numbers and secondly it is returning the maxValue, which should be "exclusive" and it may never be returned by the function.
So calling something like
should return a value between 0 and array.Length-1, but it returns array.Length causing my out of index exception.

I tried testing Random.Next(), Random.Next(int) and Random.NextDouble() and they all behave correctly. I dunno if this is a bug in Mono:ARM or something related to the Raspberry PI.

UPDATE: Further investigations lead me to think that the problem was actually Math.Round(double), which is called in Random.Next. I'm not sure I understood it completely but looks like it is a well know problem: Mono:ARM does not support PI's hard float OSs, causing errors while working with floating point numbers. There's a patch for that and even an official RPi Debian distro with soft float support, which I won't bother installing right now. Next time PI, next time.

UPDATE: 3 April
Found an hard float version of Mono here on official Pi forums. I tested it on a clean upgraded dist-upgraded Raspbian "wheezy" from 2013 Feb 09 image and it works, remember to expand the root filesystem through raspi-config or to uninstall unneeded packages as wheezy's root partition is 2gb only and is filled with junk stuff (at least junk for me, as I use my RPI via command line SSH). On my Arch setup for some reason it was not working, but an user reported in that thread that it works on his Arch, so I think was my fault, probably some file from my previous mono test that wasn't deleted or overwritten.