Build Script to Compile Custom Firmware for Devices with Small Memory

Script Features

  • Download and install necessary dependencies for compiling OpenWrt.
  • Download OpenWrt 18.06.4 tar.gz from the OpenWrt Releases page. This can be changed by editing the script.
  • Download and install OpenWrt Feeds.
  • Minify CSS, JS, and Lua files from the OpenWrt Feeds.

View the script here.


Instructions to Compile Firmware

1. Download and execute script

Note:This script follows the Quick Image Building Guide. Refer to this guide to understand how this script works.

  • Download script

wget -qO optimize-openwrt.sh https://gist.githubusercontent.com/sanchezpe/0d58591d128b31b7050e28b376f21981/raw

  • Optional: Edit the script to download a different OpenWRT release. For example, change line 15 in the script from:
    wget -qO openwrt.tar.gz https://github.com/openwrt/openwrt/archive/v18.06.4.tar.gz
    to:
    wget -qO openwrt.tar.gz https://github.com/openwrt/openwrt/archive/v17.01.7.tar.gz

  • Run script

chmod +x optimize-openwrt.sh
./optimize-openwrt.sh

  • Wait for a few minutes until the script finishes the execution.

  • Go to the directory where OpenWrt tar.gz was extracted.

cd openwrt

2. Free space

Note: Refer to the Saving firmware space guide for more information.

  • Open the make menuconfig window.

make menuconfig

  • Free space by changing the following settings in the make menuconfig window:
Target System
	(X) Atheros AR7xxx/AR9xxx
	
Subtarget (Generic)
	(X) Devices with small flash
	
Target Profile (Default Profile (all drivers))
	(X) Multiple devices 

Target Devices
	[*]{Select your router}

Target Images
	[*] squashfs (NEW)
		(256) Block size (in KiB)
			1024

Kernel modules
	Wireless Drivers
		kmod-mac80211
			[ ]   Export mac80211 internals in DebugFS
			[ ]   Enable 802.11s mesh support
	USB Support
		[ ]{Disable all options}

Global build settings
	Kernel build options
		[ ] Enable support for printk
		[ ] Crash logging
		[ ] Compile the kernel with debug filesystem enabled
		[ ] Support for paging of anonymous memory (swap)
		[ ] Compile the kernel with symbol table information
		[ ] Compile the kernel with debug information
		[ ] Compile the kernel with SysRq support
		[ ] Enable process core dump support
		[ ] Enable printk timestamps
	
	[ ] Enable IPv6 support in packages *OPTIONAL
	[*] Strip unnecessary exports from the kernel image
	[*] Strip unnecessary functions from libraries

3. Add Packages

  • Add desired packages. For example, to add LuCI, Adblock, DDNS, OpenVPN, QoS, UPnP, Wake-on-LAN packages for LuCI, mbed TLS and mbed TLS for OpenVPN, change the following settings in the make menuconfig window:
LuCI
	1. Collections
		<*> luci
	2. Modules
		[*] Minify Lua sources
	3. Applications
		<*> luci-app-adblock
		<*> luci-app-ddns
		<*> luci-app-openvpn
		<*> luci-app-qos OR <*> luci-app-sqm
		<*> luci-app-upnp
		<*> luci-app-wol
		
Libraries
	<*> libustream-mbedtls

Network
	VPN
		<*> openvpn-mbedtls

Note: Keep in mind that routers with 4MB flash will not be able to store many packages. Refer to OpenWrt Packages Table for more information about packages size.

  • Save your changes and exit.

3. Optimize kernel configuration

  • Open the make kernel_menuconfig window.

make kernel_menuconfig CONFIG_TARGET=ar71xx

  • Wait for a few minutes until the kernel compiles and the make kernel_menuconfig window appears.

  • Change the following settings in the make kernel_menuconfig window:

Machine selection
	Atheros AR71XX/AR724X/AR913X machine selection
		[*]{Select your router, if available}
	
Device Drivers
	Character devices
		Serial drivers 
			< > 8250/16550 and compatible serial support
	[ ] USB support

File systems
	Miscellaneous filesystems
		[*]     Additional option for memory-constrained systems
		(3)       Number of fragments cached
			1

Kernel hacking
	[ ] Early printk
  • Save changes and exit.

4. Compile firmware

  • Compile firmware using make.

make -i -j1 V=s 2>&1 | tee build.log | grep -i error

  • Wait until compilation finishes. This could take a long time.

  • Navigate to the directory that contains the compiled firmware images

cd /bin/targets/ar71xx/

2 Likes

suggest removing/commenting out apt upgrade...

nice writeup!

curious how much space this, or any of the tweaks/tradeofs is saving.

LuCI's images are already precompressed AFAIK. There's not a lot to be gained there but every bit helps on 4 MB.