DebianOn is an effort to document how to install, configure and use Debian on some specific hardware. Therefore potential buyers would know if that hardware is supported and owners would know how get the best out of that hardware.

The purpose is not to duplicate the Debian Official Documentation, but to document how to install Debian on some specific hardware.

If you need help to get Debian running on your hardware, please have a look at our user support channels where you may find specific channels (mailing list, IRC channel) dedicated to certain types of hardware.

AKA How to run Debian on a router with an OpenWRT kernel

Models covered
D-Link DIR-825, hardware revisions B1 and B2. Possibly also other routers which have a working OpenWRT kernel, enough memory and a USB port.

Introduction

The DIR-825 is a wireless router with a 680 MHz MIPS core, 64 MiB RAM, 2 USB buses, 5 ethernet ports and 2 wireless interfaces. It has enough power to work as a small server in addition to routing network traffic. Potential applications are backup storage, network drives, USB printers, IRC screens, torrents etc.

The Debian MIPS port1 however does not have kernel support for this hardware, but fortunately OpenWRT2 does. This guide will show how to install a Debian root file system on a USB drive and how to boot into it using the OpenWRT version 12.xx (Attitude Adjustment) preinit system as a kind of bootloader.

The type of installation described here is likely to work with other OpenWRT supported routers, as long as they have enough memory and some way to access larger storage volumes (i.e. USB).

Overall Status

Core Components

[ATTACH]

Boot Standard Kernel:

{X} / OpenWRT

2 Ethernet interfaces (Atheros AG71xx):

{OK}

Hard drives:

USB drives ok

Extra Features

Ethernet switch (Realtek RTL8366S)

{OK}

2 WLAN interfaces (Atheros AR9280 Rev:2)

{OK}

Serial console

{OK}

LEDs

{OK}

Legend :
{OK} = OK ; {X} Unsupported(No Driver) ; /!\ = Error (Couldn't get it working); [?] Unknown, Not Test ; [-] Not-applicable
{i} = Configuration Required; X-( = Only works with a non-free driver and or firmware

Important Note

This Debian installation is based on the OpenWRT kernel and preinit system. Install OpenWRT on your router and make sure it works before attempting to install Debian. A working and configured OpenWRT system on the internal flash also works as a backup. If the USB drive containing the rootfs breaks, you will lose your Debian server, but at least the network routing still works with OpenWRT. Remember backups.

There is a good chance that the Debian rootfs you are going to set up here does not work straight away (i.e. the network does not come up after first boot), in which case you have no access to the router (also known as bricking). It is recommended that you either solder a serial interface to your router to access the console or at least know how to access and use the OpenWRT failsafe mode BEFORE you start modifying your router firmware.

Installation

Build a custom OpenWRT image

The DIR-825 does not have a floating point unit (FPU) in its MIPS CPU. The binaries in the Debian MIPS port1 use FPU instructions, so the kernel needs to have an FPU emulator. OpenWRT on DIR-825 defaults to softfloat binaries, so its kernel does not contain the emulator by default. Therefore we need to compile a custom version of OpenWRT in order to use Debian binaries.

Installation and usage of the OpenWRT build system are described in OpenWRT wiki. After the SVN checkout and feed update, you need to configure the build to contain the necessary features.

Start menu based configuration in the build directory:

make menuconfig

Set the following options

If you want to use any OpenWRT packages above the bare minimum included in the default configuration (like LuCI, exotic kernel module packages, etc.), it is better to enable them in your custom build. Opkg packages from the official OpenWRT repositories can be installed, but in practice they can have subtle bugs due to the customization used here and small version mismatches.

Finish configuration and start kernel configuration:

make defconfig
make kernel_menuconfig

Set the options

Check the kernel configuration, the following options should be defined in build_dir/linux-ar71xx_generic/linux-3.3.8/.config

CONFIG_MIPS_FPU_EMU=y
CONFIG_USB_SUPPORT=y
CONFIG_BLK_DEV_BSG=y

Compile OpenWRT (this takes a while):

make

New images will be in bin/ar71xx/. Packages suitable for installation with opkg are in bin/ar71xx/packages. If you can put this directory online via a webserver, you have an instant custom OpenWRT repository. Edit /etc/opkg.conf to use it.

Upgrade your router with new images.

Configure OpenWRT

Check that your new router firmware works and configure the router to handle your basic networking setup.

Get a USB (flash) drive and make a swap partition and an ext4 partition for Debian root FS on it (min. 1 GB for root, 256 MB for swap).

Configure OpenWRT for USB storage. Use the block-mount opkg package and its configuration file /etc/config/fstab. The required kernel module packages, like kmod-usb-storage and kmod-fs-ext4 should also be installed. You can use the kernel module packages from the official OpenWRT repos, but the installation with opkg needs to be --forced, since we are using a custom kernel with a mismatching version hash. The modules should work fine despite this, if you did not deviate too much from the default configuration.

You should now have a working configuration for mounting the USB partition (under /mnt for example) and having the swap turned on.

Install and run debootstrap. If your OpenWRT installation does not have ar you also need to install binutils:

opkg install debootstrap binutils

OpenWRT debootstrap is buggy, so you need to copy the file devices.tar.gz from another Debian system to the router:

scp /usr/share/debootstrap/devices.tar.gz root@my-router:/usr/share/debootstrap

Run debootstrap:

debootstrap --arch=mips wheezy /mnt/ http://ftp.de.debian.org/debian

Initial Debian rootfs configuration

Check that the Debian rootfs works by chrooting into it and doing some basic configuration:

chroot /mnt /bin/bash
passwd root
# install ssh etc.
apt-get update
apt-get install ssh wireless-tools vim tmux
# set up mount point for OpenWRT preinit root (IMPORTANT!)
mkdir /rom
# Put a hostname to /etc/hostname
echo my-router > /etc/hostname
# Setup basic networking on the ethernet switch interface eth0
cat <<EOF >> /etc/network/interfaces
>
> auto eth0
> iface eth0 inet static
>     address 192.168.2.1
>     netmask 255.255.255.0
> EOF

Edit /etc/inittab and remove getty's on tty* devices (which do not exist on a headless router). If you have a serial console, enable it in inittab by adding this line

T0:23:respawn:/sbin/getty -L console 115200 vt100

Add the USB swap partition to /etc/fstab, otherwise you risk running out of memory during boot.

# <file system>                 <mount point>   <type> <options> <dump> <pass>
/dev/sda2                       none            swap    sw       0      0

OpenWRT extroot configuration

Set up the external root FS in OpenWRT. The configuration file /etc/config/fstab should have this kind of section:

config mount
    option target '/'
    option fstype 'ext4'
    option options 'rw,sync'
    option enabled '1'
    option enabled_fsck '0'
    option device '/dev/sda1'

The block-mount preinit scripts search for a file called /etc/extroot.md5sum in the external root file system and checks if it matches the file /overlay/.extroot.md5sum in the firmware flash. If it does not, the external rootfs will not be enabled, so you need to copy it to the Debian rootfs.

cp /overlay/.extroot.md5sum /mnt/etc/extroot.md5sum

The extroot scripts need to be modified slightly to allow Debian init to start without problems. Put this script to /lib/preinit/99_10_run_debian_init (so that it sorts second to last in the directory, before 99_10_run_init from block-mount).

run_debian_init() {
    [ -f /etc/debian_version ] || return 0
    preinit_echo "- Debian init -"
    preinit_ip_deconfig
    cd /
    kill $(pidof hotplug2)
    umount /rom/sys
    umount /rom/tmp
    umount /rom/dev/pts
    umount /rom/dev
    if [ "$pi_init_suppress_stderr" = "y" ]; then
            exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd 2>&0
    else
            exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd
    fi
}

boot_hook_add preinit_main run_debian_init

You are now ready to boot the router to Debian. Make sure you have a working serial console, or an ssh capable computer connected to one of the router switch ports and configured with an ip address in the correct subnet, 192.168.2.* if you used the network configuration above.

reboot

Configuration

Internal flash partitions

The preinit system mounts the read-only squashfs part of the OpenWRT root file system under /rom. The modifiable part of the OpenWRT root fs (called overlay in OpenWRT) is a jffs2 file system in the fifth flash partition and can be accessed through the device /dev/mtdblock4.

In OpenWRT the root fs is created by combining /rom with the jffs2 overlay using overlayfs. In Debian the same can be achieved by creating the mount points /overlay and /openwrt-root and adding the following lines to /etc/fstab:

# <file system> <mount point>   <type> <options> <dump> <pass>
/dev/mtdblock4  /overlay        jffs2   ro          0   0
overlayfs       /openwrt-root   overlayfs lowerdir=/rom,upperdir=/overlay 0 0

Note that /overlay is mounted read-only (ro), which also makes the overlayfs mount read only.

Kernel modules

The kernel modules are now available under the overlayfs partition in /openwrt-root/lib/modules.

Installing kernel modules with modprobe needs dependency information written to the module directory by depmod, so they need to be in a writable partition. You need to either mount /overlay and /openwrt-root read-write and link /lib/modules to /openwrt-root/lib/modules, or copy the modules to the Debian root file system. In any case,

depmod -a

needs to be run in order for modprobe to work.

If you want to install new kernel modules, you need to mount /openwrt-root read-write, chroot into it and install the necessary kmod-* packages with opkg.

LEDs

The LEDs in DIR-825 can be controlled with sysfs, with the exception of the 4 ethernet switch indicator LEDs. The necessary drivers will be modprobed during boot, when these two module names are added to /etc/modules

ledtrig_usbdev
ledtrig_netdev

The LED devices can now be controlled with files under /sys/devices/platform/leds-gpio/leds. If you install sysfsutils and add the following lines to /etc/sysfs.conf, the router looks a little less like a christmas tree than the default configuration.

class/leds/d-link:orange:power/trigger = none

class/leds/d-link:blue:planet/trigger = netdev
class/leds/d-link:blue:planet/device_name = eth1
class/leds/d-link:blue:planet/mode = link

class/leds/ath9k-phy0/trigger = netdev
class/leds/ath9k-phy0/device_name = wlan0
class/leds/ath9k-phy0/mode = link

class/leds/ath9k-phy1/trigger = phy1tpt

class/leds/d-link:blue:usb/trigger = usbdev
class/leds/d-link:blue:usb/device_name = 1-1
class/leds/d-link:blue:usb/activity_interval = 100

See the OpenWRT LED documentation for more details.

Network

A normal home router provides a WLAN access point, bridges its LAN interfaces (eth0, wlanX) into a single network, serves DHCP to the local network and does Network Address Translation (NAT) when routing to the external network (WAN). The following will present a configuration which makes this happen with packages ifupdown, bridge-utils, dnsmasq and hostapd.

Hostapd

A basic /etc/hostapd/hostapd.conf

interface=wlan0
driver=nl80211
bridge=br0

country_code=<your country code here>
ieee80211d=1

ssid=<your access point name here>

hw_mode=g
ieee80211n=1
channel=1

wpa=2
wpa_passphrase=<your WPA2 passphrase here>

DNSMasq

Here's a very bare bones, but working, configuration for DNSMasq, /etc/dnsmasq.conf.

domain-needed
bogus-priv
interface=br0
dhcp-range=192.168.1.100,192.168.1.250,36h

ifupdown

The /etc/network/interfaces file of the ifupdown package controls the networking setup on a (non-gui) Debian system. The configuration below gets an IP address for the WAN interface (eth1) from DHCP, bridges the local network interfaces eth0 and wlan0, sets the local network address to 192.168.1.1, starts hostapd and enables NAT.

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet dhcp

allow-hotplug eth0
iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual

auto br0
iface br0 inet static
    bridge_ports eth0 wlan0
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.66.255
    hostapd /etc/hostapd/hostapd.conf
    post-up /bin/echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up /sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

System Summary

lspci

# lspci -nn
00:11.0 Network controller [0280]: Atheros Communications Inc. AR922X Wireless Network Adapter [168c:0029] (rev 01)
00:12.0 Network controller [0280]: Atheros Communications Inc. AR922X Wireless Network Adapter [168c:0029] (rev 01)

lsusb

# lsusb -v | grep -E '\<(Bus|iProduct|bDeviceClass|bDeviceProtocol)' 2>/dev/null
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  bDeviceClass            9 Hub
  bDeviceProtocol         0 Full speed (or root) hub
  iProduct                2 Generic Platform EHCI Controller
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
  bDeviceClass            9 Hub
  bDeviceProtocol         0 Full speed (or root) hub
  iProduct                2 Generic Platform OHCI Controller

Resources

?green/Router


?CategoryEmbeddedComputer CategoryDebianOn