How to build OpenWrt minimal image, or a custom firmware

OpenWrt needs no further introduction, straight to the point, as OpenWrt is bloating day by day, so how to build OpenWrt minimal image that will fit in routers with 4 MB flash storage, with enough free space to install some other packages later.

  • One solution is to use extroot when a USB port is available on the router,  but it’s not always possible or you may want to use the USB port for some other purpose, like adding a USB Wi-Fi dongle. Though using a USB hub is possible, but I think this will create a reliability issue.
  • Now another problem, with OpenWrt  Chaos Calmer 15.05 or 15.05.1 or any above release, you can’t just use extroot on routers with 4 MB flash, even the router have a USB port. Simply there is not enough space to install necessary packages for extroot on the default OpenWrt build, at least in my case.

So that’s the point, let’s get started.


1. Download the OpenWrt image builder

First you need to determine your router platform, i.e. the CPU architecture,  MIPS or ARM or x86 etc. etc.

In my case, the router is TP-Link MR3220, AR9331 SoC, where the CPU is 32bit MIPS big endian. In OpenWrt this platform is called ar71xx.

So I’ve to download the OpenWrt Chaos Calmer 15.05.1 image builder for the ar71xx platform, and the router falls under generic category.

You can download the image builder for other different platforms here > .


2. Get image builder working

You’re going to need a working 64 bit Linux distro to get the image builder working, most probably you are running one, and basic knowledge of using command line tools of course.

Extract the image builder to wherever you want, i.e. under the home folder of the Linux distro.

 tar -xf OpenWrt-ImageBuilder-15.05.1-ar71xx-generic.Linux-x86_64.tar.bz2 -C ~/  

You can rename the folder to get rid of it’s unnecessarily long name.

Now install some software like GNU make and others, necessary for compiling linking and building the firmware.

For Debian, Ubuntu or any other Debian based distro, install build-essential package, this will install the rest.

 sudo apt-get install build-essential 

Now go to the folder where you extracted the OpenWrt image builder,

 cd ~/OpenWrt-ImageBuilder 

Now check if the image builder is working properly or not.

 make help 

If everything properly configured, it should print few lines of help text.


3. Choose which packages to add and remove

This step is important one, you’ve to find out which packages you want to add or remove, without compromising stability.

I’m removing the LuCI and related packages to build OpenWrt custom firmware small, i.e. few hundred KB extra free space after installing. Bellow the package list I want to remove.

libiwinfo-lua liblua libubus-lua libuci-lua
lua luci luci-app-firewall luci-base luci-lib-ip
luci-lib-nixio luci-mod-admin-full luci-proto-ipv6
luci-proto-ppp luci-theme-bootstrap uhttpd uhttpd-mod-ubus

You can safely remove all IPv6 related packages instead of LuCI to save some free space on the router.

I also want to add few extra packages to get extroot working right after the flashing without installing anything extra. Here are these extra packages.

kmod-fs-ext4 kmod-usb-storage kmod-scsi-core
block-mount kmod-lib-crc32c kmod-crypto-crc32c

Note:  The two package, kmod-lib-crc32c and kmod-crypto-crc32c are required if you want to use ext4 filesystem.


4. Build the installable OpenWrt image

Now build the openwrt minimal image, use the make info command to get available build profile and select a suitable profile.

The PACKAGES variable is used to add or remove the packages to the final build, add a minus(-) sign before the package you want to exclude.

A complete make command, don’t forget to change it according to your configuration and router.

 make -j4 image PROFILE=TLMR3220 PACKAGES="-libiwinfo-lua -liblua -libubus-lua -libuci-lua -lua -luci -luci-app-firewall -luci-base -luci-lib-ip -luci-lib-nixio -luci-mod-admin-full -luci-proto-ipv6 -luci-proto-ppp -luci-theme-bootstrap -uhttpd -uhttpd-mod-ubus kmod-fs-ext4 kmod-usb-storage kmod-scsi-core block-mount kmod-lib-crc32c kmod-crypto-crc32c" 

The above command is very long, better to copy it to somewhere for analysis. Bellow the same command, but broken down into parts.

make -j4 image PROFILE=TLMR3220 PACKAGES=\
  "-libiwinfo-lua -liblua -libubus-lua -libuci-lua -lua \
   -luci -luci-app-firewall -luci-base -luci-lib-ip \
   -luci-lib-nixio -luci-mod-admin-full -luci-proto-ipv6 \
   -luci-proto-ppp -luci-theme-bootstrap -uhttpd -uhttpd-mod-ubus \
    kmod-fs-ext4 kmod-usb-storage kmod-scsi-core block-mount \
    kmod-lib-crc32c kmod-crypto-crc32c"

When the build is complete you can get the flashable OpenWrt images under the image builder’s bin folder, in my case it’s under ~/OpenWrt-ImageBuilder/bin/ar71xx/ .


5. Before flashing the OpenWrt custom firmware

Before flashing openwrt, check the size of the flashable bin file, the squashfs factory image is around 3.8 MB for routers with 4 MB flash, precisely 3932160 bytes,  double check it before flashing.

 du -b openwrt-15.05.1-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin 

Flash the new openwrt minimal build the way you like to do it, from the web interface or via sysupgrade command or whatever.

Now you can see few hundred KB more free space after SSHing to the router.

Also don’t forget to use an UPS to power up the router if you are facing frequent power cuts, as I have to, if power goes middle of the flashing, that will surely brick the router.


So that’s it how to build your own custom OpnWrt firmware, and hopefully this guide is easy to understand for everyone. Also don’t forget to share this if you thinks it’s helpful.

61 Responses

  1. now i’m trying it on my raspberry pi 3, shifting root on usb then will install web server.

  2. one more question, the usb drive take to much time to format into ext4, size is 64 Gb 3.0. It takes 4 to 5 hours to format :/

  3. i’m now doing it with raspberry pi it also has same structure and i also have to make setting for booting with usb, the main problem is formatting the usb drive, it takes to much time (Windows 10, 64 bit, 4 Gb Ram)

  4. if i succedded on raspberry pi then i will again try on openwrt router mr3220

  5. i format my usb to fat32 it will format in less than 1 minutes but for ext4, 4 hours

Leave a Reply

Your email address will not be published. Required fields are marked *