From charlesreid1

A guide to hacking on the Raspberry Pi, a microcomputer that runs a full stack Linux OS, all on a mobile processor:

RaspberryPi PluggedInRPi.jpg

Installing Operating System

The kit came with an 8GB SD card with the NOOBS operating system (for beginners at raspberry pi) pre-installed. Nice touch, but I didn't want to use NOOBS, I wanted to use a Raspbery Pi version of Debian so that I can hack this thing up. I downloaded an image file from http://www.raspberrypi.org/ (it was a zip file, containing an img file).

Step 0: Plug the SD card in

You're going to be installing the operating system for the Raspberry Pi onto an SD card, so pick an SD card that you'll use, and plug it into your laptop.

Step 1: Find your SD card

I plugged my SD card into my Mac OS X (running 10.8), and ran this command to list all the devices:

$ diskutil list
dyld: DYLD_ environment variables being ignored because main executable (/usr/sbin/diskutil) has __RESTRICT/__restrict section
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *250.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Cronus                  249.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.9 GB     disk1
   1:                 DOS_FAT_32 NOOBS                   7.9 GB     disk1s1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *16.7 MB    disk2
   1:        Apple_partition_map                         32.3 KB    disk2s1
   2:                  Apple_HFS Flash Player            16.7 MB    disk2s2

That means my sd card is at /dev/disk1.

Step 2: Unmount card

Now I unmount the SD card:

$ diskutil unmountDisk /dev/disk1
Unmount of all volumes on disk1 was successful

Step 3: Write image to SD card

For the last step, you use dd (disk formatter utility) to write that image to your SD card:

$ sudo dd bs=1m if=2014-06-20-wheezy-raspbian.img of=/dev/disk1
2825+0 records in
2825+0 records out
2962227200 bytes transferred in 1571.202055 secs (1885325 bytes/sec)


The above command took 27 minutes on my system.

Resources

Interfacing with Headless Raspberry Pi

Step 1: Modify Raspberry Pi boot sequence

Following http://pihw.wordpress.com/guides/direct-network-connection/

Plug the SD card back into your computer. Edit the file cmdline.txt to include a directive to hard-code an IP address.

If your laptop finds an IP address automatically, then you can specify any IP address you want for your RPi, as long as it is in the range 169.254.X.Y (anything between 169.254.0.0 to 169.254.254.254).

I added this to the end of cmdline.txt:

ip=169.254.113.200

Then I ran

$ cp cmdline.txt cmdline.direct

Now plug the SD card into the RPi and boot with a hard-coded IP address. This will work because we're connecting the computer and the RPi directly.

Step 2: Cat5 Network Cable

Get a standard network cable and connect the laptop to the RPi. Remove the SD card from the laptop once you've modified cmdline and put it in the RPi to boot it up.

RaspberryPi Network.jpg

RaspberryPi Laptop Network.jpg

Step 3: SSH

Now you can SSH to the IP address you specified:

SSH RaspberryPi.png

First Steps with Raspberry Pi

Configuring your RPi

When you first SSH into your RPi, it will notify you that you have to run a config program to set up your RPi initially.

RaspberryPi Config.png

I picked the first menu item, and that required a system reboot:

RaspberryPi Reboot.png

Putting RPi on a Network

As a next step, we'll want RPi to be internet-capable so we can use aptitude to install some packages and get this operating system tuned up.

First, you'll keep your network cable plugged into your RPi.

RaspberryPi PluggedInRPi.jpg

Then you'll plug the other end of the network cable into a network router or a network wall jack (see IMPORTANT CAVEAT below).

RaspberryPi PluggedInRouter.jpg

Once you plug your RPi into the network router, it'll still have the same IP address, so you can still SSH to it the same way:

$ ssh pi@169.254.113.200

but now the RPi will have internet connectivity:

RaspberryPi Aptitude.png

Local Area Network

If you plug your RPi into a wall jack and you're on a local area network administered by someone else, you may have internet connectivity issues. This is because you're hard-coding an IP address, but some networks must assign IP addresses themselves in order to allow a computer to get outside the local area network. In this case, you'll have to contact a network administrator and ask them to reserve an IP address for your Raspberry Pi.

Your network administrator will give you a couple of pieces of information:

  • IP address - example 10.10.5.22
  • Netmask - example 255.255.255.0
  • Gateway - example 10.10.5.1

You can enter the IP address in your cmdline.direct file.

To specify the netmask and gateway, edit the file /etc/network/interfaces and add a section for your ethernet interface that specifies the netmask and gateway:

auto eth0
iface eth0 inet static
address 10.10.5.22
netmask 255.255.255.0
gateway 10.10.5.1

This should replace a line that looks like this:

#iface eth0 inet dhcp

which says to automatically find an IP address for this ethernet interface by getting one from the DHCP server.

If you don't know what your network interface is, execute this command:

ifconfig -a | grep eth

If You Absolutely, Positively Must Use a Dynamic IP

In case you are dealing with a situation where you have to let your Raspberry Pi be dynamically configured an IP address, and you have to somehow figure out what IP address your Raspberry Pi has, and you don't have a monitor to simply print it out, here's what you can do: you can modify SSH to listen on a particular port, like 9999. Then, you can let the RPi be dynamically assigned an IP address by the network DHCP server. It will be listening for incoming connections on port 9999, and we can use nmap to look for IP addresses listening on that port.

Remote Connect to Your RPi

The first step to dynamically configuring your RPi is to first have a static IP address assigned to it, and have it directly connected to your computer. You will SSH into the RPi to modify the port that SSH listens on. We'll use that as a way to flag RPi's IP address, and use nmap to discover its IP address.

Modify SSH

Open the SSH daemon config file:

vim /etc/ssh/ssh_config

Change the line specifying the port it listens on:

Listen 22

to something else,

Listen 9999

Get the RPi a Dynamic IP Address

One last step remains: edit the boot file of the RPi so it doesn't hard-code the IP address anymore. Pull the SD card out of the RPi and put the card in your laptop. Edit master.txt,

vim /Volumes/boot/master.txt

and remove the IP statement at the end,

ip=169.254.113.200

and finally, copy that to master.direct,

cp /Volumes/boot/master.{txt,direct}

Now plug it into the network or router.

Discovering the RPi IP Address with Nmap

In the steps above, we modified our Raspberry Pi so that SSH would listen on port 9999, and the RPi would get a dynamic IP address instead of a static IP address. Now that we've plugged our RPi into our network, and it has its dynamic IP address, we have to find it.

We're going to use nmap search for all IP addresses listening on port 9999.

First, I ran this command from a laptop that was connected to the same router as the RPi:

$ ifconfig

I found the laptop's IP address, and used the first three digits as the fixed digits of the IP address in the nmap search. In this case, my laptop was at 10.0.0.5, and the router was at 10.0.0.1.

Now I do a search for all IP addresses listening on port 9999:

nmap -p9999 10.0.0.0-255

Here's what I got:

Nmap9999.png

Thus, our RPi is at 10.0.0.16 (this may be a bit more challenging on a larger LAN network where more services might be listening, but that is just a matter of trial and error).

Here, I SSH to the RPi:

SSH9999.png

And... success!

SSH9999Success.png

And here's the whole reason for doing all of this: we've got a connection to the outside world now!

SSH9999Ping.png

Remote Connect to Your RPi on Port XYZ

If you've already changed the port that SSH is listening on, and you need to SSH into the RPi again, just use the -p <port> option when you issue your SSH command to the RPi:

ssh -p 9999 169.254.113.200

OOPS

If you really screw this up, and change the port the RPi is listening on, and can't figure out how to fix it, you can always just re-apply the .img file you downloaded to the SD card, wiping out your changes. No problemo.

Software Installation

A list of commands that I ran on the RPi to get things installed:

#!/bin/sh

sudo apt-get update
sudo apt-get install -y build-essential
sudo apt-get install -y liblapack-dev
sudo apt-get install -y libblas-dev
sudo apt-get install -y gfortran

sudo apt-get install python-dev
wget http://python-distribute.org/distribute_setup.py
python distribute_setup.py
wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
sudo python get-pip.py

sudo pip install virtualenv
sudo pip install flask
sudo pip install cython
sudo pip install numpy
sudo pip install pandas
sudo pip install scipy

Resources