Не смотря на то, что 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, как видно из примера, совершенно несложен (по крайней мере для «полноценного» Линукса со сборкой модулей ядра у меня было больше сложностей в своё время). Плюсы очевидны — не приходится ждать, чтобы в прошивку включили поддержку каких-то нужных опций ядра, всегда можно собрать требуемый модуль и добавить его в автозагрузку при старте роутера.
А можно попросить туториал по подключению web-камеры к DD-WRT? 🙂
Попробую разобраться и написать. Вот эту запись читали? Motion на роутере ставится из репозиториев, а вот есть ли поддержка камер в ядре — нужно смотреть 🙂
Запись я читал, и именно по этому возник такой вопрос.
Как я понял — чтобы иметь возможность ставить пакеты из репозитариев нужно включить своп и ещё какие-то разделы создать на флэшке. Вот хотелось бы готовое руководство как это всё и сразу сделать…
Своп включать не обязательно, он нужен только если будут запускаться потребляющие много памяти приложения.
Про подключение флешки или любого другого внешнего диска по USB и установку софта из репозитория — ссылка есть в конце этой заметки в общем-то, вот она: http://dimio.org/d-link-dir-620-i-dd-wrt-podklyuchenie-flash-ustanovka-programm-nastrojka-nas.html