Getting started with OpenWrt

2014-01-10 19:28

My last encounter with embedded Linux distributions dates back to August 2005, leveraging Familiar Linux on an iPaq in order to port an Apache + PHP + MySQL application to a thttpd + PHP (using CGI) one to be usable directly on what was a widely available PDA at the time.

Clearly, it had been a while and I'm now doing some experiments with OpenWrt (an embedded Linux distribution targeted at residential gateways and routers) on a TP-LINK TL-MR3020 pocket router. The main reason behind this is that I've been focusing a lot on DNS during the last few years and have been wanting to do DNSSEC validation at the router level, which I will document in another article.

The TL-MR3020 embeds an Atheros AR7240 CPU (MIPS architecture) running at 400MHz, 32MiB of RAM, 4MiB of Flash, a 100 MBit Ethernet port, and most importantly an USB 2.0 port allowing to plug a flash drive and extend storage space.

Here is the result of running cat /proc/cpuinfo on this device:

root@OpenWrt:~# cat /proc/cpuinfo system type : Atheros AR9330 rev 1 machine : TP-LINK TL-MR3020 processor : 0 cpu model : MIPS 24Kc V7.4 BogoMIPS : 265.42 wait instruction : yes microsecond timers : yes tlb_entries : 16 extra interrupt vector : yes hardware watchpoint : yes , count: 4, address/irw mask: [ 0x0000, 0x0008, 0x0008, 0x0730] ASEs implemented : mips16 shadow register sets : 1 kscratch registers : 0 core : 0 VCED exceptions : not available VCEI exceptions : not available

LuCI web interface

One of the best part of using OpenWrt instead of stock firmware is the gorgeous interface, which is uncluttered and responsive.

Here are some captures:

Installing packages

OpenWrt uses the opkg package manager (originally forked from ipkg) which makes it really easy to install software packages.

opkg must have one sub-command argument usage: opkg [ options...] sub-command [ arguments...] where sub-command is one of: Package Manipulation: update Update list of available packages upgrade <pkgs> Upgrade packages install <pkgs> Install package ( s ) configure <pkgs> Configure unpacked package ( s ) remove <pkgs|regexp> Remove package ( s ) flag <flag> <pkgs> Flag package ( s ) <flag> = hold|noprune|user|ok|installed|unpacked ( one per invocation )

Using an USB flash drive to extend storage space

First, we need to install required packages and kernel modules in order to be able to use and mount USB external storage devices.

For ext4 support:

opkg install block-mount kmod-usb-storage kmod-fs-ext4

Then we can configure OpenWrt to use a root filesystem on external storage (extroot) by using one of the following methods: external root (pivot root), or external overlay (pivot overlay).

Swap

This device has 32Mb of RAM which can easily be exhausted, so we are going to set the swap space to double that amount:

dd if = /dev/zero of = /swapfile count = 65536 bs = 1k mkswap /swapfile swapon /swapfile

We can check that swap is enabled using the free command:

total used free shared buffers Mem: 29212 23548 5664 0 2032 -/+ buffers: 21516 7696 Swap: 65532 0 65532

To activate the swap file at boot time, we need to add the following directives in /etc/config/fstab:

config swap option device /swapfile

And enable fstab autostart at boot time:

/etc/init.d/fstab enable

Things to do on OpenWrt

IRC related stuff

IRCing from the console is something I have fond memories of, and I vividly remember using IrcII and especially BitchX (which came packed with some really nice ASCii and ANSi art logos). Nowadays I still use IRC from time to time to get my dose of nostalgia and I'm using irsii for this purpose.

There are some other IRC related packages available such as psyBNC (a permanent IRC-Bouncer) and bitlbee (an IRC instant messaging gateway).

Download service

OpenWrt comes with several packages for downloading torrents directly from command line: ctorrent (which for some reasons keeps crashing my router), rtorrent, or transmission-cli.

Media server

Thanks to MiniDLNA, it is possible to stream audio, pictures and video content to DLNA/UPnP AV compatible devices such as Smart TVs.

Here is a minimal configuration file: /etc/minidlna.conf

port = 8200 network_interface = br-lan friendly_name = OpenWrt db_dir = /mnt/sda1/minidlna/db media_dir = A,/mnt/sda1/audio media_dir = P,/mnt/sda1/pictures media_dir = V,/mnt/sda1/videos

Serving static content

Nginx, my favorite web server, is of course available as a package on OpenWrt and can be leveraged to serve static content. As the LuCI web interface is running on port 80, we need to change nginx configuration in order to use a different port, for example 8080.

Here is a minimal configuration file: /etc/nginx/nginx.conf

user nobody nogroup ; worker_processes 1 ; events { worker_connections 1024 ; } http { include mime.types ; server { listen 8080 ; server_name localhost ; location / { root /etc/nginx/html ; index index.html ; } } }

Networking stuff

Being a router targeted Linux distribution, there are of course lots of interesting network related packages available such as DNS servers, IPv6 tunnels, VPN software, and so far and so on. I will post some detailed articles about using OpenWrt for such purposes in the following weeks, so stay tuned!