#+TITLE:
#+AUTHOR: Bob Mottram
#+EMAIL: bob@freedombone.net
#+KEYWORDS: freedombox, debian, beaglebone, red matrix, email, web server, home server, internet, censorship, surveillance, social network, irc, jabber
#+DESCRIPTION: Turn the Beaglebone Black into a personal communications server
#+OPTIONS: ^:nil toc:nil
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="freedombone.css" />

#+BEGIN_CENTER
[[file:images/logo.png]]
#+END_CENTER

#+begin_export html
<center><h1>Mesh Network: Images</h1></center>
#+end_export

* Pre-built Disk Images
** Writing many images quickly
There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the *dd* command is used for writing to the target drive, but to write to multiple drives you can use a tool such as [[https://wiki.gnome.org/Apps/MultiWriter][GNOME MultiWriter]].

For example on Arch/Parabola:

#+begin_src bash
sudo pacman -S gnome-multi-writer
#+end_src

Or on Debian based systems:

#+begin_src bash
sudo apt-get install gnome-multi-writer
#+end_src

The MultiWriter tool is also available within mesh client images, so that you can use mesh systems to create more copies of the same system.
** Client images

#+BEGIN_CENTER
[[file:images/mesh_netbook.jpg]]
#+END_CENTER

"Client" isn't exactly the right term, but it's a mesh peer with a user interface. These images can be copied to a USB drive, then you can plug it into a laptop/netbook/desktop machine and boot from it. You will probably also need an Atheros USB wifi dongle (the black protruding object on the left side of the netbook in the picture above), because most built-in wifi usually requires proprietary firmware. In the commands below substitute /dev/sdX with the USB drive device, excluding any trailing numbers (eg. /dev/sdb). The USB drive you're copying to will need to be at least 8GB in size.

#+begin_src bash
sudo apt-get install xz-utils wget
wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz
wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
gpg --verify freedombone-meshclient-i386.img.xz.sig
sha256sum freedombone-meshclient-i386.img.xz
376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8
unxz freedombone-meshclient-i386.img.xz
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync
#+end_src

To get a number of systems onto the mesh repeat the /dd/ command to create however many bootable USB drives you need.

If you're in an emergency and don't have Atheros wifi dongles then there is also an "insecure" image which contains some proprietary wifi drivers which may work with a wider range of laptops. Proprietary drivers *are not recommended* because they're unsupportable and may be exploitable or contain malicious antifeatures which fundamentally compromise the security of the network. However, the trade-off between security/maintainability and simply having the ability to communicate at all may be a valid one in some situations.

#+begin_src bash
sudo apt-get install xz-utils wget
wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz
wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
sha256sum freedombone-meshclient-insecure-i386.img.xz
81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf
unxz freedombone-meshclient-insecure-i386.img.xz
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync
#+end_src

** Router images
Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.
*** Beaglebone Black
#+BEGIN_CENTER
[[file:images/mesh_router.jpg]]
#+END_CENTER

The above picture shows a Beaglebone Black with the image copied onto a microSD card (there's no need to do anything with the internal EMMC). A USB Atheros wifi adaptor with a large antenna is attached and in this case power is from the mains, although it could be from a battery or solar power system capable of supplying 5 volts and maybe 1A (depending upon how active the router is).

#+begin_src bash
sudo apt-get install xz-utils wget
wget https://freedombone.net/downloads/current/freedombone-mesh_beaglebone-armhf.img.xz
wget https://freedombone.net/downloads/current/freedombone-mesh_beaglebone-armhf.img.xz.sig
gpg --verify freedombone-mesh_beaglebone-armhf.img.xz.sig
sha256sum freedombone-mesh_beaglebone-armhf.img.xz
60017999340a6559d1de76f3d78d9771c11de5eeefb3d3b812747ce306251e67
unxz freedombone-mesh_beaglebone-armhf.img.xz
sudo dd bs=1M if=freedombone-mesh_beaglebone-armhf.img of=/dev/sdX conv=fdatasync
#+end_src

If you have a few Beaglebone Blacks to use as routers then repeat the /dd/ command to create however many microSD cards you need.

There is still a software freedom issue with the Beaglebone Black, but it doesn't prevent you from running a fully free system on the board. The TI AM335X SOC has a PowerVR SGX530 GPU which will only run with a proprietary blob, but this would only be an issue for systems with a monitor or LCD screen attached running a desktop environment which also needs GPU acceleration. For "headless" systems such as servers or mesh routers this isn't a problem.

* Building Disk Images
It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.

First you will need to create an image. On a Debian based system (tested on Debian Stretch):

#+begin_src bash
sudo apt-get -y install git wget build-essential
wget https://freedombone.net/downloads/current/freedombone.tar.gz
wget https://freedombone.net/downloads/current/freedombone.tar.gz.sig
gpg --verify freedombone.tar.gz.sig
sha256sum freedombone.tar.gz
3d2a7f2bd7a3475832756b7bb63b96ba5fc4a4f4d7bffe86e685be9a3b41b958
tar -xzvf freedombone.tar.gz
cd freedombone
git checkout stretch
sudo make install
freedombone-image --setup debian
freedombone-image -t i386 -v meshclient
#+end_src

If you don't have Atheros or free software compatible wifi adapter then you can include proprietary wifi drivers which will work with most laptops. This is *NOT RECOMMENDED* because proprietary drivers are unsupportable and may contain either malware or be exploitable in a way which can't be fixed. However, if you're in an emergency and don't have any Atheros or free software wifi USB dongles then you can use the following command to make the image:

#+begin_src bash
freedombone-image -t i386 -v meshclient --insecure yes
#+end_src

This takes a while. Maybe an hour or so, depending on the speed of your system and the internets. The good news though is that once created you can use the resulting image any number of times, and you don't need to trust some pre-built image.

List what drives are on your system with:

#+begin_src bash
ls /dev/sd*
#+end_src

Now plug in the USB thumb drive, and do the same again. Notice which drive letter gets added.

You can now copy the image to the USB thumb drive, replacing *sdX* with the identifier of the USB thumb drive. Don't include any numbers (so for example use *sdc* instead of *sdc1*).

#+begin_src bash
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
sudo dd bs=1M if=myimagefile.img of=/dev/sdX conv=fdatasync
#+end_src

And wait. Again it will take a while to copy over. When that's done plug it into the laptop or netbook which you want to use on the mesh, power on and set the BIOS to boot from the USB stick.

On first boot you'll be asked to set a username, and then you can open the chat client and select the *users* icon to show the Tox IDs for other users on the mesh. When folks join they will be announced.

Rinse, repeat, for any number of laptops that you want to get onto the mesh or to build out coverage within an area. There are no servers. Just peer-to-peer communications routed through the network which are end-to-end secure after a friend request is accepted. By default the chat client doesn't log anything.

You can also use single board computers (SBCs) such as the BeagleBone Black to make mesh routers which can be bolted to walls or the sides of buildings and consume minimal electrical power, so could be solar or battery powered for short term events such as festivals. To do that use the following command to make the image:

#+begin_src bash
freedombone-image -t beaglebone -v mesh
#+end_src

The resulting image can be copied to a microSD card, inserted into a Beaglebone Black and booted. Don't forget to plug in an Atheros USB wifi dongle.
