2 Commits

Author SHA1 Message Date
Attila Lendvai
4cdb130d62 use OpenWrt 21.02.7 2023-10-22 23:49:24 +02:00
Attila Lendvai
2d4d07d2a1 decrease memory need of dd while erasing the partition table
this was leading to the OOM killer killing dd.
2023-10-22 21:53:06 +02:00
5 changed files with 58 additions and 108 deletions

View File

@@ -1,48 +1,44 @@
# What
It's a script to build a customized
[OpenWrt](https://openwrt.org/docs/guide-user/start)
[OpenWRT](https://openwrt.org/docs/guide-user/start)
firmware image using
[ImageBuilder](https://openwrt.org/docs/guide-user/additional-software/imagebuilder).
If the generated image is flashed on a router, then during its boot
process it will try to automatically set up
If the generated image is flashed on a device it will try to
automatically set up
[extroot](https://openwrt.org/docs/guide-user/additional-software/extroot_configuration)
on **any (!)** storage device plugged into the USB port (`/dev/sda`),
including your already working extroot pendrive if you plug it in too
late in the boot process.
including your working extroot pendrive if you plug it in only later
in the boot process. Keep in mind that **this will erase any inserted
storage device while the router is in the initial setup phase**!
Unfortunately there's little that can be done at that point to ask the
user for confirmation.
# Why
So that e.g. customers can buy a router on their own, download and flash our custom
So that e.g. customers can buy a router on their own, flash our custom
firmware, plug in a pendrive, and manage their SIP (telephony) node
from our webapp.
I've extracted the generic parts from the above mentioned auto-provision
project because I thought it's useful enough for making it public.
It also serves me well on my own routers ever since then.
# How
You can read more about the underlying technology on the OpenWrt wiki: see e.g. the
You can read more about the underlying technology on the OpenWRT wiki: see e.g. the
[ImageBuilder](https://openwrt.org/docs/guide-user/additional-software/imagebuilder)
page, or the page that lists some other
[ImageBuilder frontends](https://openwrt.org/docs/guide-developer/imagebuilder_frontends).
As for the actual mechanism: custom scripts are baked into the boot
process of the flashed firmware. If the extroot overlay is properly
set up, then these scripts get hidden by it; i.e. they will only be run
set up, then these scripts get hidden by it; i.e. they will only run
when the extroot has failed to mount early in the boot process.
Keep in mind that **this will automatically erase/format any inserted
storage device while the router is in the initial setup phase**!
Unfortunately there's little that can be done at that point to ask the
user for confirmation.
### Building
OpenWrt's ImageBuilder only works on Linux x86_64. To build a firmware, issue the following command:
OpenWRT's ImageBuilder only works on Linux x86_64. To build a firmware, issue the following command:
`./build.sh architecture variant device-profile`, e.g.:
* `./build.sh ath79 generic tplink_tl-wr1043nd-v1`
@@ -54,10 +50,8 @@ Results will be under `build/openwrt-imagebuilder-${release}-${architecture}-${v
To see a list of available targets, run `make info` in the ImageBuilder dir.
If you want to change which OpenWrt version is used, then try editing
the relevant variable(s) in `build.sh`. It's not guaranteed to work
across OpenWrt releases, therefore we keep git branches for the past
releases.
If you want to change which OpenWRT version is used, then edit the relevant variable(s)
in `build.sh`.
### Setup stages
@@ -74,7 +68,7 @@ space), and then reboot.
#### Stage 2: download and install some packages from the internet
Once it rebooted into the new extroot, it will continuously keep trying to install
some OpenWrt packages until an internet connection is set up on the router. You
some OpenWRT packages until an internet connection is set up on the router. You
need to do that manually either by using ssh or the web UI (LuCI).
#### Stage 3, optional
@@ -91,7 +85,7 @@ By default the root passwd is not set, so the router will start telnet with
no password. If you want to set up a password, then edit the stage 2 script:
[autoprovision-stage2.sh](image-extras/common/root/autoprovision-stage2.sh#L53).
If a password is set, then telnet is disabled by OpenWrt and SSH will listen
If a password is set, then telnet is disabled by OpenWRT and SSH will listen
using the keys specified in [authorized_keys](image-extras/common/etc/dropbear/authorized_keys).
Once connected, you can read the log with `logread -f`.
@@ -99,54 +93,43 @@ Once connected, you can read the log with `logread -f`.
# Status
This is more of a template than something standalone, but I use it for
my home routers as is. For more specific applications you most
my home routers as is. You most
probably want to customize this script here and there; search for
`CUSTOMIZE` for places of interest.
Most importantly, **set up a password and maybe add your ssh key** by
adding it to `image-extras/common/etc/dropbear/authorized_keys`.
Most importantly, **set up a password and maybe an ssh key**.
None of this script is hardware specific except `setLedAttribute`,
which is used to provide feedback about the progress of the initial
setup phase. At the time of writing it only works on a few routers
(mostly `ath79` ones), but without this everything should work fine,
if only a bit less convenient.
At the time of writing it only supports a few `ath79` routers out of
the box, but it's easy to extend it. Support for a new router entails
looking up some led names for `setLedAttribute` so that there's
feedback to the user through the blinking of the leds. It should work
fine without that, but it will be less convenient to interact with
your router in the initial setup phase.
# Troubleshooting
## Which file should I flash?
You should consult the [OpenWrt documentation](https://openwrt.org/docs/guide-user/start).
You should consult the [OpenWRT documentation](https://openwrt.org/docs/guide-user/start).
The produced firmware files should be somewhere around
```./build/openwrt-imagebuilder-21.02.0-ath79-generic.Linux-x86_64/bin/targets/ath79/generic/```.
In short:
* You need a file with the name ```-factory.bin``` or ```-sysupgrade.bin```. The former is to
be used when you first install OpenWrt, the latter is when you upgrade an already installed
OpenWrt.
be used when you first install OpenWRT, the latter is when you upgrade an already installed
OpenWRT.
* You must carefully pick the proper firmware file for your **hardware version**! I advise you
to look up the wiki page for your hardware on the [OpenWrt wiki](https://openwrt.org),
to look up the wiki page for your hardware on the [OpenWRT wiki](https://openwrt.org),
because most of them have a table of the released hardware versions with comments on their
status (sometimes new hardware revisions are only supported by the latest OpenWrt, which is
status (sometimes new hardware revisions are only supported by the latest OpenWRT, which is
not released yet).
## Help! The build has finished but there's no firmware file!
If the build doesn't yield a firmware file (```*-factory.bin``` and/or ```*-sysupgrade.bin```):
when there's not enough space in the flash memory of the target device to install everything
then the OpenWrt ImageBuilder prints a hardly visible error into its flow of output and
then the OpenWRT ImageBuilder prints a hardly visible error into its flow of output and
silently continues. Look into [build.sh](build.sh#L31) and try to remove some packages
that you can live without.
## Extroot is not mounted after a `sysupgrade`
In short, this is an OpenWrt issue, and the solution is to mount the extroot
somewhere, and delete `/etc/.extroot-uuid`. More details are available in
[this issue](https://github.com/attila-lendvai/openwrt-auto-extroot/issues/12),
and a way to deal with it can be found in
[this blog post](https://blog.mbirth.de/archives/2014/05/26/openwrt-sysupgrade-with-extroot.html).
You may also want to check out the
[official OpenWrt wiki](https://openwrt.org/docs/guide-user/additional-software/extroot_configuration#system_upgrade)
on this topic.

View File

@@ -1,8 +1,4 @@
#!/usr/bin/env bash
# Note: this runs as-is, pretty much without external
# dependencies. The OpenWrt ImageBuilder contains the toolchain and
# everything that is needed to build the firmware images.
#!/bin/sh
set -e
@@ -10,13 +6,13 @@ TARGET_ARCHITECTURE=$1
TARGET_VARIANT=$2
TARGET_DEVICE=$3
BUILD="$(dirname "${0}")/build/"
BUILD="$(readlink -f "${BUILD}")"
BUILD=`dirname "$0"`"/build/"
BUILD=`readlink -f $BUILD`
###
### chose a release
###
RELEASE="22.03.5"
RELEASE="21.02.7"
IMGBUILDER_NAME="openwrt-imagebuilder-${RELEASE}-${TARGET_ARCHITECTURE}-${TARGET_VARIANT}.Linux-x86_64"
IMGBUILDER_DIR="${BUILD}/${IMGBUILDER_NAME}"
@@ -34,16 +30,15 @@ if [ -z ${TARGET_DEVICE} ]; then
echo " $0 ath79 generic tplink_archer-c6-v2"
echo " $0 ath79 generic tplink_tl-wdr4300-v1"
echo " $0 bcm53xx generic dlink_dir-885l"
echo " (this last one will not work without editing build.sh, details: https://github.com/attila-lendvai/openwrt-auto-extroot/pull/15#issuecomment-405847440)"
echo " to get a list of supported devices issue a 'make info' in the OpenWRT image builder directory:"
echo " '${IMGBUILDER_DIR}'"
echo " the build results will be under '${IMGBUILDER_DIR}/bin/targets/'"
kill -INT $$
fi
# the absolute minimum for extroot to work at all (i.e. when the disk is already set up, for example by hand).
# this list may be smaller and/or different for your router, but it works with my ath79.
# blockdev is needed to re-read the partition table using `blockdev --rereadpt /dev/sdX`
PREINSTALLED_PACKAGES="block-mount kmod-fs-ext4 kmod-usb-storage blockdev"
PREINSTALLED_PACKAGES="block-mount kmod-fs-ext4 kmod-usb-storage"
# some kernel modules may also be needed for your hardware
#PREINSTALLED_PACKAGES+=" kmod-usb-uhci kmod-usb-ohci"
@@ -52,41 +47,34 @@ PREINSTALLED_PACKAGES="block-mount kmod-fs-ext4 kmod-usb-storage blockdev"
PREINSTALLED_PACKAGES+=" blkid mount-utils swap-utils e2fsprogs fdisk"
# the following packages are optional, feel free to (un)comment them
PREINSTALLED_PACKAGES+=" wireless-tools firewall4"
PREINSTALLED_PACKAGES+=" wireless-tools firewall iptables"
PREINSTALLED_PACKAGES+=" kmod-usb-storage-extras kmod-mmc"
PREINSTALLED_PACKAGES+=" ppp ppp-mod-pppoe ppp-mod-pppol2tp ppp-mod-pptp kmod-ppp kmod-pppoe"
PREINSTALLED_PACKAGES+=" luci"
# you exclude packages with this to shrink the image for
# routers with smaller flash storage.
# SAVE_SPACE_PACKAGES=" -ppp -ppp-mod-pppoe -ip6tables -odhcp6c -kmod-ipv6 -kmod-ip6tables -ath10k"
SAVE_SPACE_PACKAGES=""
mkdir -pv ${BUILD}
PREINSTALLED_PACKAGES+=${SAVE_SPACE_PACKAGES}
mkdir -pv "${BUILD}"
rm -rf "${IMGTEMPDIR}"
cp -r image-extras/common/ "${IMGTEMPDIR}"
PER_PLATFORM_IMAGE_EXTRAS="image-extras/${TARGET_DEVICE}/"
if [ -e "${PER_PLATFORM_IMAGE_EXTRAS}" ]; then
rsync -pr "${PER_PLATFORM_IMAGE_EXTRAS}" "${IMGTEMPDIR}/"
rm -rf $IMGTEMPDIR
cp -r image-extras/common/ $IMGTEMPDIR
PER_PLATFORM_IMAGE_EXTRAS=image-extras/${TARGET_DEVICE}/
if [ -e $PER_PLATFORM_IMAGE_EXTRAS ]; then
rsync -pr $PER_PLATFORM_IMAGE_EXTRAS $IMGTEMPDIR/
fi
if [ ! -e "${IMGBUILDER_DIR}" ]; then
pushd "${BUILD}"
if [ ! -e ${IMGBUILDER_DIR} ]; then
pushd ${BUILD}
# --no-check-certificate if needed
wget --continue "${IMGBUILDERURL}"
xz -d <"${IMGBUILDER_ARCHIVE}" | tar vx
wget --continue ${IMGBUILDERURL}
xz -d <${IMGBUILDER_ARCHIVE} | tar vx
popd
fi
pushd "${IMGBUILDER_DIR}"
pushd ${IMGBUILDER_DIR}
make image PROFILE=${TARGET_DEVICE} PACKAGES="${PREINSTALLED_PACKAGES}" FILES=${IMGTEMPDIR}
pushd "bin/targets/${TARGET_ARCHITECTURE}/"
ln -sf ../../../packages .
pushd bin/targets/${TARGET_ARCHITECTURE}/
ln -s ../../../packages .
popd
popd

View File

@@ -32,15 +32,7 @@ case $(board_name) in
autoprovisionUSBLed="green:wps"
autoprovisionStatusLed="green:wlan5g"
;;
*tl-wdr3600* | *tl-wdr4300*)
autoprovisionUSBLed="green:wlan2g"
autoprovisionStatusLed="green:wlan5g"
;;
*mynet-n750*)
autoprovisionUSBLed="blue:wps"
autoprovisionStatusLed="blue:wireless"
;;
*archer-c7-v1*)
*tl-wdr4300*)
autoprovisionUSBLed="green:wlan2g"
autoprovisionStatusLed="green:wlan5g"
;;

View File

@@ -23,7 +23,7 @@ getPendriveSize()
hasBigEnoughPendrive()
{
local size=$(getPendriveSize)
if [ $size -ge 100000 ]; then
if [ $size -ge 600000 ]; then
log "Found a pendrive of size: $(($size / 2 / 1024)) MB"
return 0
else
@@ -31,24 +31,14 @@ hasBigEnoughPendrive()
fi
}
rereadPartitionTable()
{
log "Rereading partition table"
blockdev --rereadpt /dev/sda
}
setupPendrivePartitions()
{
log "Erasing partition table"
# erase partition table
dd if=/dev/zero of=/dev/sda bs=1k count=256
rereadPartitionTable
log "Creating partitions"
# sda1 is 'swap'
# sda2 is 'root'
# sda3 is 'data', if there's any space left
# sda3 is 'data'
fdisk /dev/sda <<EOF
o
n
@@ -74,7 +64,7 @@ q
EOF
log "Finished partitioning /dev/sda using fdisk"
rereadPartitionTable
sleep 2
until [ -e /dev/sda1 ]
do

View File

@@ -12,8 +12,6 @@ installPackages()
do
log "opkg update failed. No internet connection? Retrying in 15 seconds..."
sleep 15
# Initiate a synchronous time update.
ntpd -d -q -n -p openwrt.pool.ntp.org
done
signalAutoprovisionWorking
@@ -32,12 +30,12 @@ installPackages()
# CUSTOMIZE
# install some more packages that don't need any extra steps
opkg install lua luci ppp-mod-pppoe screen mc unzip logrotate
opkg install lua luci ppp-mod-pppoe screen mc zip unzip logrotate
# this is needed for the vlans on tp-link 3020 with only a single hw ethernet port
opkg install kmod-macvlan ip
# just in case if we were run in a firmware that didn't already have luci
# just in case if we were run in a firmware that didn't already had luci
/etc/init.d/uhttpd enable
}
@@ -52,9 +50,8 @@ autoprovisionStage2()
else
signalAutoprovisionWorking
log "Starting ntpd to update system time; otherwise the openwrt.org certificates are rejected as not yet valid."
# Added -l hoping that it may help against ntpd quitting.
ntpd -l -N -p openwrt.pool.ntp.org
echo Updating system time using ntp; otherwise the openwrt.org certificates are rejected as not yet valid.
ntpd -d -q -n -p 0.openwrt.pool.ntp.org
# CUSTOMIZE: with an empty argument it will set a random password and only ssh key based login will work.
# please note that stage2 requires internet connection to install packages and you most probably want to log in