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, как видно из примера, совершенно несложен (по крайней мере для «полноценного» Линукса со сборкой модулей ядра у меня было больше сложностей в своё время). Плюсы очевидны — не приходится ждать, чтобы в прошивку включили поддержку каких-то нужных опций ядра, всегда можно собрать требуемый модуль и добавить его в автозагрузку при старте роутера.



Category Рубрики: *NIX, Интернет | Tag Метки: , | Comments 4 комментария »

4 комментария

  1. tERBO says:

    А можно попросить туториал по подключению web-камеры к DD-WRT? 🙂

    • dimio says:

      Попробую разобраться и написать. Вот эту запись читали? Motion на роутере ставится из репозиториев, а вот есть ли поддержка камер в ядре — нужно смотреть 🙂

      • tERBO says:

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

Добавить комментарий