Cборка модулей ядра для dd-wrt

Не смотря на то, что dd-wrt имеет достаточное количество собранных пакетов, доступных через пакетный менеджер, кое-чего иногда все же не хватает. Можно в принципе написать аналог этого “чего-то” на том же Perl и спокойно запустить на роутере, но такой подход в случае с относительно сложным и большим приложением нерационален. А в случае с нехваткой поддержки ядром прошивки нужных функций – и вовсе очень затруднителен. И тогда на помощь приходит старый добрый способ сборки из исходников, осложняющийся в данном случае тем фактом, что собирать на самом роутере не слишком удобно в силу ограниченности его ресурсов, а сборке на производительной машине препятствует разница в архитектурах процессоров (у DIR-620 это MIPS), если у вас конечно нет доступа к производительной MIPS-машине с аналогичной архитектурой ЦПУ 🙂 Вывод – нужен кросс-компилятор. О процессе сборки приложений и модулей ядра под dd-wrt на DIR-620 при помощи кросс-компилятора и пойдет речь ниже.

Готовимся к сборке: кросс-компилятор, исходники

Первое, что нужно для сборки под dd-wrt, если планируется использовать готовый кросс-компилятор, это *nix-машина с архитектурой x86_64 (по какой-то причине кросс-компилятор собран именно под 64-битную архитектуру, под 32-битную придется пересобирать самостоятельно).

Затем загружаем архив с набором различных версий кросс-компилятора и его исходниками (архив довольно тяжелый – больше 900 мегабайт, поэтому версию для DIR-620 я выложил отдельным архивом – toolchain-mipsel_gcc4.1.2, 24 Мб). Версию надо выбирать на основании архитектуры используемого в роутере процессора, в случае с DIR-620 вывод cat /proc/cpuinfo выглядит так:

system type : Ralink SoC
processor : 0
cpu model : MIPS 24K V4.12

Распаковываем нужную версию (для примера буду использовать домашний каталог) и каким-либо образом прописываем путь до кросс-компилятора в пути поиска исполняемых файлов, чтобы не править этот момент в makefile. Например: PATH=$PATH:~/toolchain/bin
Если использовать кросс-компилятор планируется часто, удобней конечно будет сделать симлинк где-то вроде /usr/bin.

Следующий шаг – получить исходники ядра прошивки при помощи svn (будут загружены в текущую директорию): svn co svn://svn.dd-wrt.com/DD-WRT/src/linux/brcm/linux-2.6.23. Нужно обратить внимание на версию ядра и загрузить совпадающую с той, что выдает вывод uname -a. Для моей сборки dd-wrt это 2.6.23. Или загрузить исходники нужного приложения оттуда, где они есть 🙂

Итак, кросс-компилятор распакован, исходники загружены, требуемые утилиты типа make или библиотеки типа ncurses для menuconfig можно установить в процессе, ориентируясь на сообщения компилятора. На этом подготовку можно считать законченной, пора перейти непосредственно к процессу сборки.

Сборка модулей ядра для dd-wrt

Собрать модулем поддержку USB-принтеров мне потребовалось в процессе создания сетевого принтера на основе роутера, описанном в заметке Подключение и настройка сетевого USB-принетра к dd-wrt на примере DIR-620 и Xerox Phaser 3140. Распишу процесс сборки подробней по шагам (модуль называется usblp.ko).

  • Переходим в директорию с загруженными исходниками, например ~/dd-wrt/linux-2.6.23 и снимаем копию со стандартного конфигурационного файла cp .config_std .config. Запускаем утилиту настройки конфига по вкусу, я предпочитаю make menuconfig (config слишком аскетично на мой вкус, xconfig – уже избыточно).
  • Первым делом нужно выставить правильную ревизию архитектуры процессора, для DIR-620 это делается так: CPU Selection -> CPU type -> MIPS32 Release 2.
  • Затем пробегаемся по настройкам, отключая все ненужное, а нужному выставляя сборку в виде модулей (если это в принципе возможно): <M>. Сохраняем конфигурацию, выходим из настройки.
  • При необходимости нужно в Makefile поправить версию ядра (чтобы модули загрузились, версия должна совпадать с выводом uname -a на роутере).
  • Дальше всё стандартно – собираем сами модули при помощи make modules.
  • Собранные модули копируем на роутер, например в /opt/lib и загружаем: insmod /opt/lib/usblp.ko. Проверяем, что модуль успешно загрузился, он должен присутствовать в выводе lsmod. Если отсутствует – проблемы загрузки будут присутствовать в выводе dmesg.

Процесс сборки модулей ядра для dd-wrt, как видно из примера, совершенно несложен (по крайней мере для “полноценного” Линукса со сборкой модулей ядра у меня было больше сложностей в своё время). Плюсы очевидны – не приходится ждать, чтобы в прошивку включили поддержку каких-то нужных опций ядра, всегда можно собрать требуемый модуль и добавить его в автозагрузку при старте роутера.

4 мысли о “Cборка модулей ядра для dd-wrt”

      1. Запись я читал, и именно по этому возник такой вопрос.
        Как я понял – чтобы иметь возможность ставить пакеты из репозитариев нужно включить своп и ещё какие-то разделы создать на флэшке. Вот хотелось бы готовое руководство как это всё и сразу сделать…

        1. Своп включать не обязательно, он нужен только если будут запускаться потребляющие много памяти приложения.
          Про подключение флешки или любого другого внешнего диска по USB и установку софта из репозитория – ссылка есть в конце этой заметки в общем-то, вот она: http://dimio.org/d-link-dir-620-i-dd-wrt-podklyuchenie-flash-ustanovka-programm-nastrojka-nas.html

Добавить комментарий для dimio Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *