Кросс-компиляция OpenWrt






Кросс-компиляция — это компиляция программы для платформы, отличной от той, на которой выполняется компиляция.


Весь материал взят с официального сайта OpenWrt.


В статье рассказано о сборке прошивки OpenWrt для роутеров с различной архитектурой — MIPS, ARM и т.д., и образа OpenWrt_х86 для «большого компьютера».

Так же описана компиляция своих пакетов.



Supported Device

FAQ на русском




Требования


Операционная система Linux. Действия производятся на Ubuntu 14.04.

Не менее 10 гигабайт дискового пространства.

От 1 до 4 гигабайт оперативной памяти. 4 Г нужны для сборки образа x86.




Подготовка


Устанавливаем необходимые пакеты:

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 себе на компьютер.

Что такое Git можно узнать в Wiki, а инструкцию по использованию можно почитать тут. Прямого отношения к делу это не имеет, так что оставьте на потом.


Идём вот сюда и ищем раздел Downloading Sources


trunk
Main repository


git clone git://git.openwrt.org/openwrt.git

Это ветка для разработчиков, здесь находится самая последняя версия с изменениями и багами.


15.05 branch (Chaos Calmer)
Main repository


git clone git://git.openwrt.org/15.05/openwrt.git

Последняя стабильная версия, вот она то нам и нужна. Ниже идут предыдущие стабильные релизы.


Открываем терминал, переходим в домашнюю папку и клонируем…

git clone git://git.openwrt.org/15.05/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.


Так же пакеты можно добавлять/убирать кнопкой пробел.


[ ], [*]

Отключён/включён в ядро.


< >, <*>, <M>

Отключён/включён в ядро или как модуль.


{M}, {*}

Включён в ядро или как модуль. Имеет зависимость.


-M-, -*-

Включён в ядро или как модуль. Имеет зависимость. Нельзя отключить.

Чтиво.





Начать можно с того, что убрать ненужные форматы прошивки. Зайдите в раздел Target Images и уберите всё кроме squashfs.




Следующий пункт это Base System



Тут предоставляется полная свобода выбора основанная на ваших желаниях и воззрениях...


После выбора пакетов нажимаем ExitYes и запускаем сборку:

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







Сборка OpenWrt_x86


Образ для компьютера.


Если Вы до этого собирали образ для роутера и хотите уберечь настройки, тогда сохраните файл .config куда-нибудь, удалите исходный и дайте команду:

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





Какие пакеты добавлять в систему зависит от ваших целей…


  • 0
  • 5108

Комментарии (4)

0
Дима, привет хотел задать два вопроса:
1. Как можно подключится к прокси с OpenWRT, все перегуглил ничего не нашел. Хочу поставить интернет на нем через прокси-сервер, какой пакет или какая команда поможет это сделать?
2.Если сможешь покажешь, как самому сделать пакет любой программы например DC++ сервера PtokaX, тоже много искал темы но никак не могут понять что куда просто от линукса далек, а у тебя каждый блог понятен, красиво оформлен, аж приятно глазам и скрины каждого действия, за это тебе большое спасибо, много сделал благодаря тебе не зная ваше ничего. Спасибо
0
Как можно подключится к прокси с OpenWRT
Не понятно что, куда и откуда нужно проксировать. Вот популярный прокси — Squid

как самому сделать пакет любой программы
Как компилить свои программы в статье описано, для сторонних программ — качаете исходники, правите мейкфайл и пробуете компилировать.

Если нужен DC++ для openwrt, то погуглите "DC++ openwrt".
0
Отличная статья. Только что компильнул прошивку :)
0
Спасибо.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.