= This Page Will Currently Describe the PI Lab = [[PageOutline]] Inventory: see attachment:Purchase_for_Raspberry_Pi_project.pdf:wiki:GENIRacksHome/OpenGENIRacks/RaspberryPIs == Addresses == === DNS Addresses === 128.89.68.230 rosifolius [[BR]] 128.89.68.231 gunnianus [[BR]] 128.89.68.232 leucodermis [[BR]] 128.89.68.233 parvifolius [[BR]] 128.89.68.234 ellipticus [[BR]] 128.89.68.235 idaeus [[BR]] We also asked for fixed IP addresses for BBNGuest. We provided the MAC addresses for affiliation. DNS entries have also been assigned: C4:e9:84:0d:b8:61 192.1.16.101 pi1.bbn.com [[BR]] C4:e9:84:0d:b8:7d 192.1.16.102 pi2.bbn.com [[BR]] C4:e9:84:0d:93:35 192.1.16.103 pi3.bbn.com [[BR]] C4:e9:84:0c:7f:43 192.1.16.104 pi4.bbn.com [[BR]] C4:e9:84:0c:7f:49 192.1.16.105 pi5.bbn.com [[BR]] === Web Pages Used for Reference === ==== Generic Raspbian Installation ==== https://www.raspberrypi.org/help/noobs-setup/ - Note: I had trouble getting micro 64GB cards to work with this process although I know that the installation instructions for the hypriot worked for this size. https://www.raspberrypi.org/documentation/installation/installing-images/mac.md - used this method later {{{ sudo diskutil list sudo diskutil umountDisk /dev/disk5 sudo dd bs=1m if=/Users/rrosales/Downloads/2016-03-18-raspbian-jessie.img of=/dev/rdisk5 sudo diskutil eject /dev/rdisk5 }}} And then once the SD card is used to boot the pi - one needs to run raspi-config, and choose expanding filesystem to get the rest of the SD card seen. http://raspberrypi.stackexchange.com/questions/15250/how-to-get-remaining-memory-in-sd-card - ==== Static IP Address Configuration for Raspbian Jesse version ==== Link [https://pi-hole.net/faq/how-do-i-set-a-static-ip-address-in-raspbian-jessie-using-etcdhcpcd-conf/] Despite lots of confusing information out there, it is actually pretty straightforward to set a static address in Raspbian. Begin by editing the file (do not use /etc/network/interfaces anymore!) sudo vi /etc/dhcpcd.conf Then all you need to do is append this to the bottom of the file, substituting the correct IP address you want. {{{ interface eth0 static ip_address=192.168.1.141/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 }}} ==== Docker Image Installation ==== [Image with Docker built in http://blog.hypriot.com/getting-started-with-docker-and-mac-on-the-raspberry-pi] [Instructions on how to run a container using the previous image - http://blog.hypriot.com/getting-started-with-docker-on-your-arm-device/#going-wild-with-docker-what-can-you-actually-do-with-it:397c66ef19f9f061b6711d2e296cb276] http://openvswitch.org/support/dist-docs/INSTALL.Docker.md.txt https://sdntestbed.wordpress.com/2015/07/03/install-open-vswitch-on-raspberry-pi/ https://wiredcraft.com/blog/multi-host-docker-network/ https://github.com/docker-library/official-images/tree/master/library https://labs.ctl.io/5-unexpected-ways-to-use-docker/ https://hub.docker.com/r/tomparys/skype/ Note - To make sure you have the full SD card available to you - you might need to expand the file system: [http://raspberrypi.stackexchange.com/questions/15250/how-to-get-remaining-memory-in-sd-card] [[BR]] After booting up [[BR]] [sudo raspi-config] == Setting Up Wifi == === [Installing TL-WN722N !WiFi on the Pi - Directions taken from http://barntek.net/simplemachinesforum/index.php?topic=190.0] === Edit /etc/apt/sources.list to add the non-free archive and backports (eg: sudo vi /etc/apt/sources.list): {{{ deb http://ftp.us.debian.org/debian/ squeeze main non-free deb http://security.debian.org/ squeeze/updates main non-free deb http://ftp.us.debian.org/debian/ squeeze-updates main non-free deb http://backports.debian.org/debian-backports squeeze-backports main non-free }}} Update the package cache: {{{ sudo apt-get update }}} Download the wifi utils: {{{ sudo apt-get install wireless-tools usbutils }}} Download the required firmware and put it in the correct location - you may not need to do this for your adapter or you may need different firmware - see below. {{{ sudo apt-get install firmware-atheros sudo wget http://linuxwireless.org/download/htc_fw/1.3/htc_9271.fw sudo cp htc_9271.fw /lib/firmware }}} Add adapter definition to network config - eg: sudo vi /etc/network/interfaces - add the wlan0 section: {{{ # Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. auto lo iface lo inet loopback iface eth0 inet dhcp # The wireless interface auto wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa.conf }}} Plug in adapter Confirm adapter is present: {{{ root@raspberrypi:~# sudo iwconfig lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11bgn ESSID:off/any Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm Retry long limit:7 RTS thr:off Fragment thr:off Encryption key:off Power Management:off }}} Scan your network to see what wireless access points can be seen. You may need to do this to identify your network's SSID (name), but it also confirms that the wifi dongle is doing something. The first command just lists the SSIDs found, the second tells you probably more than you ever want to know: {{{ sudo iwlist wlan0 scan | grep ESSID }}} or {{{ sudo iwlist wlan0 scan }}} Create the wpa.conf file - eg: sudo vi /etc/wpa.conf: Note: The ssid is case sensitive - if your WLAN's SSID is MYLAN, using "mylan" will not work - you won't connect! {{{ network={ ssid="NETWORK-SSID" proto=RSN key_mgmt=WPA-PSK pairwise=CCMP TKIP group=CCMP TKIP psk="YOUR-WLAN-PASSWORD" } }}} Start the adapter {{{ sudo ifup wlan0 }}} Double-check whether you are connected - below the WLAN interface has been given an IP address - looks good! {{{ root@raspberrypi:~# ifconfig eth0 Link encap:Ethernet HWaddr b8:27:eb:76:7e:2e inet addr:192.168.202.75 Bcast:192.168.202.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1488 Metric:1 RX packets:1060 errors:0 dropped:0 overruns:0 frame:0 TX packets:146 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:95749 (93.5 KiB) TX bytes:48493 (47.3 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:560 (560.0 B) TX bytes:560 (560.0 B) wlan0 Link encap:Ethernet HWaddr b0:48:7a:91:5c:f4 inet addr:192.168.222.161 Bcast:192.168.222.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:31 errors:0 dropped:0 overruns:0 frame:0 TX packets:10 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2260 (2.2 KiB) TX bytes:1542 (1.5 KiB) }}} === And then to configure the wifi adapter - use the WICD GUI === ==== WICD ==== [Wicd - https://wiki.debian.org/WiFi/HowToUse#Wicd] You must remove network-manager to get wicd to work. Check to see if network-manager is installed and see if, after you installed the driver, your wireless is already working in the notification area of your desktop manager. You may already be good to go. wicd (Wireless Interface Connection Daemon) is a lightweight alternative to !NetworkManager. It is environment-independent, making it suitable for all desktop environments, including GNOME, Xfce, LXDE, and Fluxbox. Like !NetworkManager, wicd is configured via a graphical interface. Your wireless interface should not be referenced within Debian's /etc/network/interfaces file. 1. Update the list of available packages and install the wicd package: {{{ $ su # aptitude update # aptitude install wicd }}} 2. Amend /etc/network/interfaces to contain only the following: {{{ # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback }}} Note: as of wheezy it is fine to have your wireless interface in /etc/network/interfaces, but not required. You can set the wireless interface (e.g. wlan0) in the wicd client's preferences. 3. If not already performed, add your regular user account to the netdev group and reload DBus: {{{ # adduser yourusername netdev # /etc/init.d/dbus reload }}} 4. Start the wicd daemon: {{{ # /etc/init.d/wicd start }}} 5. Start the wicd GUI with your regular user account: Original instruction had a -n. We needed to run it without -n {{{ # exit $ wicd-client }}} === GUI Setup === [We used Openbox - http://www.bristolwatch.com/rpi/rpi_openbox.htm] === OVS Installation === {{{ sudo apt-get install openvswitch-common sudo apt-get install openvswitch-switch }}} === RYU Installation === {{{ sudo apt-get install python-dev sudo pip install ryu }}} Also check this page for new install [https://github.com/ipop-project/Documentation/wiki/Installing-openvswitch-and-RYU-controller] === GRAM Porting Status === The latest GRAM AM Software has been put on the 128.89.68.230 card. The idea was to have GRAM as the AM manager for the resources of the rack. It was not as trivial to pull out the OpenStack code as there might be OpenStack assumptions intertwined into the GRAM AM code. In particular, the GRAM AM seems to support the notion of a tenant. And that notion naturally follows with OpenStack, and I think GRAM uses that notion. On a positive note, all python dependencies seemed to be supported by the PI operating system easily. === Installing Interesting Applications === ==== Installing a WebRTC server on a Raspberry PI [[BR]] ==== https://bloggeek.me/webrtc-raspberripi-nodejs/ https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=130217 ==== Running OVS and RYU on the PI's (Li Lin's work) ==== {{{ OpenFlow on RPi Li Lin, Regina Hain The goal of this work is to run an OpenFlow controller on a raspberry pi. To do so, we used Open vSwitch to configure the virtual switches on the pi server and Ryu to run the controller and to inject custom flows. There are three major pieces of this project: 1. Use OVS to setup a useful and interesting network 2. Run a custom script with the Ryu controller to install flows and route packets 3. Demoing the system with a streaming webcam application ==Part I: Using OVS to set up a useful and interesting network== =Topology= _______________________________________________________________________ |Pi Server | | ____________ _______________ _______________ | | | BR1 | | BR2 | | BR3 | | | | 10.10.1.1 | PP* | 10.10.2.1 | PP* | 10.10.3.1 | | | | 2|-------|2 3|-------|2 | | | |_____1______| |______1________| |______1________| | | _____|______ ______|________ ______|________ | | |eth1 | |eth2 | |eth3 | | | |10.10.1.x | |10.10.2.x | |10.10.3.x | | | |____________| |_______________| |_______________| | | | | | | | | | | | |________|_____________________|_______________________|________________| | | | _____|______ ______|________ ______|________ | Pi1 | | Pi2 | | Pi3 | | 10.10.1.2 | | 10.10.2.2 | | 10.10.3.2 | |____________| |_______________| |_______________| *: PP means patch port =Description= This setup consists of 4 pi's- one acting as a server 3 as the clients. There are 3 accompanying interfaces on the server- eth1, eth2, eth3, each their own subnet. Additionally, each is connected to a separate OVS bridge. The OVS bridges forward packets to all other bridges via patch ports. =Setup on server= To configure this network, run configure_pt1 =Setup on client= To configure the ip address of client pi's, add the following lines to /etc/dhcpcd.conf depending on its ip address and router values # In pi1 /etc/dhcpcd.conf interface eth0 static ip_address=10.10.1.2/24 static router=10.10.1.1 # In pi2 /etc/dhcpcd.conf interface eth0 static ip_address=10.10.2.2/24 static router=10.10.2.1 # In pi3 /etc/dhcpcd.conf interface eth0 static ip_address=10.10.3.2/24 static router=10.10.3.1 =Test= To test, run ping from one client Pi to another client Pi. Connectivity should be present, via the OVS bridge and patch port topology, between all three client Pi's. =Teardown= To teardown this network, run teardown_pt1 ==Part II: Using Ryu to install flows and route packets over our OVS network== =Topology= _______________________________________________________________________ |Pi Server | | ____________________________________________________________ | | | BR1 | | | | 10.10.1.10 | | | | | | | |_____1_____________________3_______________________2________| | | _____|______ ______|________ ______|________ | | |eth1 | |eth2 | |eth3 | | | |10.10.1.1 | |10.10.1.3 | |10.10.1.2 | | | |____________| |_______________| |_______________| | | | | | | | | | | | |________|_____________________|_______________________|________________| | | | _____|______ ______|________ ______|________ | Pi1 | | Pi2 | | Pi3 | | 10.10.1.4 | | 10.10.1.5 | | 10.10.1.6 | |____________| |_______________| |_______________| Note that this topology is different from that in part I. This is because having 3 bridges added too much unneeded complexity when crafting custom flows. This time we used 1 bridge to connect all three interfaces and connecting them up through separate ports. =RYU Script Description= This script creates a custom flow that matches on any packet coming in on port 1 (source 10.10.1.4) and out on port 3 (destination 10.10.1.5). It forwards that packet as usual, but also creates a duplicate packet, modifies its destination (to the address of pi3) and sends to port 2 (pi 3). The result is that pi3 gets a copy of every packet that is sent from pi1 to pi2. Note that to turn on the special flow, *insert_special_flow* must be set to True in ryu_13_custom.py To see that the custom flow is installed correctly (note that installation will occur only on the first instance of a packet with source 10.10.1.4 and destination 10.10.1.5 captured by our controller), on the server type $ sudo ovs-ofctl dump-flows br1 =Setup= To configure this network, run configure_pt2 Note that step 5, connecting the controller to the bridge, takes the ip address of the server's eth0 interface. This can change based on network and pi. To find the correct ip address to use, in a terminal type $ ifconfig -a =Run= To run the ryu controller with our custom script type: $ ryu-manager ./path/to/ryu_13_custom.py To ensure controller connectivity type: $ sudo ovs-vsctl show and you should see something like this (if connected): Bridge "br1" Controller "tcp:128.89.68.110:6633" is_connected: true =Testing= Ping test On 10.10.1.4 (pi1) type $ ping 10.10.1.5 You will see that 2 different hosts will reply to the pings- both pi2 (10.10.1.5) and pi3 (10.10.1.6). Netcat test On 10.10.1.5 (pi2) type $ nc -l 1234 On 10.10.1.6 (pi3) type $ nc -l 1234 On 10.10.1.4 (pi1) type $ echo "HELLO WORLD" | nc 10.10.1.5 1234 -u You should see that HELLO WORLD should be printed on both pi2 and pi3. This only works in udp mode (-u) and the reason is left as an exercise for the reader. =Teardown= To teardown this network, run teardown_pt2 ==Part III: Demoing via a streaming webcam application== In this demo, pi1 (10.10.1.4) will send raw video bytes captured from its webcam to pi2 (10.10.1.5) via the netcat application. Pi2 will capture the udp packets by using netcat to listen on a specified port and save the data to a pipe file. Pi2 will then run mplayer on the file to output the video to screen. Pi3 will perform the same exact functions as Pi2, and since the controller sends a duplicate copy of every udp packet to Pi3, it can receive and render the webcam video also. On Pi1: 1. Compile the C file used to read data from the webcam $ gcc capturevideo.c -o capturevideo 2. Execute and pipe the output to 10.10.1.5 via netcat $ ./capturevideo -c 1000 -o | nc 10.10.1.5 5000 *. Instructions and code taken from: https://www.raspberrypi.org/forums/viewtopic.php?t=98778&p=685576 On Pi2: 1. If not installed already, install mplayer $ sudo apt-get install mplayer 2. Create a pipe file $ mkfifo video.fifo 3. Call netcat and listen to specified port $ nc.traditional -lu -p 5000 > video.fifo 4. Use mplayer to open video $ mplayer video.fifo -demuxer rawvideo -rawvideo w=640:h=480:format=yuy2 On Pi3: 1. If not installed already, install mplayer $ sudo apt-get install mplayer 2. Create a pipe file $ mkfifo video.fifo 3. Call tcpdump to listen to specified port $ sudo tcpdump -i eth0 udp port 5000 -w video.fifo Note: Netcat will not accept packets because it requires a connection, even when solely listening for udp packets, when the datagram size is over 1500 bytes. 4. Use mplayer to open video $ mplayer video.fifo -demuxer rawvideo -rawvideo w=640:h=480:format=yuy2 }}}