Огляд
Якщо ви вже працювали з GNU/Linux, ви швидко зорієнтуєтесь в OpenWrt. Якщо ні — перед початком варто познайомитись із базовими поняттями та термінами.
OpenWrt — це спеціалізований GNU/Linux-дистрибутив для вбудованих пристроїв. Будь-який GNU/Linux-дистрибутив складається з пакетів, які разом із ядром Linux формують операційну систему, налаштовану під конкретні потреби.
* Пакет — стислий архів, що містить програму, бібліотеку або скрипти, їхні конфігураційні файли та службові метадані для інтеграції в систему. * Менеджер пакетів в OpenWrt — `opkg`; саме він завантажує, встановлює й видаляє пакети. * Таким чином, прошивка OpenWrt збирається шляхом «складання» набору пакетів навколо ядра Linux.
Під час збірки кожен пакет компілюється окремо; потім необхідні пакети встановлюються у тимчасовий каталог, який згодом стає стиснутим, read-only розділом SquashFS у прошивці пристрою.
Ядро теж обробляється як пакет, але додається до фінального образу відповідно до вимог завантажувача конкретного пристрою. Тому можна безпечно змінювати прошивку, не торкаючись бутлоудера (що часто ризиковано або неможливо).
Останній крок збірки — формування файла прошивки (часто його називають «image») — повноцінного дискового образу, який записується безпосередньо у flash-пам’ять пристрою.
Як компілюються пакети
У Makefile пакета (приклад — BusyBox) вказуються:
* офіційна URL-адреса вихідних кодів; * SHA256-хеш для перевірки цілісності; * `PKG_VERSION` — версія проєкту; * `PKG_RELEASE` — номер випуску з боку OpenWrt (зміни патчів).
У каталозі `patches/` кожного пакета — патчі, що застосовуються після завантаження й до компіляції (див. BusyBox patches). Там же можуть бути конфіг-файли або скрипти UCI.
Ядро має складніший Makefile, але принцип той самий (див. kernel/Makefile).
Уся компіляція відбувається власною toolchain OpenWrt (директорії `/tools` та `/toolchain`), тож усі користуються однаковими версіями компіляторів.
При запуску `make` спершу збирається toolchain, а вже потім — усі пакети. Це позбавляє користувача необхідності самостійно налаштовувати крос-компілятор.
Feeds пакетів
Не всі пакети входять до головного репозиторію OpenWrt. Feeds — це окремі репозиторії з додатковими пакетами, що підтримуються спільнотою.
* Основний репозиторій: <https://github.com/openwrt/openwrt> * Офіційні feeds:
Пакети з цих feeds збираються офіційними білд-ботами й публікуються на сервері завантажень, але технічно це окремі проєкти. Система feeds дає змогу легко додавати власні репозиторії у вашу кастомну прошивку.
На сервері завантажень пакети поділені за назвами feeds: наприклад, «base» — пакети з основного репо, а цільово-залежні (kmod-*) зберігаються в окремих каталогах; див. https://downloads.openwrt.org/releases/24.10.1/packages/x86_64/.
Нумерація версій пакета
* `PKG_VERSION` — «велика» версія (upstream) * `PKG_RELEASE` — «дрібна» версія (патчі OpenWrt)
Наприклад, `1.23-4` означає upstream 1.23 та OpenWrt-реліз 4. Деякі пакети використовують git-хеш або timestamp як версію (`2023-09-21-abcdef-1`).
Усі версії можна переглянути:
* у таблиці пакетів; * або у файлі `Packages.manifest` відповідного каталогу, наприклад
<https://downloads.openwrt.org/releases/24.10.1/packages/mips_24kc/base/Packages.manifest>.
Repeatable builds
Фіксовані версії в Makefile + кеш-сервер джерел (<https://sources.openwrt.org/>) забезпечують repeatable builds: будь-хто, маючи ту ж гілку, отримає ті самі результати навіть через роки.