Записки обо всём.
Содержание
Установка OpenWrt из Trunk
Несмотря на то, что рекомендуется устанавливать последние стабильные версии OpenWrt, иногда бывает необходимо установить самую свежую версию, например, если мы хотим поэксперементировать, или стабильная версия нас чем-то не устраивает. Так, например, у меня получилось, что я установил OpenWrt на роутер, с целью — поэксперементировать с вэб-камерой и программой-датчиком движения motion. Однако, оказалось, что на стабильной версии, Attitude Adjustment 12.09, трансляция изображения с вэбкамеры почему то работает не стабильно — постоянно режет кадры, из-за чего смотреть трансляцию практически невозможно и motion постоянно даёт ложные срабатывания. Поэтому я решил опробовать свежую сборку прошивки. Об этом ниже.
В данной статье речь пойдёт о роутере TP-Link TL-MR3020.
Итак Trunk — это тестовая ветка, в которую практически ежедневно выкладываются самые свежие сборки прошивки (на момент написания статьи — это Barrier Breaker), однако их стабильность и работоспособность не гарантируется.
Сохранение репозитория
Прежде, чем преступить к установке, остановимся подробнее на одной очень важной особенности ветки trunk, которую необходимо иметь ввиду! А заключается она в том, что вместе со сборкой прошивки, которая обновляется едва ли не ежедневно, обновляется и репозиторий пакетов программного обеспечения для неё. Поэтому, установив сборку из trunk, мы рискуем буквально на следующий день остаться без совместимого с ней репозитория. Чтобы этого не произошло, НЕОБХОДИМО ВМЕСТЕ СО СБОРКОЙ САМОЙ ПРОШИВКИ СКАЧИВАТЬ И РЕПОЗИТОРИЙ ПАКЕТОВ К НЕЙ!
Репозиторий можно разместить либо на локальном носителе роутера, либо, если есть такая возможность — на удалённом вэб-сервере. Я для этого использовал вэб-сервер, запущенный на другом роутере, тоже под управлением OpenWrt.
Чтобы упростить процесс скачивания, я написал небольшой скриптик: nano openwrt-trunk-download
# Корневая директория вэбсервера,
# сюда будет скачиваться репозиторий:
DIR=/usr/local/openwrt-repository
# Получаем текущую дату, она нам понадобится
# для удобства хранения разных ревизий:
DATE=`date +%Y-%m-%d`
# Проверяем, существует ли заданная директория,
# если нет — то создаём её:
if [ -d $DIR ]
then :
else
mkdir -p $DIR
fi
# Переходим в директорию для закачки,
# с помощью wget, качаем репозиторий,
# после чего полученную поддиректорию trunk
# переименовываем в соответствии с текущей датой
# и перемещаемся в неё (в поддиректорию нашей архитектуры):
cd $DIR
wget -r -np -nH -R index.htm* http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/ &&
mv snapshots/trunk snapshots/$DATE &&
cd snapshots/$DATE/ar71xx
# Скачиваем файл с контрольными суммами
# и необходимые прошивки:
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/md5sums
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-sysupgrade.bin
Сохраняем скрипт, делаем его исполняемым и переносим в подходящее место:
chmod 700 openwrt-trunk-download
mv openwrt-trunk-download /usr/bin
Если всё сделали правильно, то теперь мы можем скачать самую свежую сборку из trunk вместе с репозиторием одной командой:
Дожидаемся, пока процесс скачивания завершится и убеждаемся, что всё на своих местах:
ls -l /usr/local/openwrt-repository/snapshots/2013-10-15/ar71xx/
Теперь можем скачивать и прошивать OpenWrt уже со своего собственного хранилища:
cd /tmp
wget http://openwrt.osboy.ru/snapshots/2013-10-15/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
mtd -r write openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin firmware
По окончанию процесса прошивки роутер перезагрузится.
В заключение установки редактируем файл конфигурации менеджера пакетов opkg:
в котором указываем путь к нашему репозиторию:
src/gz barrier_breaker http://openwrt.osboy.ru/snapshots/2013-10-01/ar71xx/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
Настройка
Для возможности установки всех необходимых пакетов нам потребуется перенести корень (или /overlay) на внешний usb накопитель.
Для этого устанавливаем необходимые пакеты:
opkg update
opkg install block-mount kmod-usb-storage kmod-fs-ext4
Копируем систему (overlay) на флешку:
mkdir /mnt/sda1
mount -t ext4 /dev/sda1 /mnt/sda1
tar -C /overlay -cvf — . | tar -C /mnt/sda1 -xf —
umount /mnt/sda1
И настраиваем файл fstab. В версии Barrier Breaker используется новая утилита block, позволяющая создать файл fstab автоматически:
block detect > /etc/config/fstab
Затем открываем файл fstab:
и редактируем его в соответствии со своими потребностями:
config ‘global’
option anon_swap ‘0’
option anon_mount ‘0’
option auto_swap ‘1’
option auto_mount ‘1’
option delay_root ‘0’
option check_fs ‘0’
config ‘mount’
option target ‘/overlay’
option uuid ‘a36c5633-7eb8-432e-81b0-d968329056eb’
option enabled ‘1’
Тут мы видим, что вместо опции device используется опция uuid для идентификации нашаго монтируемого раздела на внешнем накопителе. Чтобы узнать значение uuid нашего раздела, используем команду:
block info
/dev/mtdblock2: UU
/dev/mtdblock3: TYPE="jffs2"
/dev/sda1: UU
Тут /dev/sda1 — единственный раздел, который я создал на флешке. Раздел подкачки (swap) в данном случае я не использую.
После перезагрузки проверяем, всё ли правильно примонтировалось:
df -h
Filesystem Size Used Available Use% Mounted on
rootfs 7.4G 67.7M 7.0G 1% /
/dev/root 1.8M 1.8M 0 100% /rom/rom
tmpfs 14.1M 52.0K 14.1M 0% /tmp
/dev/mtdblock3 1.1M 880.0K 208.0K 81% /rom/overlay
overlayfs:/overlay 1.1M 880.0K 208.0K 81% /rom
tmpfs 512.0K 0 512.0K 0% /dev
/dev/sda1 7.4G 67.7M 7.0G 1% /overlay
overlayfs:/overlay 7.4G 67.7M 7.0G 1% /
Устранение проблем
По идее описанных выше действий должно быть достаточно для готовности системы к дальнейшему использованию. Однако, как уже говорилось выше, работоспособность ветки trunk не гарантирована и могут возникнуть некоторые проблемы.
Так, например, у меня на момент написания статьи, в ревизии r38261, выявилось следующее:
Во-первых, с ошибками устанавливаются модули ядра и не запускаются автоматически. Приходится вручную их запускать командой modprobe. Причём некоторые модули после этого автоматически загружаются после перезагрузки (kmod-usb-storage), а некоторые не хотят (kmod-video-uvc). Приходится прописывать их запуск в файле /etc/rc.local .
А во-вторых, раздел на флешке никак не хотел монтироваться в /overlay, то есть не получалось перенести систему на флешку (extroot). Причем, если указать точку монтирования например /mnt/sda1 — то всё нормально монтировалось. Погуглив эту тему, я выяснил, что далеко не один с такой проблемой и что в некоторых ревизиях эта проблема периодически всплывает. На форуме OpenWrt было найдено решение этой проблемы: при запуске системы нужно выполнить:
Первое, что пришло в голову — прописать эти строки в /etc/rc.local . И, о чудо! После перезагрузки флешка прекрасно примонтировалась в /overlay . Однако, такой "костыль" оказался не лучшим решением. Дело в том, что пользовательские команды из файла /etc/rc.local , а значит и перенос корня (/overlay) выполняются при старте системы чуть ли не самыми последними — после того, как уже выполнены стартовые скрипты из директории /etc/rc.d . Поэтому, например, настройки dropbear при старте системы читаются из файла /etc/config/dropbear , сохранённого не на флешке, а во встроенной памяти роутера. И даже команды в файл /etc/rc.local придётся прописывать опять же во встроенной памяти, что создаст неудобства: для изменения этих файлов каждый раз придётся извлекать флешку, загружаться, вносить изменения, и только потом вставлять обратно флешку и загружать уже систему с неё.
Чтобы избавить себя от этих неудобств, я убрал эти две строки из /etc/rc.local и создал стартовый скрипт:
#!/bin/sh /etc/rc.common
START=02
start() <
export PREINIT=1
mount_root
# extroot on boot
>
Файл сохраняем, делаем его исполняемым:
chmod +x /etc/init.d/extroot
И активируем его выполнение при запуске системы:
После перезагрузки получаем систему с полноценным рабочим extroot.
I switched from default firmware to OpenWrt for my: TP-Link TL-WR1043N/ND v1 and have the problem that I am not able to install any new packages.
What I did:
- Flash OpenWrt
- Installed Luci (no problem there)
And than when I try to install anything else I get:
The important thing seems to be : * xsystem: wget: vfork: Out of memory. And yep I did try reboot and ‘update’ several times.
But under Luci -> Software I can see:

And here is my DF output:
Please does anyone have any idea what could cause the issue? I know the solution could be using an external USB but I want to aviod this at all costs + I cannot imagine that this router would have space just for luci 🙂
В этой статье я попытаюсь рассказать, как прошить на роутер OpenWrt и установить туда cjdns. По правде говоря, изучение тонкостей этого дела отняло у меня много времени и нервов. В основном потому, что многое в OpenWrt недодокументировано, и приходилось многое искать по форумам и додумывать. Думаю, это как раз тот случай, когда лучшей документацией являются исходники. Так что эту статью я попытаюсь написать такой, какую я хотел бы прочитать в самом начале этого пути.
Итак, первое, что следует сделать, это пойти на сайт OpenWrt и посмотреть список поддерживаемых устройств: wiki.openwrt.org/toh/start
Если не нашли вашу железку, не растраивайтесь. Мы ведь всегда можем портировать OpenWrt на новое утройство, следуя этой инструкции: kamikaze.openwrt.org/docs/openwrt.html#x1-540002.3 Хотя, сначала нужно как-то вытянуть исходники ядра у производителя.
Теперь немного теории. В OpenWrt для хранения rootfs используется две файловые системы: SquashFS и JJFS2. Так же вожможно подключение других, но об этом позже.
SquashFS — сжатая статическая файловая система. Она — то, что собственно и прошивается. За счет её статичности сжатие в ней лучше.
JJFS2 — сжатая динамическая файловая система, в которую записываются изменения файлов. Она монтируется как-бы поверх SquashFS при помощи фичи ядра Linux Overlayfs. Появилась она начиная с версии ядра 3.11.
Среду для сборки OpenWRT можно скачать в 4-х вариантах.
- OpenWrt Buildroot — эдакий монстр Франкенштейна, написаный на make, который сам качает исходники всего, что нужно, сам же патчит все это, сам собирает кросскомпилятор, собирает пакеты и образы для прошивки. Форк Buildroot Насчет формата этих makefil-ов. Тут достаточно процитировать документацию:
«Глядя на Makefile из какого либо пакета, вы вряд ли узнаете в нем обычный Makefile. Это может быть охарактеризовано как вопиющее пренебрежение и жестокое обращение с традиционным форматом make, однако, преобразование Makefile пакета в объектно-ориентированный шаблон позволило упростить весь процесс портирования приложений.» - OpenWrt Image Builder — то же самое, но грузит уже откомпиленые пакеты и собирает из них образ.
- OpenWrt SDK — то же самое, но набор програм для кросскомпиляции уже собран и собирать образы оно уже не может. Предназначено для сборки отдельных пакетов.
- OpenWrt based Toolchain — уже откомпиленый набор програм для кросскомпиляции, выдраный из Openwrt Buildroot.
Последние три могут быть собраны из OpenWrt Buildroot.
Как уже было сказано выше, в SquashFS сжатие лучше, так что у нас есть больше шансов уместить все, что нужно, собрав прошивку самостоятельно, чем скачав готовый образ и доставив нужный пакет. Для тех, кто собирается ставить готовую минимальную прошивку, вот сборки от разработчиков. Они рассортированы по архитектурам (колонка target в списке поддерживаемого оборудования) и по типу памяти (nand и все остальные), названия файлов включают в себя название роутера. Прошивки, содержащие в названии «sysupgrade» предназначены для перепрошивки средствами уже установленной OpenWrt. Содержащие «factory» можно скормить вебформе заводской прошивки. Не перепутайте.
Приступим к сборке.
Внимание! Сборка не должна проводится от суперпользователя или в fakeroot.
Для начала загрузим buildroot. Здесь есть список веток и команд для их загрузки. Мы же будем собирать Attitude Adjustment stable:
Репозиториев с beta, beta2, rc1 и rc2, видимо, нету, а жаль, потому что пакет, собраный для stable на beta не стал, только ругнулся, что git commit id ядра не тот, который нужен (хотя верси совпадали).
Далее, следуя инструкции, добавляем в список мест, откуда будут грузится исходники «репозиторий» с cjdns.
Добавляем в файл feeds.conf строку
Далее, грузим исходники всех пакетов:
и настраиваем все, что нужно. 
Выбираем «Target System» (ту, которая указана в списке поддерживаемых устройств возле названия вашего роутера), Subtarget (если в роутере постоянная память не NAND, смело выбираем Generic), «Target Profile» (ищем название роутера, под который будем собирать). В «Target Images» обычно ничего менять не надо. Выбираем пробелом.
На данном этапе все нужные драйверы уже отмечены (благодаря «Target Profile»). Далее ходим по остальным веткам и выбираем нужные нам пекеты (Именно нам. По идее, и так работать будет). Поиска здесь не предусмотрено, так что искать будем так:
Благо, большинство пакетов рассортировано по разделам. Хотя они могут находится и в ./package и тогда вы их таким образом не найдете. В выводе видим ./feeds/packages/utils/nano, что значит, что nano нам нужно искать в разделе «Utilities». Для полной уверенности можно почитать makefile пакта. Для nano это ./feeds/packages/utils/nano/Makefile. В нем мы видим такой фрагмент:
«CATEGORY» — название раздела, «SUBMENU» — название подраздела. Кстати, такая запись может быть не одна. Дело в том, что из одного набора исходников может собиратся несколько разных пакетов.
UPD: Хабрапользователь klirichek подсказал, что поиск здесь таки есть. Чтобы войти в него, нужно в menuconfig нажать "/". 
Получаем списочек объектов, название которых включает в себя введенный запрос, с полным описанием и расположением в меню.
Итак, пакеты, которые нам могут понадобится.
- nano — чтобы не пришлось править конфиги с помощью vi или cat/echo
- htop — просмотрщик процесов
- iftop — програмка для отслеживания сетевой активности (кто, с кем, на какой порт, с какой скоростью)
- tcpdump — ну куда ж без него?
- kmod-usb-storage — модуль ядра для подключения внешних носителей памяти по usb
- kmod-usb-storage-extras — модуль ядра для подключения некоторых экзотических внешних носителей памяти по usb (например, кардридера)
- block-mount — набор скриптов для автоматического монтирования по /etc/fstab. Для автомонтирования файловых систем по конфигам в формате uci (об этом позже) хватит и mount из busybox, но swap автоматически без них не монтируется.
- swap-utils — необходим для монтирования swap
- Всевозможные драйверы файловых систем. Найти можно в «Kernel modules»->«Filesystems»
- shadow-groopadd, shadow-groupdel, shadow-groupmod, shadow-groups, shadow-passwd, shadow-su, shadow-useradd, shadow-userdel, shadow-usermod — набор утилит для управления пользователями и группами. Обычно можно обойтись и без них.
- ip,iw,iptables,ip6tables — для ручной настройки сети
- bind-dig — dns-клиент
Следует отметить, что все может и не поместится. В таком случае образ для роутера собран не будет, но пакеты соберутся. Пакет можно отметить и так, чтобы он собрался, но в образ не включался. Для этого нужно нажать клавишу m.
А теперь расскажу об одном баге, который мешает установке cjdns. В зависимостях cjdns есть пакет с чудным названием nacl. Он используется при сборке других пакетов, но при этом бинарный пакет из него не собирается. В то же время, он появляется и в зависимостях бинарного пакета cjdns. В результате, чтобы установить уже собранный пакет с cjdns, нужно перед этим установить не существующий в собранном виде пакет nacl.
Теперь, как его обойти. Открываем ./openwrt/feeds/cjdns/cjdns/Makefile в текстовом редакторе, находим этот фрагмент:
и убераем из «DEPENDS» "+nacl". Должно получится так:
В menuconfig находим nacl (в разделе «Libraries») и устанавливаем в
Советую при сборке использовать не какой-то mate-terminal, а, к примеру tmux. Будет не очень приятно, если за время сборки, к примеру, упадут иксы.
Еще один нюанс. Чтобы после прошивки поднялась сеть, в прошивке должны быть конфиги настройки сети. Однако, для некоторых роутеров при сборке прошивки соответствующий конфиг не генерируется. В результате, роутер вроде-бы работает, но сеть не поднялась и мы получаем прекрасно работающий кирпич. Я, когда в первый раз собирал прошивку под свой tl-mr3220, столкнулся с этим и потом довольно долго искал нужный кабель и паял так называемый serial hack adapter, чтобы достучатся до железки.
Теперь о формате конфигов. В OpenWrt используется самопальный собственный формат конфигов UCI, общий для всего. Насколько я понял, они потом преобразуются в нормальные. Он, как мне кажется, достаточно хорошо документирован, так что останавливатся на нем не буду. Скажу только, что хранятся они в папке /etc/config/.
Чтобы добавить какие-то свои файлы, в том числе и конфиги, в прошивку, в папке с Buildroot нужно создать папку files и положить в нее нужные файлы. Например, тот же конфиг сети я положил в файл ./files/etc/config/network . Вот и сам конфиг для tl-mr3220 v1.2:
Его я извлек из прошивки, взятой с сайта OpenWrt и немножко подправил. Что значат поля _orig_ifname и _orig_bridge не спрашивайте, сам не знаю. Отмечу, что этот конфиг предусматривает, что роутер торчит в одну и ту же сеть всеми своими портами, а не, например, каким-то одним в интернет.
Теперь вернемся к cjdns. Чтобы пакет таки собрался, нужно его отметить в menuconfig: "Network"->"Routing and Redirection"->"cjdns".
Итак, настал торжественный момент:
После сборки файлы должны оказатся в ./bin, рассортированые по target-ам (пока он у нас один). К примеру, у меня собраные образы лежат в ./bin/ar71xx, а пакеты в ./bin/ar71xx/packages/. Теперь открываем архив ./bin/ar71xx/openwrt-ar71xx-generic-rootfs.tar.gz (или аналогичный для вашего target) и проверяем, действительно ли там есть конфиг сети.
Теперь можно прошивать.
Как уже говорилось выше, openwrt-ar71xx-generic-tl-mr3220-v1-squashfs-factory.bin можно скормить вебморде заводской прошивки. Еще раз повторю уже стандартное предупреждение, встречаемое чуть ли не везде, где пишут о процесе прошивки: ни в коем случае не прошивайте по wi-fi!
Прошивка при помощи уже установленого OpenWrt.
Заходим по ssh, проверяем, сколько оперативной памяти свободно:
Файл с новой прошивкой должен будет лежать в tmpfs.
Далее правим файл /etc/sysupgrade.conf. В нем должны лежать имена файлов и папок, которые сохранятся при перепрошивке (путем занесения в jffs2). Комментарии выделяются символом #. При сохранении конфигов таким образом возможны разные казусы, так как их формат может поменятся.
Копируем в /tmp на роутере (туда примонтирован tmpfs):
Проверяем целостность образа. На роутере считаем хеш файла образа:
и сверяем с хешем файла на компьютере.
Скрещиваем пальцы и прошиваем:
Если все прошло хорошо, роутер должен перезапустится. Заходим по ssh и с помощью passwd устанавливаем пароль root.
Существуют так же и другие способы прошивки, которые вариируются в зависимости от модели роутера. На части роутеров возможна прошивка с помощью загрузчика, есть и более хардкорные методы, предпологающие работу с паяльником.
Пакетный менеджер.
В OpenWrt в качестве пакетного менеджера используется opkg. Опции:
- update — Загрузить список пакетов в репозитории. Загружается он в /tmp/opkg-lists/snapshots, а в /tmp примонтирована tmpfs. Так что, после прерзагрузки для каких-либо действий с пакетами прийдется опять грузить список пакетов.
- upgrade — Начнем с того, что эта опция вам, скорей всего, не понадобится. Пакеты в репозиториях разработчиков меняются только в trunc. Если прописать другой репозиторий от другой версии, возможны казусы. Крайне не рекомендуется обновлять таким образом модули ядра (названия их пакетов начинаются на kmod-). Действия "обновить все под ряд" opkg не умеет вообще.
- install принимает название пакета, имя файла или url для скачивания:
- configure — Не совсем понятно, что делает. По видимому, еще раз выполняет конфигурационные скрипты пакета.
- remove — Удалить пакет.
- list — список пакетов.
- list-installed — список установленніх пакетов.
Полный список опций здесь: wiki.openwrt.org/doc/techref/opkg
Чтобы добавить репозиторий, в файл /etc/opkg.conf нужно добавить строку вида
Чтобы добавить репозиторий, находящийся в папке, нужно дописать
Отмечу, что подписывание пакетов, как в apt-get, не предусмотрено, как и забирание их по https. Насчет https, конечно, можно извернутся, но все упирается в неправильно подписаный сертификат на downloads.openwrt.org. Хотя, он не самоподписный, а значит, что, извернувшись вдвойне, может что-то получится.
Монтируем дополнителную память с флешки (если нужно).
На флешке должны быть соответствующие разделы. Для монтирования файловой системы лучше всего подойдет ext4. Итак, у нас есть размеченая флешка, которую мы втыкаем в порт на роутере. Проверяем, появились ли в /dev файлы раделов флешки. Если нет, доставляем нужные модули.
Далее, пытаемся монтировать:
Если не получилось, опять же, ставим нужные пакеты. Далее
Почему именно tar, а не по-нормальному? Должно быть, чтобы сохранить атрибуты файлов. Именно этот способ предлагается в wiki.openwrt.org/doc/howto/extroot#installation1 .
Далее, отмонтирываем и правим /etc/config/fstab. В него дописываем или меняем соответствующую секцию на это:
Чтобы изменения вступили в силу, делаем
Можно так-же монтировать по uuid, чтобы не было казусов при подключении нескольких устройств по usb. Для этого нужно убрать параметр "device" и добавить "uuid" с, собственно, uuid раздела.
Подробнее о параметрах здесь: wiki.openwrt.org/doc/uci/fstab#mounting.filesystem
Монтируем swap.
Для этого нужно, чтобы в конфиге было нечто вроде этого:
Здесь все аналогично. По поводу выбора размера swap. Для linux на десктопах часто советуют делать swap немного больше, чем размер оперативной памяти, чтобы при переходе в "спящий режим" (или как там оно называется?) все, что есть в оперативной памяти, поместилось в swap. Согласитесь, для роутера "спящий режим" — это бред. Так что для них действует другое правило — выделяйте побольше. 512 MiB, думаю, хватит всегда и всем!
Просмотреть обьем оперативной памяти и swap можно с помощью команды free.
И не забываем про uci commit.
Cтавим cjdns (если он не поместился в squashfs).
Копируем пакет с помощью scp в /tmp на роутере и устанавливаем с помощью opkg. Далее создаем конфиг cjdns. На некоторых роутерах это может длится долго. Далее добавляем в конфиг ноды, раскомментирываем раздел ETHInterface и прописываем интерфейс br-lan вместо eth0.
Настраиваем wi-fi в режиме ad-hoc.
Открываем /etc/config/wireless и добамляем секцию вроде этой:
Опция "device" должна содержать название "устройства", обозначеного в секции "wifi-device". У меня она выглядит так:
Тут есть один нюанс. Не все роутеры умеют поднимать несколько беспроводных сетей с одного физического устройства. Так что если после uci commit wireless ; /etc/init.d/wireless restart одна из сетей не поднялась, то прийдется обойтись одной. Чтобы отключить одну из сетей, достаточно установить опцию disabled в 1.
Теперь проверяем, не попала ли новосозданная сеть в bridge с нашей локальной сетью. Сначала определяем, какому интерфейсу какая сеть соответствует:
Если наш ad-hoc таки слинковался с локальной сетью, идем править /etc/config/network. Ищем секцию interface с опцией "type" установленой в "bridge" вроде этой:
Для этого случая нужно убрать из "_orig_ifname" "radio0.network1", а из "ifname" — "wlan0"
Теперь прописываем нужный интерфейс в конфиге cjdns. Секция ETHInterface, кстати, может выглядеть и так:
На десктопе такое работает, но на роутере, почему-то, с таким конфигом cjdroute падает. Так что, если у вас тоже это не работает, то прописываем что-то одно.
Создаем скрипт автозапуска.
Скрипты запуска должны лежать в папке /etc/init.d/ . Создаем файл /etc/init.d/cjdns :
$START и $STOP определяют последовательность запуска скриптов при старте и выключении роутера. "start()" — набор команд, выполняемый для запуска чего-либо. "stop()" — для остановки. Честно говоря, я слабо понимаю, чем может помочь функционал запуска скриптов при выключении, если роутеры принято выключать, просто выдергивая из розетки, а соответствующей кнопки обычно не предусмотрено. Вообще-то, в последних версиях cjdns предусмотрена опция конфига "pidFile", но это изменение пока не в ветке "master", из которой он собирается под OpenWrt.
Теперь осталось сделать
Подробнее о стартовых скриптах в OpenWrt можно почитать здесь: wiki.openwrt.org/doc/techref/initscripts
Фух, вроде, все. Удачной прошивки, и да не прийдется вам после нее работать паяльником!
UPD: Разработчики cjdns в последнем коммите в сборочные скрипты потерли все файлы и в README.md оставили сообщение, что отныне надо пользоваться сборочными скриптами от сиэтловцев.
UPD2: Сиэтлский вариант пакета у меня не заработал.
- Они решили сделать конфиг в формате uci. Это, конечно, хорошо, но ихний конвертер конфигов json-uci, написанный на LUA, не находит всех нужных библиотек, при том, что они-то как раз имелись, но немного в другом месте. Их копирование и создание линков не помогло — теперь ругается на ошибки в библиотеках.
- Запустить cjdroute вручную тоже не удалось. Как потом оказалось, он собирался из ветки crashey.
- В ихнем init-скрипте вовсю используются фичи, которые пока есть только в trunc.
- Все это вместе занимает много памяти. Впрочем, уменьшение занимаемого объема памяти есть в их todo.
Объем проделанной работы меня впечатлил, и реализация, вроде, не плохая. Так что пожелаю им удачи в их начинаниях.
Но собирать как-то все же надо, так что я решил почистить Makefile и сделать свой init-скрипт. Так же я убрал оттуда все, кроме В общем, получилась облегченная версия. Вот она: github.com/DinoAsm/cjdns-openwrt-tiny
Чтобы собрать, добавляем в feeds.conf эту строчку:
А дальше все так же, как было описано выше.





