Кросс-компиляция OpenWrt
Кросс-компиляция — это компиляция программы для платформы, отличной от той, на которой выполняется компиляция.
Весь материал взят с официального сайта OpenWrt.
В статье рассказано о сборке прошивки OpenWrt для роутеров с различной архитектурой — MIPS, ARM и т.д., и образа OpenWrt_х86 для «большого компьютера».
Так же описана компиляция своих пакетов.
Supported Device
FAQ на русском
Требования
Операционная система Linux.
Не менее 10 гигабайт дискового пространства.
От 1 до 4 гигабайт оперативной памяти.
Подготовка
Устанавливаем необходимые пакеты:
sudo apt-get update
sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk
sudo apt-get install subversion mercurial
sudo apt-get install xsltproc zlib1g-dev gcc-multilib flex gettext quilt mkisofs
Все последующие действия производятся под обычным пользователем.
Теперь нужно склонировать git-репозиторий OpenWrt себе на компьютер.
Идём вот сюда и ищем раздел Downloading Sources
trunk
Main repository
git clone git://git.openwrt.org/openwrt.git
Это ветка для разработчиков, здесь находится самая последняя версия с изменениями и багами.
15.05 branch (Chaos Calmer)
Main repository
git clone -b chaos_calmer git://github.com/openwrt/openwrt.git
Последняя стабильная версия, вот она то нам и нужна. Ниже идут предыдущие стабильные релизы.
Открываем терминал, переходим в домашнюю папку и клонируем…
git clone -b chaos_calmer git://github.com/openwrt/openwrt.git
После этого в домашней папке появится папка openwrt
Переходим в неё:
cd openwrt
Обновляем и устанавливаем все доступные пакеты:
./scripts/feeds update -a
./scripts/feeds install -a
Что такое feeds.
Создаем новый конфигурационный файл с настройками по умолчанию:
make defconfig
Проверяем доступность необходимых компонентов:
make prereq
Проверяет всё ли установлено в системе, если чего-то нет, то запустите synaptic (пакетный менеджер ubuntu) и доставьте необходимое.
Всё окей...
Сборка
Запускаем конфигуратор:
make menuconfig
Откроется вот такое окно:
С этого момента начинается самое интересное...
Выполним первоначальную компиляцию…
Первый пункт — Target System, выбираем процессор, в случае c MR3020 это Atheros AR9ххх.
Выбор производится и Возврат в предыдущие окно — двойное нажатие
Третий пункт — Target Profile, выбираем TP-Link TL-MR3020.
Теперь выбираем Exit и после Yes, в папке /openwrt будет создан файл .config (файл скрытый).
Далее запускаем сборку.
make
Самая простая команда.
Если у вас многоядерный компьютер, то тогда лучше подойдёт вот такая команда:
make -j 3
Где цифра это число ядер + 1, то есть если комп двухядерный, то пишем 3.
Если дать такую команду, то будут выводится подробности:
make -j 3 V=s
Если будут ошибки, система попросит вот такую команду:
make V=s
Вспомогательные команды:
make clean
Очистка. Удаляет каталоги /bin и /build_dir.
make dirclean
Команда для полной очистки. Удаляет каталоги /bin и /build_dir, а также /staging_dir и /toolchain.
make distclean
Удаляет все что собрано и настроено, все загруженное из репозитория, а так же исходные коды пакетов.
Компиляция — процесс очень долгий, можно попить чайку или даже вздремнуть.
Если процесс закончился с ошибками, то вдумчиво их изучаем и исправляем (удаляем пакеты), если всё прошло удачно, тогда идём дальше.
Найдите в папке /openwrt файл .config и сохраните его куда-нибудь. Делать это желательно после каждой удачной компиляции. В дальнейшем, когда вы будете добавлять пакеты в прошивку и у вас неминуемо появятся ошибки, то можно будет вернуться к предыдущей конфигурации.
Скомпилированая прошивка лежит в папке /openwrt/bin/ar71xx/. Среди множества файлов есть openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin (размер 3.9 Мб), это и есть тот самый образ, которым прошивается роутер. Там же находится папка packages, это наш репозиторий. Что с ним делать написано ниже.
Созданную прошивку уже можно установить на роутер, правда у вас не будет тех многочисленных плюшек предоставляемых OpenWrt, поэтому нужно добавить в прошивку различные пакеты.
Снова запускаем конфигуратор и неторопливо добавляем нужные пакеты. Лучше это делать последовательно, то есть выбрать некоторое количество пакетов и скомпилировать, потом выбрать ещё и снова скомпилировать. Таким образом будет легче разбираться с возникающими ошибками.
make menuconfig
Справка
Добавить пакет как модуль — кнопка М. Пакет скомпилируется и будет доступен в репозитории, устанавливается командой opkg install. Некоторые пакеты устанавливаются только в ядро.
Добавить пакет в ядро — кнопка Y. Пакет будет вкомпилирован в образ. С этим нужно быть внимательным, так как можно превысить размер прошивки. Лучше всего добавлять пакеты как модуль.
Убрать пакет — кнопка N.
Так же пакеты можно добавлять/убирать кнопкой пробел.
Отключён/включён в ядро.
Отключён/включён в ядро или как модуль.
Включён в ядро или как модуль. Имеет зависимость.
Включён в ядро или как модуль. Имеет зависимость. Нельзя отключить.
Чтиво.
Добавить пакет в ядро — кнопка Y. Пакет будет вкомпилирован в образ. С этим нужно быть внимательным, так как можно превысить размер прошивки. Лучше всего добавлять пакеты как модуль.
Убрать пакет — кнопка N.
Так же пакеты можно добавлять/убирать кнопкой пробел.
[ ], [*]
Отключён/включён в ядро.
< >, <*>, <M>
Отключён/включён в ядро или как модуль.
{M}, {*}
Включён в ядро или как модуль. Имеет зависимость.
-M-, -*-
Включён в ядро или как модуль. Имеет зависимость. Нельзя отключить.
Чтиво.
Начать можно с того, что убрать ненужные форматы прошивки. Зайдите в раздел Target Images и уберите всё кроме squashfs.
Следующий пункт это Base System
Тут предоставляется полная свобода выбора основанная на ваших желаниях и воззрениях...
После выбора пакетов нажимаем Exit ⇨ Yes и запускаем сборку:
make -j 3
Выбор пакетов осуществляется в зависимости от ваших нужд
Пакеты лучше компилировать как модули (М) и устанавливать их потом командой opkg install. Если «вбилдить» лишние пакеты в образ (*), то можно привысить допустимый размер прошивки и ничего хорошего из этого не выйдет.
Ваш репозиторий (папка /packages) надо разместить на домашнем (или любом другом) сервере и прописать к нему путь в файле /etc/opkg.conf.
Свой пакет
Пакет будет называться hello
В папке ~/openwrt/package создаём папку hello, а в ней папку src, получится так ~/openwrt/package/hello/src
Создаем в папке ~/openwrt/package/hello Makefile с таким содержимым:
Получится вот так ~/openwrt/package/hello/Makefile.
include $(TOPDIR)/rules.mk
PKG_NAME:=hello
PKG_VERSION:=1
PKG_RELEASE:=1
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/hello
SECTION:=utils
CATEGORY:=Utilities
TITLE:=hello - My Hello
endef
define Package/hello/description
hello - My Hello
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Compile
$(TARGET_CC) $(TARGET_CFLAGS) -c -o $(PKG_BUILD_DIR)/hello.o $(PKG_BUILD_DIR)/hello.c
$(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/hello $(PKG_BUILD_DIR)/hello.o
endef
define Package/hello/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/bin/
endef
$(eval $(call BuildPackage,hello))
Если возникает ошибка "*** missing separator. Stop.", тогда нужно внутри конструкций define — endef заменить пробелы на Tab
Файл который будем компилировать кладём в папку ~/openwrt/package/hello/src, получится вот так ~/openwrt/package/hello/src/hello.c
Незатейлевый код для примера:
#include <stdio.h>
int main (void)
{
printf("Hello world, i'm cool hacker!\n");
return 0;
}
Запускаем конфигуратор:
make menuconfig
Переходим в раздел Utilities и отмечаем наш пакет как модуль М
Сохраняем и компилируем:
make package/hello/compile V=s
Готовый пакет будет лежать в папке ~/openwrt/bin/ar71xx/packages/base/hello_1-1_ar71xx.ipk, устанавливается стандартным способом (opkg install hello_1-1_ar71xx.ipk), исполняемый файл будет находиться в папке /bin.
Запускаем:
/bin/hello
Помимо этого, в прошивку можно добавить любые файлы и папки, которые Вам нужны.
Для этого в папке с исходниками
Так же Вы можете создать в папке files папку etc, а в ней папку config (~/openwrt/files/etc/config/) и положить туда конфиг-файлы (network, wireless, firewall и т.д.) со своими настройками.
~/openwrt/files/etc/config/network
~/openwrt/files/etc/config/wireless
~/openwrt/files/etc/config/firewall
...
Во время сборки прошивки оригинальные конфиг-файлы будут заменены на Ваши.
Сборка OpenWrt_x86
make clean
Запускаем конфигуратор:
make menuconfig
В пункте Target System выбираем x86
В пункте Target Images можно выбрать формат выходного образа (iso, GZip), установить размер ядра (8) и корневой файловой системы (256).
Кстати можно создать готовый образ виртуальной машины (VDI), здесь я описывал работу с ней. Впрочем с тем же успехом в виртуалке запускается ISO-образ.
Сохраняемся, компилируем… И идём пить чай.
make -j 3 V=s
Все подробности описаны в главе «Сборка».
Если вы неоднократно собирали прошивку, то могли заметить, что некоторые пакеты, то пропадают, то вновь появляются. Дело в том, что разработчики давно не обновляемые пакеты перемещают в ветку oldpackage, по умолчанию отключенную.
Это можно исправить отредактировав файл openwrt/feeds.conf.default, в котором часть репозиториев закомментирована:
nano feeds.conf.default
src-git packages https://github.com/openwrt/packages.git;for-15.05
src-git luci https://github.com/openwrt/luci.git;for-15.05
src-git routing https://github.com/openwrt-routing/packages.git;for-15.05
src-git telephony https://github.com/openwrt/telephony.git;for-15.05
src-git management https://github.com/openwrt-management/packages.git;for-15.05
#src-git targets https://github.com/openwrt/targets.git
#src-git oldpackages http://git.openwrt.org/packages.git
#src-svn xwrt http://x-wrt.googlecode.com/svn/trunk/package
#src-svn phone svn://svn.openwrt.org/openwrt/feeds/phone
#src-svn efl svn://svn.openwrt.org/openwrt/feeds/efl
#src-svn xorg svn://svn.openwrt.org/openwrt/feeds/xorg
#src-svn desktop svn://svn.openwrt.org/openwrt/feeds/desktop
#src-svn xfce svn://svn.openwrt.org/openwrt/feeds/xfce
#src-svn lxde svn://svn.openwrt.org/openwrt/feeds/lxde
#src-link custom /usr/src/openwrt/custom-feed
Можно раскомментировать ветку oldpackages, сохранить и обновиться:
./scripts/feeds update -a
./scripts/feeds install -a
Теперь запустив конфигуратор, можно найти старые/новые пакеты:
make menuconfig
Какие пакеты добавлять в систему зависит от ваших целей…
- +406
- stD
25859
Поддержать автора
Комментарии (4)
1. Как можно подключится к прокси с OpenWRT, все перегуглил ничего не нашел. Хочу поставить интернет на нем через прокси-сервер, какой пакет или какая команда поможет это сделать?
2.Если сможешь покажешь, как самому сделать пакет любой программы например DC++ сервера PtokaX, тоже много искал темы но никак не могут понять что куда просто от линукса далек, а у тебя каждый блог понятен, красиво оформлен, аж приятно глазам и скрины каждого действия, за это тебе большое спасибо, много сделал благодаря тебе не зная ваше ничего. Спасибо
Как компилить свои программы в статье описано, для сторонних программ — качаете исходники, правите мейкфайл и пробуете компилировать.
Если нужен DC++ для openwrt, то погуглите "DC++ openwrt".