2022-04-27 22:39:18 +02:00
|
|
|
# nix-openwrt-imagebuilder
|
|
|
|
|
|
|
|
Generate OpenWRT images from Nix derivations using the official
|
|
|
|
ImageBuilders that are provided upstream.
|
2022-05-09 15:44:33 +02:00
|
|
|
|
|
|
|
For OpenWRT releases since 19.07 there is profile helper functionality
|
|
|
|
that helps you find the proper image specification (target, variant)
|
|
|
|
according to your hardware's profile name.
|
|
|
|
|
|
|
|
## Background
|
|
|
|
|
|
|
|
In an ideal world, OpenWRT would be built from source in many
|
|
|
|
fine-grained Nix derivations. Until someone implements that (please
|
|
|
|
do!), this project exists to reuse the binary ImageBuilders that are
|
|
|
|
included in every OpenWRT release. They are only available for
|
|
|
|
x86_64-linux hosts.
|
|
|
|
|
|
|
|
The ImageBuilder can generate new *sysupgrade* images with a
|
|
|
|
customized set of packages and included files. **Caveat:** It cannot
|
|
|
|
build *factory* images for a first-time installation on the vendor
|
|
|
|
firmware.
|
|
|
|
|
|
|
|
## Usage with vanilla Nix
|
|
|
|
|
|
|
|
```nix
|
|
|
|
let
|
|
|
|
pkgs = import <nixpkgs> {};
|
|
|
|
|
|
|
|
# use fetchurl, Hydra inputs, or something else to refer to this project
|
|
|
|
openwrt-imagebuilder = ../nix-openwrt-imagebuilder;
|
|
|
|
|
|
|
|
profiles = import (openwrt-imagebuilder + "/profiles.nix") { inherit pkgs; };
|
|
|
|
|
|
|
|
# example: find target/variant for an old Fritzbox
|
|
|
|
config = profiles.identifyProfile "avm_fritz7412" // {
|
|
|
|
# add package to include in the image, ie. packages that you don't
|
|
|
|
# want to install manually later
|
|
|
|
packages = [ "tcpdump" ];
|
|
|
|
|
|
|
|
disabledServices = [ "dnsmasq" ];
|
|
|
|
|
|
|
|
# include files in the images.
|
|
|
|
# to set UCI configuration, create a uci-defauts scripts as per
|
|
|
|
# official OpenWRT ImageBuilder recommendation.
|
|
|
|
files = pkgs.runCommandNoCC "image-files" {} ''
|
|
|
|
mkdir -p $out/etc/uci-defaults
|
|
|
|
cat > $out/etc/uci-defaults/99-custom <<EOF
|
|
|
|
uci -q batch << EOI
|
|
|
|
set system.@system[0].hostname='testap'
|
|
|
|
commit
|
|
|
|
EOI
|
|
|
|
EOF
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
in
|
|
|
|
# actually build the image
|
|
|
|
import (openwrt-imagebuilder + "/builder.nix") config
|
|
|
|
```
|
|
|
|
|
|
|
|
## Usage with Nix Flakes
|
|
|
|
|
|
|
|
```nix
|
|
|
|
{
|
|
|
|
inputs = {
|
|
|
|
openwrt-imagebuilder.url = "github:astro/nix-openwrt-imagebuilder";
|
|
|
|
};
|
|
|
|
outputs = { self, nixpkgs, openwrt-imagebuilder }: {
|
|
|
|
packages.x86_64-linux.my-router =
|
|
|
|
let
|
|
|
|
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
|
|
|
|
2022-05-09 15:49:23 +02:00
|
|
|
profiles = openwrt-imagebuilder.lib.profiles { inherit pkgs; };
|
2022-05-09 15:44:33 +02:00
|
|
|
|
|
|
|
config = profiles.identifyProfile "avm_fritz7412" // {
|
|
|
|
# add package to include in the image, ie. packages that you don't
|
|
|
|
# want to install manually later
|
|
|
|
packages = [ "tcpdump" ];
|
|
|
|
|
|
|
|
disabledServices = [ "dnsmasq" ];
|
|
|
|
|
|
|
|
# include files in the images.
|
|
|
|
# to set UCI configuration, create a uci-defauts scripts as per
|
|
|
|
# official OpenWRT ImageBuilder recommendation.
|
|
|
|
files = pkgs.runCommandNoCC "image-files" {} ''
|
|
|
|
mkdir -p $out/etc/uci-defaults
|
|
|
|
cat > $out/etc/uci-defaults/99-custom <<EOF
|
|
|
|
uci -q batch << EOI
|
|
|
|
set system.@system[0].hostname='testap'
|
|
|
|
commit
|
|
|
|
EOI
|
|
|
|
EOF
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
in
|
|
|
|
openwrt-imagebuilder.lib.build config;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## Refreshing hashes
|
|
|
|
|
2022-06-08 01:21:53 +02:00
|
|
|
Checksums of the `sha256sums` files on downloads.openwrt.org are added
|
|
|
|
to this repository for a few recent releases. To update them, run:
|
2022-05-09 15:44:33 +02:00
|
|
|
|
|
|
|
```bash
|
|
|
|
nix-shell -p nixFlakes
|
2022-06-08 01:21:53 +02:00
|
|
|
nix run .#generate-hashes 21.02.3 # for example
|
2022-05-09 15:44:33 +02:00
|
|
|
git add hashes/*.nix
|
|
|
|
```
|