20 Commits

Author SHA1 Message Date
Attila Lendvai
7a3ae89b20 added a manifest.scm for guix 2023-10-23 00:09:19 +02:00
Attila Lendvai
0d4d33409e set SOURCE_DATE_EPOCH
without this the image builder fails.

this might be connected to the inability of the configure script to
properly detect git on guix, but not likely.
2023-10-22 22:48:41 +02:00
Attila Lendvai
836235e656 use OpenWrt 19.07.9 2023-10-22 22:22:22 +02:00
Attila Lendvai
ab6816284f decrease memory need of dd while erasing the partition table
this was leading to the OOM killer killing dd.
2023-10-22 21:53:49 +02:00
Attila Lendvai
725caf2919 update to 19.07.6 2021-02-14 16:02:41 +01:00
Attila Lendvai
63806ccfe5 add shell.nix and make it work on nixos 2021-02-14 10:05:02 +01:00
Attila Lendvai
527bbf214c Update README.md 2021-01-12 14:21:18 +01:00
Attila Lendvai
74b2a4d989 readme: update openwrt wiki links, add some extra words 2020-12-03 21:16:01 +01:00
Attila Lendvai
7a39ab9adc readme 2020-11-29 23:43:14 +01:00
Attila Lendvai
f9cdbd39ef update for 19.07.4
no changes were needed, all seems to still work
2020-11-29 23:07:02 +01:00
Attila Lendvai
75b8e35aa7 fix the gitignore mess: git refuses to ignore already tracked files 2020-11-29 23:07:02 +01:00
Attila Lendvai
85e367523a update to openwrt 18.06.1
tested with ./build.sh ar71xx generic tl-wr1043nd-v1
2019-01-06 18:40:27 +01:00
Attila Lendvai
38a96e37e0 small note into the usage about the imagebuilder URL 2018-07-18 10:17:01 +02:00
Attila Lendvai
0381c6f40b small adjustments after the lede -> openwrt re-rename. 2018-06-26 23:26:25 +02:00
Martin Friedrich
a761fb7630 Changed to openwrt imagebuilder, back to release instead of snapshots 2018-06-26 22:40:35 +02:00
Martin Friedrich
e96f2d38cc Changed to openwrt imagebuilder, back to release instead of snapshots 2018-06-26 22:40:35 +02:00
Martin Friedrich
4a1e765a85 Changed README to openwrt imagebuilder (snapshot) 2018-06-26 22:40:35 +02:00
Martin Friedrich
31d0688c7c change to openwrt imagebuilder (snapshot) 2018-06-26 22:40:35 +02:00
Attila Lendvai
68a222edc6 small fix: creating the symping to packages dir at the end of the build. 2017-05-14 20:17:58 +02:00
Attila Lendvai
8e64a64186 Update README.md 2017-04-21 03:09:09 +02:00
9 changed files with 122 additions and 70 deletions

2
.gitignore vendored
View File

@@ -1,2 +1,2 @@
notes.txt notes.txt
authorized_keys build/

View File

@@ -1,13 +1,13 @@
# What # What
It's a script to build a customized [LEDE](https://lede-project.org/) It's a script to build a customized
firmware image using a Linux x86_64 host (basic familiarity with [OpenWRT](https://openwrt.org/docs/guide-user/start)
[LEDE](https://lede-project.org/) is assumed). LEDE is a fork of firmware image using
[OpenWRT](https://openwrt.org/). [ImageBuilder](https://openwrt.org/docs/guide-user/additional-software/imagebuilder).
If the generated image is flashed on a device it will try to automatically If the generated image is flashed on a device it will try to automatically set up
set up [extroot](http://wiki.openwrt.org/doc/howto/extroot) on **any [extroot](https://openwrt.org/docs/guide-user/additional-software/extroot_configuration)
(!)** storage device plugged into the USB port (`/dev/sda`). Keep in on **any (!)** storage device plugged into the USB port (`/dev/sda`). Keep in
mind that **this will erase any inserted storage device while the mind that **this will erase any inserted storage device while the
router is in the initial setup phase**! Unfortunately there's little router is in the initial setup phase**! Unfortunately there's little
that can be done at that point to ask the user for confirmation. that can be done at that point to ask the user for confirmation.
@@ -18,17 +18,34 @@ 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 firmware, plug in a pendrive, and manage their SIP (telephony) node
from our webapp. 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.
# How # How
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 run when the extroot has failed to mount early in the boot.
### Building ### Building
To build issue the following command: `./build.sh architecture variant device-profile`, e.g.: OpenWRT's ImageBuilder only works on Linux x86_64. To build a firmware, issue the following command:
* `./build.sh ar71xx generic tl-wdr4300-v1` `./build.sh architecture variant device-profile`, e.g.:
Results will be under `build/lede-imagebuilder-${release}-${architecture}-${variant}.Linux-x86_64/bin/`. * `./build.sh ar71xx generic tplink_tl-wr1043nd-v1`
* `./build.sh ath79 generic tplink_archer-c6-v2`
Results will be under `build/openwrt-imagebuilder-${release}-${architecture}-${variant}.Linux-x86_64/bin/`.
To see a list of available targets, run `make info` in the ImageBuilder dir. To see a list of available targets, run `make info` in the ImageBuilder dir.
If you want to change which LEDE version is used, then edit the relevant variable(s) in `build.sh`. If you want to change which OpenWRT version is used, then edit the relevant variable(s)
in `build.sh`.
### Setup stages ### Setup stages
@@ -37,16 +54,21 @@ sources for details: [autoprovision-functions.sh](image-extras/common/root/autop
#### Stage 1: setup extroot #### Stage 1: setup extroot
At the first boot after flashing the firmware the autoprovision script will When the custom firmware first boots, the autoprovision script will
wait for anything (!) in `/dev/sda` to show up (that is >= 512M), then erase wait for anything (!) in `/dev/sda` to show up (that is >= 512M), then erase
it and set up a `swap`, an `extroot`, and a `data`filesystem (for the remaining it and set up a `swap`, an `extroot`, and a `data`filesystem (for the remaining
space), and then reboot. space), and then reboot.
#### Stage 2: download and install some packages from the internet #### Stage 2: download and install some packages from the internet
Once it booted into the new extroot, it will continuously attempt to install Once it rebooted into the new extroot, it will continuously keep trying to install
some LEDE packages until an internet connection is set up on the router some OpenWRT packages until an internet connection is set up on the router. You
(either by using ssh or LuCI if you could fit it into the firmware). need to do that manually either by using ssh or the web UI (LuCI).
#### Stage 3, optional
We also have a 3rd stage, written in Python, but it's commented out here.
Search for `autoprovision-stage3.py` to see how it's done.
### Login ### Login
@@ -57,55 +79,50 @@ 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: 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). [autoprovision-stage2.sh](image-extras/common/root/autoprovision-stage2.sh#L53).
If a password is set, then telnet is disabled by LEDE 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). using the keys specified in [authorized_keys](image-extras/common/etc/dropbear/authorized_keys).
Once connected, you can read the log with `logread -f`. Once connected, you can read the log with `logread -f`.
# Status # Status
This is more of a template than something standalone. You most This is more of a template than something standalone, but I use it for
my home routers as is. You most
probably want to customize this script here and there; search for probably want to customize this script here and there; search for
`CUSTOMIZE` for places of interest. `CUSTOMIZE` for places of interest.
Most importantly, **set up a password and maybe an ssh key**. Most importantly, **set up a password and maybe an ssh key**.
I've extracted this from a project of mine where OpenWRT nodes auto-provision
themselves in 3 stages (stage 3 was a Python script for an app-level sync feature),
but I thought it's useful enough for making it public.
At the time of writing it only supports a few `ar71xx` routers out of the box, At the time of writing it only supports a few `ar71xx` routers out of the box,
but it's easy to extend it. but it's easy to extend it. Support for a new router entails looking up
some led names for setLedAttribute for the user feedback through the blinking of
## Tested with the leds. It should work fine without that, but it will be less convenient to
interact with your router in the initial setup phase.
[LEDE 17.01.1](https://downloads.lede-project.org/releases/17.01.1/)
on a TP-Link WDR4300.
# Troubleshooting # Troubleshooting
## Which file should I flash? ## Which file should I flash?
You should consult the documentation at [LEDE](https://lede-project.org/docs/start) and/or at You should consult the [OpenWRT documentation](https://openwrt.org/docs/guide-user/start).
[OpenWRT](https://wiki.openwrt.org/doc/howto/user.beginner). The produced firmware files should be somewhere around
The produced firmware files should be somewhere around ```build/lede-imagebuilder-17.01.1-ar71xx-generic.Linux-x86_64/bin/ar71xx```. ```build/openwrt-imagebuilder-17.01.4-ar71xx-generic.Linux-x86_64/bin/ar71xx```.
In short: In short:
* You need a file with the name ```-factory.bin``` or ```-sysupgrade.bin```. The former is to * You need a file with the name ```-factory.bin``` or ```-sysupgrade.bin```. The former is to
be used when you first install LEDE, the latter is when you upgrade an already installed be used when you first install OpenWRT, the latter is when you upgrade an already installed
LEDE. OpenWRT.
* You must carefully pick the proper firmware file for your **hardware version**! I advise you * 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://wiki.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 hardawre versions with comments on their 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 LEDE, which is status (sometimes new hardware revisions are only supported by the latest OpenWRT, which is
not released yet). not released yet).
## Help! The build has finished but there's no firmware file! ## 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```): 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 when there's not enough space in the flash memory of the target device to install everything
then the LEDE 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 silently continues. Look into [build.sh](build.sh#L31) and try to remove some packages
that you can live without. that you can live without.

View File

@@ -1,46 +1,35 @@
#!/bin/bash #!/bin/sh
set -e set -e
absolutize ()
{
if [ ! -d "$1" ]; then
echo
echo "ERROR: '$1' doesn't exist or not a directory!"
kill -INT $$
fi
pushd "$1" >/dev/null
echo `pwd`
popd >/dev/null
}
TARGET_ARCHITECTURE=$1 TARGET_ARCHITECTURE=$1
TARGET_VARIANT=$2 TARGET_VARIANT=$2
TARGET_DEVICE=$3 TARGET_DEVICE=$3
BUILD=`dirname "$0"`"/build/" BUILD=`dirname "$0"`"/build/"
BUILD=`absolutize $BUILD` BUILD=`readlink -f $BUILD`
### ###
### chose a release ### chose a release
### ###
#RELEASE="15.05.1" RELEASE="19.07.9"
RELEASE="17.01.1"
IMGBUILDER_NAME="lede-imagebuilder-${RELEASE}-${TARGET_ARCHITECTURE}-${TARGET_VARIANT}.Linux-x86_64" IMGBUILDER_NAME="openwrt-imagebuilder-${RELEASE}-${TARGET_ARCHITECTURE}-${TARGET_VARIANT}.Linux-x86_64"
IMGBUILDER_DIR="${BUILD}/${IMGBUILDER_NAME}" IMGBUILDER_DIR="${BUILD}/${IMGBUILDER_NAME}"
IMGBUILDER_ARCHIVE="${IMGBUILDER_NAME}.tar.xz" IMGBUILDER_ARCHIVE="${IMGBUILDER_NAME}.tar.xz"
IMGTEMPDIR="${BUILD}/openwrt-build-image-extras" IMGTEMPDIR="${BUILD}/image-extras"
#https://downloads.lede-project.org/snapshots/targets/ar71xx/generic/lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz # see this feature request:
#https://downloads.lede-project.org/snapshots/targets/ar71xx/generic/lede-imagebuilder-ar71xx-generic.Linux-x86_64.tar.xz # FS#1670 - consistent naming convention for the imagebuilder.tar.xz URL
IMGBUILDERURL="https://downloads.lede-project.org/releases/${RELEASE}/targets/${TARGET_ARCHITECTURE}/${TARGET_VARIANT}/${IMGBUILDER_ARCHIVE}" # https://bugs.openwrt.org/index.php?do=details&task_id=1670
IMGBUILDERURL="https://downloads.openwrt.org/releases/${RELEASE}/targets/${TARGET_ARCHITECTURE}/${TARGET_VARIANT}/${IMGBUILDER_ARCHIVE}"
if [ -z ${TARGET_DEVICE} ]; then if [ -z ${TARGET_DEVICE} ]; then
echo "Usage: $0 architecture variant device-profile" echo "Usage: $0 architecture variant device-profile"
echo " e.g.: $0 ar71xx generic tl-wr1043nd-v2" echo " e.g.: $0 ar71xx generic tplink_tl-wr1043nd-v1"
echo " $0 ramips mt7621 zbt-wg3526" echo " $0 ath79 generic tplink_archer-c6-v2"
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 " to get a list of supported devices issue a 'make info' in the OpenWRT image builder directory:"
echo " '${IMGBUILDER_DIR}'" echo " '${IMGBUILDER_DIR}'"
kill -INT $$ kill -INT $$
@@ -74,17 +63,20 @@ fi
if [ ! -e ${IMGBUILDER_DIR} ]; then if [ ! -e ${IMGBUILDER_DIR} ]; then
pushd ${BUILD} pushd ${BUILD}
# --no-check-certificate if needed # --no-check-certificate if needed
wget --continue ${IMGBUILDERURL} wget --continue ${IMGBUILDERURL}
xz -d <${IMGBUILDER_ARCHIVE} | tar vx xz -d <${IMGBUILDER_ARCHIVE} | tar vx
popd popd
fi fi
pushd ${IMGBUILDER_DIR} pushd ${IMGBUILDER_DIR}
# Without this the image builder fails.
export SOURCE_DATE_EPOCH=$(git show -s --format=%ct HEAD)
make image PROFILE=${TARGET_DEVICE} PACKAGES="${PREINSTALLED_PACKAGES}" FILES=${IMGTEMPDIR} make image PROFILE=${TARGET_DEVICE} PACKAGES="${PREINSTALLED_PACKAGES}" FILES=${IMGTEMPDIR}
pushd bin/${TARGET_ARCHITECTURE}/ pushd bin/targets/${TARGET_ARCHITECTURE}/
ln -s ../../packages . ln -s ../../../packages .
popd popd
popd popd

4
build/.gitignore vendored
View File

@@ -1,4 +0,0 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

19
default.nix Normal file
View File

@@ -0,0 +1,19 @@
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs; [
coreutils posix_man_pages bash-completion less
gitFull diffutils
gnumake which
ncurses perl python2 python3
# keep this line if you use bash
bashInteractive
];
shellHook =
''
alias ..='cd ..'
alias ...='cd ../..'
'';
}

View File

@@ -0,0 +1,3 @@
# you can put your ssh public key into authorized_keys,
# but we don't ever want it to be committed to the repo
authorized_keys

View File

@@ -1 +0,0 @@
# this file may contain ssh public keys for passwordless ssh root login

View File

@@ -34,7 +34,7 @@ hasBigEnoughPendrive()
setupPendrivePartitions() setupPendrivePartitions()
{ {
# erase partition table # erase partition table
dd if=/dev/zero of=/dev/sda bs=1M count=1 dd if=/dev/zero of=/dev/sda bs=1k count=256
# sda1 is 'swap' # sda1 is 'swap'
# sda2 is 'root' # sda2 is 'root'

26
manifest.scm Normal file
View File

@@ -0,0 +1,26 @@
;; This is the complete list of Guix packages necessary for building.
;;
;; The following shell command will run the tests:
;;
;; guix shell -m manifest.scm --pure -- ./build.sh ath79 generic tplink_tl-wdr4300-v1
;;
;; TODO ...ideally. some dependencies are not listed, and it fails when using --pure
;;
;; Quircks on Guix: the check for git fails, must edit
;; build/openwrt-imagebuilder-19.07.9-ath79-generic.Linux-x86_64/include/prereq-build.mk
;; and comment out the git check.
;;
(specifications->manifest
'("coreutils"
"bash"
"make"
"perl"
"python2"
"gcc-toolchain"
"git"
"git:gui"
;; "man-pages"
"less"
"time"))