Installing OpenWRT on EdgeRouter Lite
This installation procedure does not require any extra hardware beyond a Phillips screwdriver to open the router box. I believe it is completely reversible and (hopefully) does not void your warranty.
Objective: replace EdgeOS on your EdgeRouter Lite by a recent version of
OpenWRT picked from the LEDE project.
- A powerful Linux box, preferrably a multi-proc 64-bit machine with tons of RAM. This will only be used just once to compile OpenWRT.
- An extra USB thumb drive. Its dimensions should be short: less than a few centimeters, otherwise it won’t fit inside the box.
Ok now off to build an OpenWRT image:
. Log onto your Linux box
. Download the latest sources from LEDE project:
git clone https://github.com/lede-project/source cd source
. Prepare the tree for compilation for ERLITE:
You will have to select a number of options to build an image tailored to
the EdgeRouter Lite. I could put here a ready-made config file but as these
things tend to evolve quickly, it would probably be obsolete in a matter of
days. So bear with me: start the configuration with
. Target System: Cavium Networks Octeon
. Target Profile: Ubiquiti EdgeRouter Lite
. Target Images: make sure ‘ext4’ is selected, then Select that line to
open up a menu for ext4 configuration. Change the number of inodes to
60,000 instead of the default 6,000. Also select GZip images, and finally modify the root filesystem partition size to something more comfortable,
say 500 MB. This space will be taken off your USB stick so if you have
more space you can increase that to whatever you have. With 500 MB you
should have enough space to put all the packages you need.
. Global build settings: select Select all kernel module packages by
Beyond that take your pick for packages you want included by default in
your image. My selection is:
- Base system: base-files, block-mount, busybox, ca-bundle, ca-certificates, dnsmasq, dropbear, firewall, fstools, jsonfilter, lede-keyring, libc, libgcc,
libpthread, librt, libstdcpp, mtd, netifd, opkg, procd, rpcd, sqm-scripts, sqm-scripts-extra, swconfig, ubox, ubus, ubusd, uci, usign
- Administration: sudo
- Development: ar, binutils, gcc, gdb, make, objdump
- Kernel modules: everything should already be selected as module. You want
to change some of these to be compiled into the kernel otherwise it will
fail to find the ext4 root on USB:
- Filesystems: select kmod-fs-ext4, kmod-fs-msdos
- USB Support: kmod-usb-core, kmod-usb-storage, kmod-usb-storage-extras
- Languages: select whatever programming languages you want to see in a
default install. I usually make sure at least Lua and Python are selected.
- LuCI: make sure LuCI is selected. Take your pick for applications you
want to install. I usually select luci-app-openvpn, luci-app-commands,
- Network: if you want your router to act as an OpenVPN client or server,
make sure it is selected under VPN. Pick either openvpn-openssl or openssl-polarssl.
- Utilities: bash, bc, file, grep, gzip, less, lsof, openssl-util, strace, tar, tmux, usbutils
Feel free to select more packages but each additional one will take extra
. Type ‘make’ and let the magic go on.
. When finished, the result is stored as:
This file contains everything we need to build a bootable USB drive for
the EdgeRouter Lite. This file should be 500 MB large since you
selected that size above for your root filesystem, but it is mostly made
of zeroes so if you use bzip2 you should be able to reduce its size to a
more manageable 50-60 MB, which is more convenient if you need to toss it
around the network.
. Put the sysupgrade.tar file onto a local Linux machine and extract it:
tar xvf lede-octen-erlite-ext4-sysupgrade.tar
. The directory contents are:
sysupgrade-erlite/ sysupgrade-erlite/kernel sysupgrade-erlite/root sysupgrade-erlite/CONTROL
. Now insert your USB thumb drive into a local Linux machine and prepare
the filesystem. We need a first (small) FAT32 partition to hold the kernel,
a second 500 MB partition to hold the root:
fdisk /dev/sdX # Where X is the letter assigned to your USB drive New partition: 1, 32 MB in size, type c (WIN95 FAT32 LBA) New partition: 2, 500 MB in size, type Linux (default) Optional: New partition: 3, the rest of your drive, type Linux (default) Make the first partition bootable (a). Type 'w' to save your changes. Create the FAT32 filesystem with: mkfs.vfat /dev/sdX1
. The default uboot configuration on the EdgeRouter Lite wants a file
called ‘vmlinux.64’ in the first (DOS) partition, so let’s do just that:
mount /dev/sdX1 /mnt # Mount the DOS partition cp sysupgrade-erlite/kernel /mnt/vmlinux.64 umount /mnt
. Dump the root filesystem contents onto the second partition:
dd if=sysupgrade-lite/root of=/dev/sdX2 bs=1M
. If you have a third partition, create a new filesystem on it with:
. You are done with the USB drive!
. Open the EdgeRouter Lite. There are three small screws to remove on the
back. The box slides open if you push gently.
. Remove the existing USB stick inserted in the reader on the motherboard.
Be gentle: you need to insist a bit to take it off but it is not stuck.
. Insert the USB drive you prepared. Close the box, put the screws back,
and boot the router.
. If you connect a PC to the central NIC (labeled eth1) you should receive
an address on 192.168.1.0/24 from which you can ssh to 192.168.1.1 or open
a browser to http://192.168.1.1
. Welcome to OpenWRT/LEDE! Set a root password and you should be done.
The first things you probably want to do:
- Change interface names to associate eth0 to WAN, and bridge eth1 and eth2 to
- Edit the configuration to mount the third partition on the USB drive on /home. This is cool to add non-root users and give them a real flash storage.
- Run ‘opkg update’, install missing packages.
- Install OpenVPN configurations and test them.
- Add ssh keys for root login in /etc/dropbear/authorized_keys
- Install dotfiles to feel at home
Problems I have seen and their solutions:
The LEDE build is not so robust, sometimes it fails in parallel mode
because some dependencies seem to be compiled too late. If you get
compilation errors, using ‘make -j1’ should solve all issues. On a powerful
server with tons of RAM you need 2-3 hours to compile the whole set,
depending on how many packages you selected.
The version of LEDE you just compiled will quickly be out of sync with the
official package repositories. As soon as the kernel is changed in the LEDE project HEAD, all kmod packages from the LEDE repositories will refuse to install with opkg. This is the reason why you had to select “Build all kernel modules” in menuconfig: all kernel modules are already part of the image you created. This problem should go away once LEDE has released its first stable version.
I had most trouble with the ext4 filesystem definition: my first attempt
generated an ext4 of 50 MB which is far too small. After increasing that
size to 1GB, I still ran into “not enough disk space” errors and figured
out the number of inodes was too low (6,000). If you install a lot of
packages you need more inodes. Both points are addressed in the above
procedure. I also tried with an insanely high number (600k inodes) and the
resulting filesystem cannot be mounted.
Filesystem size is indicated in bytes, but fdisk counts in MB, based on a
power of 2. This yields a small discrepancy between the 500MiB filesystem
you generated with the build and the 500MB you reserved in the partition
Once up and running, my router quickly ran into starvation problems. One
machine on the network could use the whole bandwidth and cut off every
other machine. I installed QoS packages: sqm-scripts, sqm-scripts-extra,
and luci-app-sqm, configured the queue to a fair scheduler, and got rid of
starvation issues. For some reason I could not get the pre-compiled
versions of these packages to work, I had to re-install them from official
I wanted to add a Samba server to be able to use the rest of the USB drive
as a shared space but it is not a good idea. Samba takes ages to compile
and the daemon uses too many resources for such a small piece of hardware.
If you want to add ssh keys for the root user, remember the default ssh
server is dropbear, not openssh. dropbear expects root ssh keys to be
stored in /etc/dropbear/authorized_keys. You can also add root ssh keys
The default shell for root is /bin/sh. You can change it to /bin/bash after
installing it and modifying the root entry in /etc/passwd.
Enjoy your fancy new router!