FON. Более полное использование LaFonera.
FON. Более полное использование LaFonera.
Не так много русскоязычных ресурсов посвящено теме FON’а, в то время как ресурсов на других языках куда как больше. Постараюсь несколько восполнить этот пробел, ибо данный маршрутизатор весьма привлекателен не только своим компактным размером и соотношением цены/функционала, но и гибкостью настроек совместно с возможностью установки различных альтернативных версий программного обеспечения. Изложенные здесь сведения являются свободным переводом и обобщением информации из различных источников «в моем» исполнении ;-) Я же в свою очередь не претендую на оригинальность (а порой, и авторство) – это не более чем краткий русскоязычный пересказ содержания различных общедоступных тематических сайтов. Все предложенные в моей статье методы проверены на практике. Вся ответственность за использование/неиспользование материалов данного цикла статей лежит исключительно на читателе. Все программы и прочий контент, описываемый здесь будет (по возможности) выложен на моем сервере (дабы всегда был доступен). Подборка софта ориентирована на операционку Windows.
Что я посетил (обдумал и переработал) перед созданием данного материала?
Не стану рассказывать азы и базу пользовательского уровня, все это можно прочесть на следующих русскоязычных сайтах:
https://www.fon.com/ru/info/whatsFon — Инфа от российского дистрибьютора FON – Комстара.
http://www.migera.ru/hard/solution/fon.html — Комментарий на тему FON от Комстара.
Приведу и основные англоязычные сайты:
http://wiki.fon.com/wiki/Main_Page — (официальный вики-проект на многих языках) много базовой информации и ссылок на другие ресурсы.
http://boards.fon.com – официальный форум.
http://blog.fon.com/en/ — официальный блог.
http://www.fonboard.nl/w/index.php/Main_Page — еще одна не менее глобальная вики …
http://www.fonboard.nl/w/index.php/HowTo_Foneraplus_unlocking — … и собственно самое интересное из нее.
http://trac.freewlan.info/wiki/ — полностью переделанная веб-морда да с различными дополнениями, но только для первого поколения фонеры.
http://wiki.fon.com/wiki/FreeWLAN — сторонняя инфа про вышеуказанный проект.
http://ecos.sourceware.org/docs-latest/redboot/redboot-guide.html — документация по загрузчику RedBoot.
http://busybox.net/downloads/BusyBox.html — справка по командам BusyBox.
А есть множество сайтов и на других языках (или частично переведенных на английский), например:
http://wiki.francofon.fr/index.php/Accueil_en — (основной язык — французский) посвящен альтернативной прошивке для «не плюсовой» фонеры, есть и общие интересные материалы.
Для желающих «капнуть поглубже» еще ссылки:
http://downloads.openwrt.org/kamikaze/7.06/atheros-2.6/packages/ — репозиторий пакетов для одной из версий OpenWrt в целом (фонеры в частности).
http://download.berlin.freifunk.net/fonera/ — репозиторий пакетов (ядро для фонеры первого поколения).
http://eric.levine.free.fr/foneraplus/ — репозиторий всякой-всячины для плюсовой фонеры в целом …
http://eric.levine.free.fr/foneraplus/Packages/ — … в частности репозиторий пакетов.
http://download.fonosfera.org/ — репозиторий всякой-всячины в основном для фонеры 2.0g
http://stefans.datenbruch.de/lafonera/ — много полезной инфы (хотя тоже ориентировано на первое поколение фонеры) – основные идеи могут пригодиться.
http://www.easy2design.de/bla/fonera-debricking-and-more/ — много интересного …
И так, что же интересного можно сделать с фонерой – или чего не написали на официальных сайтах? Ориентироваться будем на устройство LaFonera+ (FON 2201), ибо в наличие у меня есть только оно. А вообще все их разнообразие таково:
|
FON 2100 (LaFonera v1.0) |
FON 2200 (LaFonera v1.1) |
FON 2201 (LaFonera+ v1.5) |
FON 2202 (LaFonera v2.0g) |
FON 2303 (LaFonera v2.0n) |
Напряжение питания, В/А |
5/2 |
7.5/1 |
7.5/1 |
7.5/1 |
12/1 |
Память Flash/RAM, Мбайт |
8/16 |
8/16 |
8/16 |
8/32 |
8/64 |
Процессор |
Atheros AR2315 |
Atheros AR2315 |
Atheros AR2315 |
Atheros AR2315 |
Ralink RT3052 |
* Характеристики процессора |
183MHz 32bit MIPS R4000 |
183MHz 32bit MIPS R4000 |
183MHz 32bit MIPS R4000 |
183MHz 32bit MIPS R4000 |
384MHz MIPS 24KEc |
Загрузчик (Bootloader) |
RedBoot |
RedBoot |
RedBoot |
RedBoot |
? |
Wi-Fi модуль |
Интегрированный |
Интегрированный |
Интегрированный |
Интегрированный |
802.11b/g 802.11n |
* Антенна (разъем — усиление) |
RP-SMA — 2dBi |
RP-SMA — 2dBi |
RP-SMA — 1.5dBi |
RP-SMA — 1.5dBi |
Fixed — 2 x 3dBi (2T2R MIMO) |
*Аутентификация |
WEP(64,128), WPA, WPA2 |
WEP(64,128), WPA, WPA2 |
WEP(64,128), WPA, WPA2 |
WEP(64,128), WPA, WPA2 |
WEP(64,128), WPA, WPA2 |
* Шифрование |
TKIP, AES |
TKIP, AES |
TKIP, AES |
TKIP, AES |
TKIP, AES |
Порты EtherNet |
WAN (10/100) |
WAN (10/100) |
WAN, LAN (10/100) |
WAN, LAN (10/100) |
WAN, 4 — LAN (10/100) |
* Коммутатор (Switch) |
— |
— |
Marvell 88E6060 |
Marvell 88E6060 |
? |
Порты USB |
— |
— |
— |
1 – USB 2.0 |
1 – USB 2.0 |
Сервисные порты |
Serial, SPI, JTAG |
Serial, SPI, JTAG |
Serial, SPI, JTAG |
Serial, SPI, JTAG |
? |
Медленное погружение – первый взгляд в «замочную скважину» …
Фонера представляет собой линуксовую машинку. Исходный код операционной системы (ОС) можно скачать с официального сайта FON, там, конечно, не самые последние сборки, но ориентироваться на них для понимания функционирования можно (собирать их не пытался). «Оригинальная» (так впредь будем называть сборки, предлагаемые для устройств «фонера» официальным сайтом http://www.fon.com/en) прошивка наделена определенным набором функционала и разработчик постарался (слегка) закрыть ее от всякого внешнего доступа (вероятно из соображений безопасности или иных), а также от различных модификаций (что собственно и огорчает). По задумке разработчика устройство само обновляет в себе прошивку по своей инициативе (или инициативе сервера?) – что не столь важно, как важно то, что пользователь никак не может и стимулировать этот процесс, ни отказаться от него. Хотя и предусмотрен способ ручного обновления (через панель администрирования устройства), но последняя версия почему-то не доступна для «ручного» скачивания, кстати, через данный интерфейс прошивку можно лишь «повышать» (и это не единственное ограничение).
Прошивка сконструирована на базе сборки OpenWrt, и фактически содержит в себе те основные модули системы Linux в целом, и конкретно названной сборки в частности – которые и обеспечивают функционал устройства (ядро системы под установленный процессор, драйвера периферии, межсетевой экран, WEB и SSH серверы, многое другое).
Ту идеологию, которую нам предлагает FON (раздача «своего» канала доступа к интернету взамен возможности использовать «чужой») реализована несколькими по большому счету независимыми друг от друга модулями, сопряженными «в единое целое», к созданию которых, конкретно FON отношения никакого не имеет. Попытаемся разложить по полочкам этот функционал (может быть слегка кустарно, но для общего понимания модели этого достаточно). Точка доступа FON (фонера) реализует фактически две основные вещи:
- Обеспечивает авторизацию пользователей публичного канала через RADIUS-сервер FON (помимо прохождения аутентификации, необходимо выполнение одного из двух правил: пользователь оплатил доступ в сеть, или пользователь имеет свою включенную точку доступа FON);
- Оповещает сервер FON о своей активности (тем самым давая возможность пользователю безвозмездно использовать интернет через другие точки доступа FON).
Остальной функционал является, по-сути, дополняющим основную идею.
Вкратце об основных модулях, установленных в фонере:
- Организация беспроводного интерфейса:
- chillispot – «верхний» уровень интерфейса Wi-Fi организующий публичную точку доступа (хот-спот) для пользователей FON (с идентификатором SSID: FON_* и аутентификацией через RADIUS-сервер) и приватную, для использования владельцем (с произвольным идентификатором) – на базе одного сетевого Wi-Fi интерфейса и т.п.;
- hostapd – «чуть более низкий» уровень – модуль, реализующий работу Wi-Fi интерфейса в режиме точки доступа (AP);
- madwifi – «низкоуровневый» драйвер Wi-Fi;
- Организация маршрутизатора:
- iptable, qos, dnsmasq … — компоненты типичные для любых linux-систем …
- Общесистемные:
- MiniFO – системная утилита реализующая «зеркалирование» измененных данных относительно базового образа на файловой системе RootsFS (ro) путем их сохранения на JFFS (r/w);
- Busybox – командный процессор, включает в себя различные команды и утилиты. Является не только шелом командной строки, но и обеспечивает работу множества системных функций (сервисов);
- … — обо всем вкратце и не расскажешь, да и не к месту это сейчас.
Внедрение в систему или «копаем глубже» …
Рассмотрим подробнее: из каких модулей состоит прошивка (содержимое микросхемы флэш-памяти на низком уровне), какие существуют пути отката в непредвиденных случаях, сбоях или просто как установить иную версию прошивки. Можно сразу оговориться, что для подобного класса устройств употреблять слово «прошивка» не совсем логически корректно – скорее это следует называть «базовым образом операционной системы», но для удобства и краткости использовать первый вариант (понимая под ним второй ;-)
Name |
FLASH addr |
Mem addr |
Length |
Entry point |
RedBoot |
0xA8000000 |
0xA8000000 |
0x00030000 |
0x00000000 |
loader |
0xA8030000 |
0x80100000 |
0x00010000 |
0x80100000 |
image |
0xA8040000 |
0x80040400 |
0x00620000 |
0x80040400 |
image2 |
0xA8660000 |
0xA8660000 |
0x00140000 |
0x80040400 |
FIS directory |
0xA87E0000 |
0xA87E0000 |
0x0000F000 |
0x00000000 |
RedBoot config |
0xA87EF000 |
0xA87EF000 |
0x00001000 |
0x00000000 |
RedBoot – Базовый загрузчик с минимальным набором функций. Не обновляется и не должен изменяться ни в коем случае! По крайней мере в его изменении нет никакой необходимости. Если он цел и функционирует корректно, вы можете всегда «зашить» в фонеру то, что вам угодно. Всегда обращайте внимание и перепроверяйте по каким адресам производите запись (при управлении из командной строки), дабы ненароком не тронуть RedBoot.
Loader – Загрузчик операционной системы (составной элемент «прошивки») – может обновляться, хотя в большинстве случаев этого не требуется.
Image – Образ операционной системы – так скажем «сама прошивка», фактически является контейнером и содержит в себе RootFS, JFFS и блоки конфигурации.
Image2 – Резервный, минимальный образ операционной системы — так скажем Safe-Mode (полезность его наличия при доступе к RedBoot не очевидна).
FIS directory – Служебная область обновляется без участия пользователя.
RedBoot config – Конфигурация загрузчика RedBoot. Обновляется динамически самим загрузчиком (соответствующими командами) – лишний раз подумайте: «зачем?» — перед тем как «конфигурировать» RedBoot (даже после прочтения документации по ссылке вначале).
PS. Таблица получается командой fis list из командной строки загрузчика RedBoot.
PPS. Здесь и далее примем следующие обозначения – текст команд набираемых в командной строке терминала будем отражать белым текстом по черному фону. А содержимое любых конфигурационных файлов (редактируемых любым текстовым редактором, например встроенным в FAR) – белым текстом по синему фону.
Готовим тыл для отступления.
Теперь о самом важном – откате в случае неудачи или необходимости прошивки «неработоспособного» устройства. Одно важное условие — должен быть «жив» загрузчик RedBoot. Путь один, его реализаций много – суть – «подцепиться» к RedBoot, который доступен всего пару секунд в самом начале загрузки после подачи питания. Наиболее простой способ воспользоваться утилитой с сайта http://www.gargoyle-router.com, которая позволяет прошить в фонеру как оригинальную прошивку, состоящую из 3-х файлов (loader, image, image2) – так и альтернативные (OpenWrt, DD-Wrt, и т.п.). Файлы оригинальной прошивки в «трехкомпонентном» варианте на официальном сайте не выложены, но найти их (скачать) можно – версия 1.1.1.1. Не знаю почему, но обновление с этой версии на последующую (1.1.2.1) у меня не происходило, что не напрягает – я с этим не заморачивался, просто как факт. Также есть официальное обновление до версии 1.1.1.1 (видимо, с более ранних) в виде одного файла (с официального сайта или с этого сервера).
Как «шиться»? Прошивальщик gargoyle (скачать) практически полностью автоматизирует процесс прошивки (прошивка через RedBoot). Требуется выбрать сетевую карту, к которой подключена фонера (LAN интерфейс), тип прошивки (Fonera Firmware), и указать заливаемые файлы (loader, image, image2). Далее нажать кнопку начала процесса и воткнуть кабель питания в фонеру – процесс прошивки занимает до 30 минут!
В случае, если по какой-то причине «загублен» RedBoot – то выход один – открывать корпус и «подпаиваться» к интерфейсу rs-232 или JTAG на плате устройства, описание этого процесса выходит за рамки данного материала.
Зачем мы сюда пришли?
Какие же существуют пути получение большего функционала от фонеры, нежели предусматривает оригинальная прошивка и веб-морда, как единственный орган управления? Способ первый – координальный – прошиться на альтернативную прошивку dd-wrt со всеми ее «вкусностями» и нюансами, как-то например, что связку компонентов для работы с системой FON нужно настраивать вручную ;-(. Второй вариант – «открыть» SSH доступ к устройству без перехода на альтернативную прошивку – появляется возможность заглянуть внутрь операционки устройства и гибко ее конфигурировать, а также устанавливать дополнительные модули (программы).
Начнем со второго варианта. Еще раз обращаю внимание, что работаем мы c «плюсовой» фонерой (FON 2201 – «полуторное» поколение), несовместимой с устройствами FON 2100 и 2200 (для которых в интернете не мало всяких наработок – нам они не подходят)! Так, например модификации с сайта francofon.fr ориентированы на первое поколение фонер. Открытие доступа к SSH сводится к замене одной части прошивки (image) на модифицированную (скачать)(приведенные ниже командные строки именно для этого файла, с учетом его имени и размера). Сделать это можно как при помощи вышеупомянутого прошивальщика gargoyle – при этом будут прошиты все три части (рассмотрим позже), так и через командную строку RedBoot. Для удобства работы с командной строкой RedBoot, а вернее для упрощения ее запуска существует утилита openfonera (скачать) – являющаяся не более чем скриптовой оболочкой. Мысли при подготовке данного алгоритма были позаимствованы из следующих источников:
http://wifi.wikia.com/wiki/Unlock_la_fonera_plus
http://wiki.francofon.fr/index.php/Accueil_en/tuto_foneraplus_en/open_ssh_without_cable
http://la-fon.blogspot.com/search/label/La%20Fonera%20plus
Итак, по пунктам:
- Установить openfonera и подконнектиться к RedBoot – для этого:
- Подключить фонеру через порт LAN к компу, отключив при этом иные активные сетевые интерфейсы, а также отключив кабель от порта WAN фонеры;
- Назначить сетевому интерфейсу компа статический адрес 192.168.1.254/24;
- Отключить питание фонеры;
- В утилите openfonera указать верный путь к файлу putty.exe (кликнуть по файлу) и нажать кнопку «ping», включить питание фонеры – должно произойти подключение к RedBoot (может получиться не с первого раза). Это же можно выполнить вручную – подконнектившись по протоколу telnet на адрес 192.168.1.1 по порту 9000 в первые несколько секунд после включения фонеры. В любом случае вы должны увидеть приглашение командной строки RedBoot. Пока не будем подробно расписывать все возможности этого загрузчика (см. ссылки вначале).
- В строке «Directory of firmware» указываем полный путь к папке, где лежит файл заливаемого образа – жмем «Run HTTP Server». Также можно использовать сторонний сервер TFTP – заменив в соответствующей строке (см. ниже) название протокола с HTTP на TFTP и указав порт 69 (вместо 9001).
- Работаем с RedBoot. Нам нужно выполнить следующие шаги:
- Удалить текущий образ из флэш-памяти устройства — fis delete image (операция занимает пару минут)
- Закачать новый образ в оперативную память устройства —
load -r -b 0x80100000 /image.bin -m HTTP -p 9001 -h 192.168.1.254 (указывается реальное имя файла на диске, процесс занимает пару минут) - Дать команду на прошивку образа в требуемое место флэш-памяти —
fis create -b 0x80100000 -l 0x00610000 -f 0xA8040000 -e 0x80040400 -r 0x80040400 image (здесь image это имя блока на флэш-памяти, процесс записи происходит порядка 20 минут!) - Перезагрузить устройство – reset
Теперь мы имеем доступ к фонере из сети через порт LAN и по приватному каналу Wi-Fi по протоколу SSH (порт 22) – можем им воспользоваться, например, через клиент putty (указать ссылку). Адрес устройства после прошивки (по-умолчанию) 192.168.10.1 логин root, пароль admin. Модификация заключается в добавлении на файловую систему JFFS сконфигурированного SSH клиент-сервера dropbear. Стоит отметить, что на данную модификацию устанавливается (автоматически) обновление с официального сервера до версии 1.1.2.1 – при этом доступ к SSH сохраняется.
Есть и более удобный способ использования SSH – при помощи клиента WinSCP (из панели FAR, например) – в этом случае вы можете не только наглядно видеть и серфить по всей файловой системе устройства, но и осуществлять просмотр, редактирование, а также удаление и копирование файлов. Однако стоит учитывать, что добавления и изменения «журналируются» на разделе JFFS (уменьшая доступное пространство на этом разделе), а изменения в разделе RAM-диска не сохранятся после перезагрузки фонеры. Также проявляйте осторожность при редактировании конфигурационных файлов, делайте резервные копии.
Для того чтобы обеспечить доступ к SSH по интерфейсу WAN необходимо прописать соответствующее правило в межсетевом экране фонеры – например в файле /jffs/etc/firewall.user раскомментировать строки:
iptables -t nat -A prerouting_wan -p tcp —dport 22 -j ACCEPT
iptables -A input_wan -p tcp —dport 22 -j ACCEPT
Если после прошивки в веб-морде висит лейбл информирующий об отсутствии регистрации фонеры на сервере FON, а на практике это не так – выполните следующую команду echo 1 > /etc/config/registered
Для открытия доступа к веб-морде через WAN интервейс в файл /jffs/etc/firewall.user добавляем следующие строки:
## HTTP-interface 80 to WAN
iptables -t nat -A prerouting_rule -i $WAN -p tcp —dport 80 -j ACCEPT
iptables -A input_rule -i $WAN -p tcp —dport 80 -j ACCEPT
Теперь к более интересным вещам, ради чего действительно стоило открывать SSH доступ!
Отключаемся от «матрицы» или путь на свободу!
Как уже вскользь упоминалось, сервер FON может полностью управлять нашей фонерой без нашего ведома и нашего на то желания – просто по своей инициативе! Осуществляет он это через SSH соединение и через скрипт thinclient (элемент «прошивки»), который в свою очередь создает в файловой системе фонеры еще один скрипт /tmp/.thinclient.sh – в который сервер FON и записывает то, что он хочет выполнить на нашем устройстве. А возможности тут неограниченны ничем! Можно закачать, откуда угодно и что угодно, а после этого выполнить это на нашей фонере! Собственно по этой схеме и происходит обновление прошивки устройства. Подобная ситуация меня не устраивала просто по определению – и исправить ее есть способ.
- Находим файл /bin/thinclient – делаем его резервную копию («шоб було»);
- Открываем его и ищем следующие строки (в моем случае 24 и 25 строки):
. /tmp/.thinclient.sh
rm /tmp/.thinclient.sh
- Комментируем первую из них символом «#»:
# . /tmp/.thinclient.sh
- Перед второй строкой дописываем ниже следующее:
TCDIR="/etc/thinclient-scripts/"
LASTFILE="$(ls $TCDIR | sort -n | tail -n1)"
COPY=0
if [ -z "$LASTFILE" ]; then
COPY=1
else
LASTCS="$(md5sum $TCDIR/$LASTFILE | cut -d\ -f1)"
NEWCS="$(md5sum /tmp/.thinclient.sh | cut -d\ -f1)"
echo "$LASTCS $NEWCS"
if [ "$LASTCS" != "$NEWCS" ]; then
COPY=1
else
echo "Already seen this file."
fi
fi
if [ "$COPY" -eq 1 ]; then
NEWFILE="$TCDIR/thinclient-$(date ‘+%Y%m%d-%H%M’)"
echo "Copying new instruction set to $NEWFILE"
[ -s /tmp/.thinclient.sh ] && cp /tmp/.thinclient.sh $NEWFILE
else
echo "Nothing new here."
fi
- Меняем права доступа на файл в 555 (чтоб никто просто так не перезаписал нам этот скрипт – прецеденты были);
- Создаем в папке /etc директорию /thinclient-scripts;
- Перезагружаем фонеру, например командой reboot
Теперь поподробнее о том, что мы сделали: cтрока 24 . /tmp/.thinclient.sh осуществляет запуск подготовленного и сохраненного скрипта на нашей фонере – закомментировав сею строчку мы блокируем запуск. Следующая строка удаляет отработавший скрипт. В принципе этой блокировкой можно и ограничиться (и пропустить пункты 4 и 6), но подобным способом распространяются обновления операционной системы (которые мы уже не получим), да и просто интересно – что хочет от нас сервер FON! Кусок скрипта предложенный к добавлению сохраняет все командные файлы сформированные сервером и предназначенные для выполнения нами «втемную» в отдельную папочку /etc/thinclient-scripts – имена файлов содержат в себе дату и время их создания. Можно ознакомиться с их содержимым и если мы найдем его вдруг полезным (обновление прошивки, например) – то можно организовать запуск нужного нам фрагмента или всего файла (об этом ниже). Все, можно вздохнуть спокойно ;-)
Глубокий вдох и в путь …
Теперь наши возможности по управлению фонерой существенно расширились, появилась возможность устанавливать новые пакеты (программы). С целью оценить, что есть и что целесообразно установить обращаемся к одному из репозиториев (см. ссылки вначале).
Но все по порядку. Сейчас самое время осуществить настройки фонеры, доступные через ее стандартную веб-морду, дабы потом уже вновь к ним не возвращаться заняться уже более тонким «тюнингом».
Официальные обновления.
Помимо всяких управляющих команд, меняющих наши конфигурационные файлы, FON иногда еще готовит и раздает обновления. Разумеется что теперь у нас ничего автоматом не ставиться ;-) Но информацию «что с нами хотели сделать» у нас сохраняется – благодаря ей, мы можем посмотреть откуда скачивать пакет обновления, скачать его … ну а далее на усмотрение – можно «поковырять» его прежде чем ставить. Еще бывает так, что FON в упор не хочет нас обновлять – вот тут-то нам и пригодятся скаченные пакеты обновлений! «Базу» для скрипта установки берем из «присланного». С учетом того что изначально мы «прошили» версию 1.1.1.1 – для нас доступны два обновления (все обновления, по задумке FON, следует ставить последовательно) – это версия 1.1.2.1 и 1.1.2.2 . Устанавливаем каждую из них следующим образом:
- Качаем и распаковываем соответствующий архив, содержащий официальный пакет обновления и скрипт для его установки;
- Копируем эти два файла в каталог /tmp (на фонере) – скрипту присваиваем права доступа 755;
- Через консоль SSH выполняем наш скрипт /tmp/install.sh … ждем все должно отработать и фонера перезагрузится;
- Иногда (почему то) случаются ошибки … некоторые компоненты устанавливаются не полностью – в этом случае можно обратиться к распакованному архиву, посмотреть в нем содержимое скрипта upgrade и скопировать файлы в нужные места от корня, после чего перезагрузиться.
Версия обновления |
Обновляемые компоненты |
Ссылка на архив пакета обновления |
Ссылка на архив распакованного пакета |
1.1.1.1 |
chillispot, fonsmcd, скрипты web-морды (многие …) |
(по заявкам) |
|
1.1.1.2 |
hostapd, madwifi, скрипты web-морды (update.sh) |
(по заявкам) |
Справедливости ради стоит отметить, что формально «обновления прошивки» не происходит, — а происходит обновление некоторых компонентов «базового образа операционной системы» (RootFS) путем записи соответствующих файлов на JFFS.
Чуть подробнее о файловой структуре.
«Линуксоидам» данный раздел не читать! Для всех остальных кратенький ликбез («по домашнему»):
В отличие от систем Windows бравших свое начало от DOS, где «центром вселенной» является «диск» — подобным центром в системах Linux является само устройство! И начинается все просто с «корня», обозначаемого символом «/». От корня начинается иерархическая система папок (каталогов), фалов, ярлыков (ссылок). В корне располагаются предопределенные системой папки (на примере OpenWRT на фонере):
/bin – хранит исполняемые файлы (по «виндовски» — «экзешники») и скрипты («батники»);
/dev – подобие диспетчера устройств, с тем отличием что через эту структуру с устройствами можно работать (а не только «любоваться» ими);
/etc – «хранилище» конфигурационных файлов;
/jffs – корень журналируемой файловой системы (см. ниже);
/lib – «хранилище» общесистемных библиотек, драйверов и т.п.;
/mnt – точка предназначенная для «монтирования» всякой-всячины (по чисто-эстетическим соображениям);
/proc – динамическая структура – некое подобие «диспетчера задач», но опять таки с возможностью передачи/приема информации от процессов (при помощи обычных файловых операций, как и в случае с /dev);
/rom – корень файловой системы «образа» — RootFS (см. ниже);
/sbin – тоже исполняемые файлы, но по функционалу являющие собой «сервисы» (по виндовски, а по линуксовому «демоны»);
/sys – динамическая системная структура;
/tmp – RAM-диск;
/usr – профили пользователей – для данного примера пользователь один – root и структура с поддержанием нескольких профилей не поддерживается. Другими словами – еще одно расширение базового образа;
/var – содержимое RAM-диска «по-умолчанию»;
/www – корневая папка веб-сервера.
Ограничение скорости канала средствами QoS (Bandwidth, transfer rate).
Возможностей для реализации подобного функционала много. Рассмотрим один из способов, предлагаемый «администраторами» FON (личный кабинет на сайте FON «предписывает» нашей фонере ограничивать скорость именно так) – через сервис контроля качества QoS. Его конфигурационный файл /etc/config/qos в самом начале содержит строки определяющие ограничение скорости, например для установки симметричного канала в 3Мбит/сек. Нужно привести их к следующему виду:
config interface wan
option classgroup "Default"
option enabled 1
option overhead 1
option upload 3072
option download 3072
Того же эффекта можно добиться при помощи консольных команд:
uci set qos.wan.upload=3072
uci set qos.wan.download=3072
uci commit
Чтобы снять ограничения скорости, а вместе с тем и полностью отрубить QoS на интерфейсе wan можно установив значение enable в ноль путем редактирования файла, или следующими командами:
uci set qos.wan.enabled=0
uci commit
После выполнения конфигурации перезагружаем фонеру.
Мелкие исправления.
Если на веб-морде фонеры висит картинка с приглашением к активации устройства на сайте FON, а устройство уже активировано и замечательно определяется сервером, то нужно всего-навсего подправить одну циферку – а именно в файле /etc/config/registered заменить ноль на единичку (в виде текста).
Настроим корректно временной пояс для системных часов фонеры (актуально для программ мониторинга). Для этого внесем в файл /etc/TZ требуемую строчку, например для Москвы:
MSK-3MSD,M3.5.0/2,M10.5.0/3
Строки для некоторых других регионов собраны в этом файле.
Перезагружаем фонеру.
Впредь я постараюсь не делать столь детальный акцент на тривиальных вещах, как-то, например, необходимость перезагрузки устройства после внесения изменений в конфигурационные файлы. Стоит также отметить что в ряде случаем можно не ребутаться а осуществлять перезапуск конфигурируемых утилит, что в случае длинной цепочки взаимосвязей не всегда корректно отрабатывает – перезагрузка в этом случае надежней. Разумеется логичный способ перезагрузиться – выполнить команду reboot , можно поступить более координально – передернуть питание (что не желательно, дабы не попасть в момент записи данных).
Продолжим …
Есть и много приятных мелочей и не только. Начнем как всегда из далека, от простого к сложному…
Есть такой проект http://www.fonera.be/status-index.php предложенным там скриптом можно установить в фонеру дополнительный модуль, отправляющий статистику на сервер проекта – получить статистику можно в виде картинки (два варианта на выбор), дабы разместить их у себя на сайте или в подписи на форуме.
Как пример можно несколько модифицировать стартовую страничку веб-морды («рыжую» с редиректом) – добавив на нее указанные картинки. Не вдаваясь пока в подробности (об этом ниже) подкорректируем /www/index.html – уберем из заголовка строку с meta … refresh и добавим в желаемое место предложенные нам коды баннеров. Теперь при заходе на заглавную страничку администраторской панели будем видеть общую статистику работы.
Раз уж завели разговор об веб-морде, то добавим на нее еще одну полезную «закладку» — консоль выполнения команд.
Создание раздела Diagnostics – консоль выполнения команд.
Данный аддон устанавливается достаточно просто. Шаг первый: нужно разместить в папке /www/cgi-bin/webif текстовый файл с именем diag.sh следующего содержания (копирайты сохранены):
#!/usr/bin/webif-page
<?
###
#
# FreeWLAN Addons — http://www.freewlan.info
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA
#
# http://www.gnu.org/copyleft/gpl.html
#
###
. /usr/lib/webif/webif.sh
validate <<EOF
string|FORM_submit|@TR<<Submit>>|max=10|$FORM_submit
EOF
if [ "$?" != "0" ]
then
FORM_submit=""
fi
sel_diag=1
. /usr/lib/webif/advanced.sh
header "Diagnostics"
echo "<textarea style=’width:700px; height:400px’>"
eval $FORM_cmd
echo "</textarea>"
display_form <<EOF
start_table|0|10|5
add_row
add_label_cell|@TR<<Command>>:
add_input_cell|cmd||tableTextButton
add_button_cell|submit|@TR<<Submit>>
end_row
end_table
EOF
footer ?>
!!! После этого не забыть проставить права доступа 755 на файл diag.sh – иначе работать не будет !!!
Шаг второй: отредактировать файл advanced.sh располагающийся в /usr/lib/webif путем добавления перед последними кавычками в конце файла (или иное угодное место – см. структуру файла, там все просто) следующие строки:
<tr>
<td class=\"advancedMenu\">
<span class=\"submenu${sel_diag:+_sel}\">
<a href=\"/cgi-bin/webif/diag.sh\">@TR<<Diag_Title|Diagnostics>></a>
</span>
</td>
</tr>
Все. На веб-морде в разделе «Advanced» у нас появился пункт «Diagnostics» — немножко странное название для интерфейса командной строки, но при желании это не сложно поправить ;-)
Раз уж зашла речь про консоль и командную строку, то самое время вспомнить о командном интерпретаторе BusyBox – который, кстати, можно обновить. Но прежде создадим скрипт – который часто будет пригождаться (а именно каждый раз при установке пакетов), выполнять он будет очистку памяти от всяких программ, ненужных для установки … после нужно ребутаться дабы получить полную функциональность (запустить прибитые программы). Разместим его например в каталоге /etc назовем пусть freemem.sh не забудем проставить ему права 755, а содержание будет следующим:
#!/bin/sh
killall -9 dnsmasq chilli fonstate httpd fonsmcd crond hotplug2 logger syslogd klogd watch_chilli
Будем запускать его всякий раз — /etc/freemem.sh – ведь 99 из 100, если этого не сделать, то инсталлятор ipkg будет ругаться на нехватку памяти и отваливаться ;-(
Душим прожорливого «демона».
Интерактивную информацию о выполняемых процессах можно получить по команде top (сортировка по использованию загрузке процессора). Тут мы сразу увидим что практически на 80-90% процессор загружен приложением klogd – этот «демон» (а «по виндовому» — сервис) собирает статистику (ведет лог) по событиям, генерируемым компонентами ядра операционной системы – в отличие (и в дополнение) к демону syslogd, собирающему статистику по прочим приложениям системы. Собранная информация может как собираться локально, так и отправляться на удаленный сервер по протоколу syslog. Ценность данная информация представляет в большей степени разработчику (программисту), ибо пользователь, даже в случае возникновения ошибки едва ли что сможет поправить, а уж тем более если речь идет про скомпиленное ядро и демон klogd. Ввиду этого совсем не ясно с какой целью его оставили включенным товарищи из FON, собиравшие прошивку для обычных пользователей – ну разве что по сговору с энергосбывающими компаниями, с целью повышения дохода последних ;-( Но мы сейчас поправим это досадное недорозумение.
- Находим и открываем файл /etc/init.d/rcS ;
- Ищем и комментируем (символом #) строку klogd;
- Перезагружаемся.
В принципе там же можно было отрубить заодно и syslogd – ибо для конечного пользователя толку в нем тоже никакого – данные пишутся в файл на RAM-диск фонеры, к которому в целом и к данному файлу в частности рядовой пользователь доступа не имеет. Но мы то с Вами «не рядовые» ;-) А ввиду того что «много хлеба» syslogd не просит – его мы душить не станем. Кстати, обратившись к справке, можно в случае необходимости (или спортивного интереса) настроить его на передачу статистики на сервер.
Обновляем BusyBox или пример установки пакетов.
Алгоритмов установки пакетов много, но суть и результат всегда один (по крайней мере, мы к этому стремимся). Иногда нам во всяких доках предлагают просто выполнить некоторую «длинную» командную строку, которая загружает из инета и запускает скрипт, выполняющий все действия – или же все это описано всякими перенаправлениями в самой строке и т.п. Все это можно сделать и в офф-лайн режиме – скопировав пакет в папку /tmp (это RAM-диск) и запустив инсталлятор командой вида ipkg install <имя_пакета>. Процесс инсталляции может занимать некоторое время (минуту) без всяких откликов. В некоторых случаях можно пойти вообще координально – распаковать пакет на компе, и закинуть в нужные папки содержащийся там контент, правда в этом случае не будет сделана запись для удаления пакета командой ipkg remove <имя_пакета>. И так – один из вариантов установки BusyBox:
- Освобождаем память, прибиваем процессы, используя ранее написанный скрипт или просто командой killall -9 dnsmasq chilli fonstate httpd fonsmcd crond hotplug2 logger syslogd klogd watch_chilli .
- Переходим в папку /tmp (cd /tmp) и качаем в нее дистрибутив busybox с одного из репозиториев командой wget http://downloads.openwrt.org/kamikaze/7.06/atheros-2.6/packages/busybox_1.4.2-1_mips.ipk . Можно было просто скопировать дистрибутив в указанную папку, например через WinSCP.
- Устанавливаем заброшенный пакет ipkg install busybox_1.4.2-1_mips.ipk .
- После того как дождались сообщения об успешной установке – перезагружаемся reboot .
PS. На примере BusyBox был рассмотрен алгоритм установки пакетов. Лично я не призываю обновлять BusyBox ибо смысла большого в этом не вижу, а вот дефицитного места он занимает не мало. Кстати о «месте» — его можно посмотреть командой df –h а интересует нас раздел jffs – у плюсовой фонеры только там могут храниться новые и измененные данные, увы 3.5Мб – другой памяти нет, утешает лишь то что файлы на jffs хранятся в «заархивированном виде» , благодаря чему помещается туда больше инфы чем 3.5Мб в случае если она эффективно упаковывается.
Инсталляция пакетов из он-лайн репозитория.
Данная функция уже реализована в самом инсталляторе ipkg и его просто нужно правильно сконфигурировать, отредактировав файл /etc/ipkg.conf – указать правильный путь к одному из репозиториев (закомментировав или удалив имеющийся), а также указать корневую папку устройства (для фонеры нужно почему-то указывать папку /jffs а не сам корень). В результате конфигурационный файл может иметь следующий вид:
#src snapshots http://openwrt.org/downloads/snapshots/fonera-2.6/packages
src kamikaze http://downloads.openwrt.org/kamikaze/7.06/atheros-2.6/packages
dest root /jffs
dest ram /tmp
Далее нужно обновить локальную базу репозитория командой ipkg update – в результате чего скачивается соответствующий файл, располагающийся в /usr/lib/ipkg/lists/ и имеющий указанное нами имя (в нашем случае «kamikaze»). После этого установка пакета производится командой вида ipkg install <имя_пакета> –пакет будет загружен и установлен, разумеется он должен находится в репозитории, полное его содержимое можно посмотреть как путем просмотра вышеуказанного файла (/usr/lib/ipkg/lists/kamikaze) так и командой ipkg list . Указание он-лайн репозитория блокирует вышеописанный способ установки «вручную» (для ручной установки комментируем сроку с директивой src).
Далее продолжим знакомиться с возможностями и нюансами, в частности, установки пакетов на примерах …
Новый путь к откату.
Имея возможность гибкой настройки устройства, а также возможность установки новых пакетов, сразу задаешься вопросом, а как сохранить свои труды, дабы очередным экспериментом не запороть плоды своих трудов и не начинать прошивку и настройку фонеры с самого начала … В этом нам поможет пакет cifs – клиент «виндовых шар», позволяющий «прикручивать» их к ветвям линуксового дерева фонеры. Для данного пакета требуется установить также дополнительную библиотеку, о чем нас информирует инсталлятор. Если мы указали он-лайн репозиторий (см. выше), то можно задать также опцию рекурсивной установки всех требуемых библиотек.
Сбор статистики работы в сети.
Как один из вариантов, для этих целей можно использовать утилиту darkstat. Данная вещица осуществляет захват пакетов через библиотеку libpcap и выводит статистические результаты через свой собственный веб-сервер (прикручиваемый на любой порт, любого интерфейса фонеры)
Чтоб не показалось мало …
Ну и для полного счастья – что может прийти в голову? А прицепим-ка к веб-серверу фонеры интерпретатор PHP!
Воспользуемся одним из репозиториев и скачаем необходимые пакеты (или приготовимся устанавливать их в он-лайне). А понадобится нам следующее:
- libopenssl_0.9.8e-3_mips.ipk – Библиотека OpenSSL (к сожалению php скомпилирован с опцией необходимости ее наличия) – придется ее ставит несмотря на немалый «вес» и даже в случае если нам она не будет нами востребована (иной путь – пересобрать php);
- zlib_1.2.3-4_mips.ipk – Библиотека упаковки данных в он-лайн режиме (при записи и чтении с диска сервера) … мелочь;
- php4_4.3.11-2_mips.ipk – Конфигурационный файл (с него начинается установка php);
- php4-cgi_4.3.11-2_mips.ipk – CGI-версия самого интерпретатора php (именно cgi-версию нужно ставить на фонеру);
- php4-fastcgi_4.3.11-2_mips.ipk – FastCGI – как альтернатива «простой» CGI-версии. Основное отличие в том, что fast-cgi постоянно держит запущенным демона php в памяти, тем самым существенно минимизируется время выполнения скриптов, а также появляется возможность запускать скрипты с правами отличными от самого интерпретатора (за что приходится расплачиваться местом в оперативной памяти).
Из важных моментов стоит отметить что файл /etc/php.ini должен содержать следующие строки:
cgi.force_redirect = 0
cgi.redirect_status_env = "yes";
В файл /etc/httpd.conf следует добавить файловую ассоциацию для командного процессора:
*.php:/usr/sbin/php
А в случае использования fast-cgi версии не забывать про возможность (необходимость) использования конструкций старт/стопа демона вида /etc/init.d/php start или stop (в этом случае php доступен также как сетевой сервис).
При желании можно установить и различные расширения для php (об этом как-нибудь в другой раз).
Для проверки работоспособности интерпретатора php создадим простейший скрипт с функцией phpinfo() и разместим его в папке /www/cgi-bin/ дав ему произвольное имя и расширение php. Вызвать его можно из строки браузера (как и веб-морду) запросом формата: http://адрес.фонеры/cgi-bin/имя_скрипта.php — по логам можно судить о созданной среде интерпретатора.
Детальным изысканиям в направлении «PHP на Фонере» — возможно в будущем будет посвящены иные (пока не созданные) материалы.
Под завязку - размер раздела /tmp (RAM-диск).
Раздел /tmp создается при инициализации системы (после включения питания) и рассчитывается исходя из данных в конфигурационном файле /etc/preinit следующими строками:
size=$(awk ‘/Mem:/ {l=5242880;print((s=$2/2)<l)?$2-l:s}’ /proc/meminfo)
mount none /tmp -t tmpfs -o size=$size
Дабы не вникать в суть хитрой формулы можно непосредственно указать размер во второй строке, закомментировав первую. Следует помнить, что увеличение размера ведет к нецелесообразному расходу оперативной памяти, которой тоже «не густо», уменьшение может вызвать ошибки в работе приложений, которым в «упор прикипело» скинуть данные именно на этот раздел. Как и на любом RAM-диске данные на нем не переживают выключения питания.
Еще один путь к экономии электричества.
После обсуждения выше по тексту демона klogd и борьбы с ним, коснемся беспроводной части устройства. На самом деле практического смысла в заголовке данной под темы не много – по-умолчанию чипсет «шпарит на полную», а именно на 18мВт. Мы же можем лишь сбавить его пыл – смысл? – ну не знаю, вдруг вы не хотите, чтобы соседи проявляли интерес к вам, или еще почему-то … Вобщем как бы то ни было — имеем следующее:
0 dBm |
(1 mW) |
6 dBm |
(3 mW) |
8 dBm |
(6 mW) |
10 dBm |
(10 mW) |
12 dBm |
(15 mW) |
14 dBm |
(25 mW) |
16 dBm |
(39 mW) |
18 dBm |
(63 mW) |
В табличке отражены соответствия мощности радиочастотной части Wi-Fi передатчика. А управлять этим и многими другими параметрами, касающимися беспроводного интерфейса можно при помощи команды iwconfig – а просмотреть текущие параметры – iwlist , так например
iwlist ath0 tx – отображает текущую мощность передатчика;
iwconfig ath0 txpower 14 – понижает мощность передатчика до 25мВт.
Немного о каналах, скорости и прочем …
Продолжим о беспроводном интерфейсе … Любопытный наверняка заметил, что на фонере доступны к выбору лишь 11 Wi-Fi каналов, в то время как на большинстве устройств их 13. И «фишка» тут не в железе и даже не столько в софте, сколько в региональных «традициях» — так например в США разрешены к использованию частоты только 11-ти каналов, в большинстве стран Европы разрешены также каналы 12 и 13, а вот 14-ый разрешен в Японии … Указав драйверам код региона, есть возможность использовать до 14 каналов. Коды регионов регламентированы стандартом ISO 3160 (http://ru.wikipedia.org/wiki/ISO_3166-1). Теперь к практике:
- Находим и открываем файл /etc/modules.d/50-madwifi-fon (цифра может отличаться, сути не меняет);
- Находим строчку ath_ahb и добавляем к ней countrycode=392 outdoor=1 (392 — это код Японии – открывает все 14 каналов, ответственность за использование ложится исключительно на пользователя!). Так, например, для Европы можно указать код России – 643 (доступны 13 каналов);
- Далее можно указать номер канала вручную в файле /etc/config/fon (последняя строка) – с последующей перезагрузкой;
- Можно изменить файл /www/cgi-bin/webif/adv_wifi.sh дабы иметь возможность конфигурирования через веб-морду:
- В районе строки 42 находим текст header "Advanced Wireless Settings";
- Далее комментируем все до комментария #fallback – перед которым вставляем следующее:
#check if channel 12 was enabled
cc=`cat /etc/modules.d/50-madwifi-fon|grep -c 392`
c=`cat /etc/modules.d/50-madwifi-fon|grep -c ath_ahb`
if [ "$cc" -eq "1" ]; then
if [ "$c" -eq "1" ]; then
w12="option|12|12"
fi
fi
#check if channel 13 was enabled
cc=`cat /etc/modules.d/50-madwifi-fon|grep -c 392`
c=`cat /etc/modules.d/50-madwifi-fon|grep -c ath_ahb`
if [ "$cc" -eq "1" ]; then
if [ "$c" -eq "1" ]; then
w13="option|13|13"
fi
fi
#check if channel 14 was enabled
cc=`cat /etc/modules.d/50-madwifi-fon|grep -c 392`
c=`cat /etc/modules.d/50-madwifi-fon|grep -c ath_ahb`
if [ "$cc" -eq "1" ]; then
if [ "$c" -eq "1" ]; then
w14="option|14|14"
fi
fi
Для оптимальной (и максимальной) скорости передачи канал следует выбирать не только тот, который свободен от других точек доступа, но и тот, который в меньшей степени граничит (перекрывает) используемые каналы — см. рисунок. (Источник и полный текст — http://en.wikipedia.org/wiki/IEEE_802.11)
При прочих равных 14-ый канал выглядит наиболее привлекательно, хотя в различных случаях нужно проводить независимые тестирования. Удачи в этом интересном деле ;-)
Обобщение для дальнейших самостоятельных изысканий.
Подведем итог и еще раз уже скопом перечислим расположения и названия конфигурационных и прочих файлов за конфигурацию, веб-морду и прочее-прочее (для справки – «где поковыряться ручками») … будет добавлено чуть позже.