OpenWRT @ D-Link DIR-320

Feb 08, 2010 15:41


7 месяцев назад я купил забавную железку - DIR-320, забавную тем, что на ней, как и на каждом первом SOHO-роутере, бегает linux и, более того, под которую несложно состряпать свою прошивку.

Увы, полгода назад ситуация с поддержкой DIR-320 ванильным ядром была довольно грустна: если хотелось сохранить работоспособного wi-fi, то требовалось ставить ядро 2.4, в котором довольно плохо поддерживался USB. Это «довольно плохо» выражалось в том, что в произвольные моменты времени подключенная через USB флэшка или винт «отваливались» и более в систему не возвращались без классического паса руками «выключить и снова включить».

В ядре 2.6 же в драйвере b43 на тот момент не было поддержки LP_PHY для чипа BCM4318, точнее, работа над ним только начиналась и реализация была помечена как BROKEN. Но и в настоящий момент поддержка железа тоже далека от идеала, на странице драйвера b43 отмечено, что режим точки доступа на чипах 4318 не поддерживается из-за больших потерь пакетов при высоких скоростях. Действительно, при попытке завести точку доступа на всех 54 мегабитах 802.11g клиент к точке даже не мог подключиться из-за потерь пакетов, но если ограничить аппетиты 11 мегабитами 802.11b, то связь хоть и достаточно паршиво, но работает - для серфинга хватает.

Другое занятное развлечение - упихать максимально возможный набор утилит в 3.5 мегабайта флэшки. У меня уместились:
  • busybox, включая wget, crond, telnetd, syslogd, dhcp-клиент и dhcp-сервер
  • dropbear - ssh-сервер для управления роутером, т.к. telnet используется только для первоначальной конфигурации
  • madplay и драйвера для usb-звуковухи, которые в сопряжении с wget дают возможность играть разнообразные mp3-потоки, включая Радио «Воруй-Убивай»
  • transmission и web-интерфейс к нему - легковесная качалка/раздавалка торрентов
  • hostapd для работы wi-fi в режиме точки доступа
  • openntpd для поддержания точного времени на маршрутизаторе - наличие точного времени очень полезно при чтении логов
  • unfsd + portmap - NFS-сервер
  • pppd с поддержкой PPPoE
  • nvram + mtd для обновления прошивки без неудобных манипуляций с начальным загрузчиком

Для более плотного утрамбовывания я выкинул httpd из busybox, заменил dnsmasq на связку из udhcpd (для DHCP-сервера) и скриптов для iptables, которые позволяют отдавать статические настройки DNS через DHCP, чем выйграл порядка 80 килобайт. Также я заменил «ядрёный» NFS-сервер на unfs3, тут выйгрыш составил более 200 кб. При сборке transmission я использовал статические версии openssl, curl и libevent, что дало еще порядка полумегабайта места. Конечно, в openwrt включён скрипт mklibs.py, оптимизирующий динамические версии библиотек, удаляя из них не используемый приложениями код, но в случае с transmission он по какой-то причине работал некорректно, приводя к segfault при запуске демона. Судя по информации, полученной скупыми отладочными утилитами, mklibs.py вырезает много лишнего из libnsl.so и librt.so. Статическая линковка же является более отработанной технологией и в случае, если библиотека используется только одним приложением, даёт даже более хорошие результаты чем использование mklibs.py, но, увы, uclibc и libm остаются не оптимизированными. Вероятно, размер прошивки можно уменьшить еще на ≈100 кб., совместив эти два метода.

Конечно, целый набор ложек дёгтя тоже имеет место. Памяти на маршрутизаторе всего 32 мегабайта и одновременный старт NFS-сервера и torrent-клиента приводят к неимоверным тормозам всего кроме самой маршрутизации, доводя LA до ≈5. Поэтому стоит написать какие-то скрипты, переключающие «режимы работы» роутера. Более того, эти скрипты вполне можно запускать с помощью ssh, web-браузера или кнопки на торце роутера. Другой неприятностью является далеко не идеальная работа wi-fi, но для нужд интернет-радио и просмотра фильма с NFS-сервера стабильности хватает. Третья - uClibc не поддерживает fallocate и, соответственно, быстрое выделение нефрагментированного участка диска на разделе с ext4, а eglibc без плясок с бубном не собирается. Других проблем я пока не обнаружил.

Если кому-то интересны мои конфиги - их можно взять по адресу http://darkk.net.ru/home/openwrt

linux, openwrt, dlink dir-320, nfs

Previous post Next post
Up