Openwrt собираем прошивку. Краткая инструкция по сборке OpenWRT

Не так давно озадачился поднятием на своем роутере D-Link DIR-320 сервера OpenVPN. Но после установки прошивки OpenWRT оказалось, что на 4-х мегабайтной флешке роутера не осталось достаточно места для установки OpenVPN. Выходом из ситуации стала сборка собственного варианта прошивки с помощью Image Generator , что позволило при том же наборе пакетов получить прошивку меньшего размера.

Прежде чем продолжить описание сборки, остановлюсь немного на том, как устроена корневая файловая система OpenWRT. Она представляет собой файловую систему mini_fo, которая прозрачно объединяет две другие файловые системы: неизменяемую SquashFS, смонтированную в /rom, и изменяемую JFFS2, смонтированную в /overlay. Все файлы, которые создаются или изменяются после установки прошивки, находятся в /overlay. При удалении файлов, изначально бывших в прошивке, mini_fo просто помечает их как удаленные, сами же файлы остаются в /rom и продолжают занимать место. Как SquashFS, так и JFFS2 используют сжатие, но SquashFS дает лучшую степень сжатия, поэтому помещение всех необходимых пакетов сразу в /rom дает прошивку меньшего размера. Исключение ненужных пакетов из прошивки также позволяет сэкономить столь драгоценное место на флешке.

Для сборки кастомной прошивки необходимо скачать архив ImageBuilder. Для моего роутера был только i686-вариант архива, но никаких проблем на 64-битной Gentoo с ним не возникло. Для всего, что связано с прошивкой я создал директорию ~/dir-320, а в ней директорию 10.03, соответствующую версии используемой прошивки OpenWRT, куда и распаковал архив ImageBuilder. Сборка минимального образа осуществляется с помощью команды make image , вместе с которой можно также указать три переменные:

  • PROFILE - профиль сборки, который определяет список дополнительных пакетов для включения в прошивку. Список профилей можно получить с помощью make info . У меня по какой-то причине переменная не оказывала никакого влияния, и список необходимых для моего роутера пакетов пришлось указывать вручную.
  • PACKAGES - список пакетов для добавления или удаления. Перед именами пакетов, которые необходимо удалить, ставится минус. При сборке вычисляются зависимости пакетов, которые также добавляются в прошивку.
  • FILES - путь к директории с дополнительными файлами для включения в прошивку.
Для удобства повторного использования я создал скрипт make_image.sh, где вызываю make image с необходимыми мне значениями переменных:
#!/bin/bash make image PROFILE="Broadcom-b43" PACKAGES="kmod-b43 kmod-b43legacy -wpad-mini wpad ip iptables-mod-conntrack-extra ntpclient miniupnpd openvpn ddns-scripts nano" FILES="files/"
Очень удобной оказалась возможность добавлять свои файлы в образ прошивки. Пользуясь тем, что все новые и измененные файлы находятся в /overlay, я написал скрипт backup.sh для извлечения таких файлов из устройства:
#!/bin/bash DATE=`date +%Y-%m-%dT%H:%M:%S` BACKUP="backup-$DATE.tar.gz" ROUTER=172.22.222.1 BASEDIR=`dirname $0` FILELIST="etc/" ssh root@$ROUTER tar -czf /tmp/$BACKUP -C /overlay -X /etc/backup_exclude $FILELIST scp root@$ROUTER:/tmp/$BACKUP $BASEDIR/backup/$BACKUP
Файлы META_* в /overlay являются служебными в файловой системе mini_fo и их нужно исключить. Поскольку встроенный в busybox архиватор tar для исключения файлов поддерживает только опцию -X, необходимо на роутере создать файл /etc/backup_exclude со следующим содержимым:
META_*
В одной директории со скриптом создаем подкаталог backup, куда и будут сохраняться архивы.

Новые и измененные файлы помещаем в каталог, на который ссылается переменная FILES, с сохранением структуры подкаталогов. Запускаем скрит make_image.sh и получаем в каталоге bin преднастроенную прошивку со всем необходимым ПО.

Напоминаем, что попытки повторить действия автора могут привести к потере гарантии на оборудование и даже к выходу его из строя. Материал приведен исключительно в ознакомительных целях. Если же вы собираетесь воспроизводить действия, описанные ниже, настоятельно советуем внимательно прочитать статью до конца хотя бы один раз. Редакция 3DNews не несет никакой ответственности за любые возможные последствия.

Создание собственной версии альтернативной прошивки полезно лишь в том случае, когда вас не устраивает функциональность имеющихся сборок — отсутствуют необходимые компоненты, а вместо них есть что-то совершенно ненужное. При этом объём памяти в роутере относительно невелик, а установить дополнительное ПО на внешний накопитель не всегда возможно. В принципе, ничего сложного в создании своей прошивки нет. Для OpenWRT есть утилита Image Generator , которая как раз таки может удалять или добавлять пакеты программ в уже имеющуюся сборку. Можно воспользоваться ей, а можно пойти по другому пути — скомпилировать свою прошивку с блек-джеком и... ну, вы поняли. Общее описание процесса можно найти в вики проекта.

Итак, нам понадобится компьютер с Linux/*BSD/Mac OS на борту, порядка пяти гигабайт свободного места на жёстком диске и немножечко терпения. Собирать прошивку в виртуальной машине с подходящей ОС крайне не рекомендуется, так как процесс компиляции в этом случае может излишне затянуться. В качестве примера рассмотрим работу в Ubuntu 11.10. Первым делом надо установить дополнительные утилиты и библиотеки, которые потребуются в процессе сборки. Для других ОС и дистрибутивов список нужного ПО можно посмотреть . Минимально необходимый набор в нашем случае ставится такой командой.

Sudo apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk flex quilt git-core mkisofs

Теперь надо создать рабочую папку, куда будут сохранены исходные тексты прошивки, её настройки, готовые образы и так далее. В пути до этой директории не должно быть пробелов. После создания каталога скачиваем в него исходные тексты OpenWRT.

Mkdir ~/OpenWRT cd OpenWRT

Тут есть два варианта — либо взять стабильную версию, которая хорошо протестирована и надёжна до определённой степени, либо воспользоваться версией для разработчиков, в которой имеется немало новых возможностей, но вместе с тем получить ненулевую вероятность падений прошивки на ровном месте. Текущий релиз называется Backfire, а тестовая версия всегда находится в trunk. Выполните одну из приведённых ниже команд скачивания исходников из SVN-репозитория и перейдите в соответствующую папку.

Svn co svn://svn.openwrt.org/openwrt/trunk/ cd trunk

Svn co svn://svn.openwrt.org/openwrt/branches/backfire cd backfire

В файле feeds.conf.default находится список репозиториев с дополнительными пакетами программ. Если это необходимо, отредактируйте его. Раскомментируйте (уберите # в начале строки) пункты в списке или добавьте сторонние адреса фидов для какого-то специфичного ПО. Нам как минимум пригодится стандартный набор пакетов и веб-интерфейс LuCI (можно выбрать другой или оставить настройки по умолчанию), поэтому в этот файл можно вообще не лезть, оставив всё по умолчанию, а сразу же обновить списки пакетов.

Nano ./feeds.conf.default ./scripts/feeds update -a

Приступим к самому интересному — наполнению прошивки компонентами. Первым делом для тестовой сборки установим веб-интерфейс LuCI, чтобы лишний раз не настраивать роутер из консоли. Остальные программы ищутся тем же скриптом с параметром search и ключевым словом после него. В выводе будут имена пакетов с кратким описанием. Для установки используем ту же утилиту с параметром install. Все зависимости будут автоматически разрешены и недостающие пакеты, если таковые нужны выбранному пользователем компоненту, будут также установлены.

./scripts/feeds install -a -p luci ./scripts/feeds search ключевое_слово./scripts/feeds install имя_пакета

Для некоторых программ, возможно, захочется или придётся создать конфигурационные файлы. Для этого помещают их в каталог /files/etc/config, который надо создать в папке с исходниками. Вообще любые файлы из директории /files будут включены в прошивку. После этого можно переходить непосредственно к сборке. Выполним в консоли следующую команду.

Make menuconfig

Здесь переходим к пункту Target System (Enter) и выбираем платформу, для которой будет собрана прошивка. В списке совместимых устройств найдите вашу модель и посмотрите, какое у неё «железо». Для начала рекомендуется «потренироваться на кошках», то есть сделать x86-сборку с необходимым набором пакетов (учтите, что не для всех пакетов это удастся), а затем запустить её в виртуальной машине. А пока выходим в главное меню (Esc) и нажимаем Exit, не забывая сохранить новую конфигурацию. Чтобы получить базовые настройки для прошивки выполняем ещё одну команду.

Make defconfig make menuconfig

Возвращаемся в главное меню и в Target Profile ищем свой роутер. Обратите внимание, что в некоторых моделях от версии к версии аппаратная начинка может заметно отличаться. Постарайтесь ничего не перепутать, а то в худшем случае вы получите «кирпич» вместо устройства. Если вы решили потестировать x86-сборку, то в Target Images отметьте пункты ramdisk и iso — на выходе получится загрузочный iso-образ.



А вот теперь самое муторное — ручной выбор необходимых компонентов. Установленные ранее пакеты надо включить в саму сборку, для чего придётся пройтись почти по всем разделам настроек. Для установки компонента перейдите к нему и нажмите пробел для его выбора. * означает, что он будет «вшит» в ядро, а M указывает на создание отдельного подгружаемого модуля. В ряде случаев активация компонента открывает доступ к дополнительным настройкам, связанным с ним.


В разделах Base system и Libraries находятся базовые программы и библиотеки. В Network и IPv6 помещено всё, что связано с работой в сети — Bittorrent- и VPN-клиенты, различные сервера, вспомогательные утилиты и многое другое.


В разделе LuCI настраиваются параметры веб-интерфейса, так как в качестве примера для x86-сборки был выбран именно он. Во-первых, его надо включить в Collections, а в Modules выбрать admin-core или admin-full. Подраздел Applications содержит модули для настройки тех или иных параметров роутера. Дополнительно надо установить локализации (Translations), поддержку настроек сетевых интерфейсов (Protocols) и базовые библиотеки (Libraries).


Раздел Kernel modules содержит в основном драйвера для «железа», файловых систем, различных подсистем и так далее. Здесь тоже полезно пробежаться по подразделам и включить, например, поддержку NTFS. К сожалению, какого-то универсального руководства к действию при настройке компонентов прошивки нет. Устанавливать дополнительные утилиты и библиотеки можно, но не стоит забывать о небольшом объёме накопителя в роутере. А вот удалять то, что по умолчанию было включено, надо с осторожностью. Ознакомьтесь хотя бы с краткой справкой по компоненту, нажав H, а ещё лучше погуглите.

После выбора всех нужных модулей и компонентов необходимо сохранить конфигурацию. Непосредственно перед сборкой полезно выполнить ещё одну команду, которая покажет недостающие утилиты или библиотеки. Их надо будет доустановить с помощью apt-get install или поискать пакеты, в которых они содержатся, и тоже установить.

Make prereq

Процесс сборки запускается очень простой командой:

Сборка прошивки длится довольно долго. Чем больше вы «напихали» в неё, тем дольше придётся ждать. Обладатели многоядерных процессоров могут чуть облегчить свою участь, добавив к команде make параметр -j x , где x =число ядер+1. На тестовой машине с CPU AMD Phenom II X6 базовая x86-прошивка с небольшими дополнениями компилировалась в несколько потоков примерно 10-15 минут. Впрочем, иногда использование нескольких процессорных ядер может привести к ошибке во время сборки.

Make -j 7

Готовые файлы прошивок (trx, bin, iso и другие) будут лежать в папке bin. Процесс заливки прошивки зависит от модели роутера — ищите информацию в списке совместимости и вики. Для многих моделей генерируется сразу два файла: factory и upgrade. Первый нужен для замены стандартного ПО, а второй — для обновления уже установленной OpenWRT. Если вы создали тестовую x86-сборку, то её работоспособность можно проверить в виртуальной машине. VirtualBox для этого вполне подойдёт. Создайте новую ВМ, тип ОС выберите Linux 2.6, откажитесь от создания HDD. В качестве загрузочного CD используйте образ openwrt-x86-generic-rootfs-iso.img, у которого надо поменять расширение img на iso. Первый сетевой адаптер переключите в режим «Внутренняя сеть», а второй в режим NAT или моста.

Внутри второй ВМ можно запустить какой-нибудь Live-дистрибутив, предварительно переключив виртуальный сетевой интерфейс в режим «Внутренняя сеть». Ubuntu, например, или один из многочисленных вариантов WinPE. Эта машина должна автоматически получить IP-адрес по DHCP, а к псевдороутеру можно будет подключиться через веб-интерфейс или telnet. Если всё заработало так, как нужно, то можно приступать к сборке прошивки уже под конкретную модель роутера.

Make clean svn update ./scripts/feeds update -a

В общем, не так страшен чёрт, простите, пингвин, как его малюют. Хотя, надо признать, для рядового пользователя это не так уж просто. К сожалению, как и говорилось выше, какого-то универсального и простого руководства для сборки собственной прошивки нет. Мы постарались расписать наиболее общие шаги, но все нюансы и детали охватить просто невозможно. Ещё раз призываем наших читателей быть внимательнее во время сборки и предупреждаем, что неверные действия могут привести к «гибели» устройства и порой непростому восстановлению его работоспособности. Удачи!

Недавно мне понадобилось установить мою программу написанную на C(Си) на точку доступа под управлением OpenWRT. Уже была написана по сборке этой программы под Windows при помощи GCC из Cygwin. Для сборки же OpenWRT и всех поставляемых программ используется система сборки Buildroot и система пакетов ipkg . После долгих исследований OpenWrt Wiki и других сайтов найти актуальную документации не удалось. В итоге после сборки информации по крупицам я всетаки собрал пакет ipkg со своей программой. Дабы не пропасть приобретенным знаниям я решил написать данную статью.

Получение исходных кодов

Я собираю OpenWrt из исходных кодов ветки trunk. Получить её можно либо при помощи git:

git clone git://nbd.name/openwrt.git

Либо при помощи svn:

svn co svn://svn.openwrt.org/openwrt/trunk/ openwrt/

Как получить другие ветки, в том числе с пакетами, написано .

Подготовка к добаленю своего пакета

Переходим в полученный каталог



Понравилась статья? Поделитесь с друзьями!