MarsBoard. Debian. Роутер. HOWTO![](http://habr.habrastorage.org/post_images/7a8/5fc/a3f/7a85fca3f20ee376bb8318428d29e564.jpg) Доброго времени суток, сообщество! Я уже писал
по поводу замечательной платы на чипе Allwinner A10 — MarsBoard. Тот
пост был чем-то вроде «Getting Started», этот же будет посвящён целиком и
полностью превращению этого чуда враждебной техники в
полноценную точку доступа WiFi и роутер по совместительству. Для
создания точки мне поможет сборка Debian Server (кстати, ядро мы тоже
будем собирать:)) и USB-адаптер TP-Link TL7200ND. Тип соединения с
провайдером — PPPoE. Заинтересовались? Добро пожаловать под кат.
Вместо предисловия Если честно, как только мне пришла в голову такая идея, я даже и не
думал, что придётся встретиться с таким количеством подводных камней. Ну
на то он наверное и Linux… К слову, все манипуляции в статье будут
производиться с помощью компьютера под управлением ОС Ubuntu и
кардридера для SD-карточки. И сразу советую выполнить sudo su в том сеансе терминала, из под которого будем производить все действия.
Система Для своих опытов я таки решил отказаться от того приносящего тапочки в
постель бульдозера, который предлагает нам офсайт. Удалось найти готовую
сборку Debian Server, но пришлось пошаманить с ядром. Но об этом позже.
По сути, установка сводится к записи образа на 2(или больше)GB SDCard и
установке bootloader'a (с офсайта платы).
Итак, поехали. Подключаем SDCard к компьютеру и командой fdisk -l узнаём имя устройства карточки. У меня /dev/sdc . Далее устройство карточки в статье буду обозначать как sdX . Вместо X подставляете свою букву. Качаем всё необходимое. Систему (рассмотрю действия со сборкой 2013-Sep-20 10:32:33), uboot.bin, sunxi-spl.bin. Далее:
- Переходим в папку со скачанными файлами
- Пишем систему на карту:
bzip2 -dc a10-debian-server-2gb.2013-09-20.img.bz2 > /dev/sdX
- Пишем bootloader:
dd if=spl/sunxi-spl.bin of=/dev/sdX bs=1024 seek=8
dd if=u-boot.bin of=/dev/sdX bs=1024 seek=32
Систему поставили, отлично, идём дальше.
Начало танцев — драйвера Собственно, с этого и началась вся эпопея запинок о те самые подводные
камни. Оказалось, что драйверов для чипов Ralink, на коем работает на
адаптер, существует 2 типа — «старые» и «новые». Старые драйвера
ставятся автоматом через apt-get и работают «из коробки», но работают
только в Managed-режиме, т.е. адаптер может только подключаться к уже
существующей точке, но не может сам эту точку создать. Для создания
точки требуется перевести адаптер в режим Master, а для этого нужны те
самые «новые» драйвера. Только вот эти новые крутые дровишки надо…
собирать. Ну что, собирать так собирать.
Идём сюда: www.ralinktech.com/support.php?s=2 и скачиваем RT2870_Firmware_V22. Распаковываем и пишем в /lib/firmware в файловую систему на SDcard. Далее качаем compat-wireless: www.orbit-lab.org/kernel/compat-wireless-2.6/. Это собственно то, что нам нужно скомпилировать.
Но не всё так просто. Так как я ещё только разбираюсь с Linux, я очень
удивился, когда обнаружил, что для компиляции драйверов мне понадобятся
исходники моего текущего ядра. И ещё более удивился, когда не нашёл их в
системе. Благо автор сборки любезно предоставил конфигурацию ядра, там
используемого. Её мы и возьмём, чтобы собрать исходники. Итак, немного
отвлечёмся от драйверов и посозерцаем пересборку ядра.
Ядро Как я уже сказал, для сборки дров нам нужны исходники ядра, а для сборки
специфичных исходников нам нужны… универсальные исходники linux-sunxi.
Также нам нужно будет немного поправить конфигурацию, чтобы вынести
встроенные в ядро версии драйверов в модули. Так мы их сможем заменить
на compat-wireless.
Первым делом, ставим на компьютер всё необходимое:
apt-get install git build-essential fakeroot kernel-package u-boot-tools zlib1g-dev libncurses5-dev
И добавляем этот репозиторий в файл /etc/apt/sources.list :
deb http://www.emdebian.org/debian/ unstable main
Далее обновляем apt и ставим кросс-компилятор:
apt-get update
apt-get install emdebian-archive-keyring
apt-get install gcc-4.7-arm-linux-gnueabihf
ln -sf `which arm-linux-gnueabihf-gcc-4.7 ` /usr/local/bin/arm-linux-gnueabihf-gcc
Далее нам необходимо скачать с гитхаба исходный код ядра. Клонируем
репозиторий себе, переходим в папку с исходниками и переключаемся на
версию 3.4:
git clone https://github.com/linux-sunxi/linux-sunxi linux-sunxi
cd linux-sunxi
git checkout sunxi-3.4
Дальше качаем базовый файл конфигурации ядра, переименовываем в .config
и кладём в корневую папку исходников. Теперь немного конфигурации. Нам
нужно выставить всё, что связано с «80211» в режим модуля. Для этого
выполняем:
ARCH=arm make menuconfig
Этой командой собирается псевдографическая утилита конфигурации ядра. Выбираем в ней Networking , потом Wireless . Выбираем следующие строки одна за одной и нажимаем клавишу M на клавиатуре:
cfg80211 - wireless configuration API
Common routines for IEEE802.11 drivers
Generic IEEE 802.11 Networking Stack (mac80211)
В итоге должна быть примерно такая картина:
![](http://habr.habrastorage.org/post_images/7d9/181/4b4/7d91814b4c83a04dc5e3d27983ffe9d0.jpg) Далее жмём Exit и ещё раз Exit . Попадаем в главное меню, проматываем вниз и жмём Save an Alternate Configuration File . Подтверждаем и выходим из утилиты. Всё, ядро мы настроили, теперь можно собирать. Выполняем следующие команды:
export ARCH=arm
export DEB_HOST_ARCH=armhf
export CONCURRENCY_LEVEL=`grep -m1 cpu\ cores /proc/cpuinfo | cut -d : -f 2`
fakeroot make-kpkg --arch arm --cross-compile arm-linux-gnueabihf- --initrd --append-to-version=-mykernel kernel_image kernel_headers
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- EXTRAVERSION=-mykernel uImage
cp arch/arm/boot/uImage ../uImage
В итоге после компиляции в каталоге уровнем выше будут лежать 3 файла:
пакет с ядром, пакет с исходниками и uImage. Флешку с образом ещё не
отключили? Идём туда, заливаем все 3 файла куда-нибудь в корень root.
Далее вставляем флешку в плату, с помощью SSH ставим пакеты ядра и
исходников. Отключаем, втыкаем обратно в комп. Далее идём в раздел с
ядром (там лежат файлы script.bin, uImage и т.д.) и копируем туда с
заменой новый uImage из корня второго раздела. Загружаемся с новым ядром
и опять же в SSH-терминале прописываем команды:
ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/source
ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build
Всё, теперь система готова к компиляции драйверов.
Продолжаем собирать драйвера Переходим в папку к распакованному compat-wireless (помните скачивали?). Выполняем:
./scripts/driver-select rt2x00
make
make install
Далее нужно записать в блэклист «старые» драйвера. Дописываем в файл /etc/modprobe.d/blacklist.conf следующие строки:
blacklist rt2870sta
blacklist rt5370sta
Перегружаемся.
Настройка самого роутера Итак, пришло время установить всё, что нужно для раздачи интернета и
организации локальной сети. В качестве DHCP-сервера я выбрал dnsmasq,
точкой доступа будет управлять hostapd, а соединение с провайдером будет
обеспечено утилитой pppoeconf. Я не буду здесь рассматривать настройку
firewall с помощью Iptables, так как информации по этому делу достаточно
много в интернете, а покажу лишь базовый проброс. Он нам жизненно
необходим. Итак, погнали. Соединяемся опять же по SSH и ставим всё, что нужно:
apt-get install hostapd dnsmasq pppoeconf
1. Настраиваем hostapd hostapd — утилита для создания и управление программной точкой доступа WiFi. Имеет 2 места, из которых можно её настроить. Первое — /etc/default/hostapd . Настройка автозапуска. Заменяем всю писанину там на следующие строчки:
RUN_DAEMON = yes
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Второе место — /etc/hostapd/hostapd.conf . Основные
настройки. Настроить тут можно достаточно много параметров, но я лишь
приведу свою конфигурацию и объясню, что и зачем я туда вписал:
interface=wlan0
driver=nl80211
ssid=MyAP
country_code=RU
hw_mode=g
channel=8
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
wpa_passphrase=superpass
2. Настройка dnsmasq dnsmasq — DHCP-DNS-TFTP-сервер с интуитивно понятным файлом конфигурации и рядом печенек. У него тоже есть файл конфигурации в /etc/default/ , но мы его трогать не будем, ибо ничего интересного там нет. Займёмся основным конфигом — /etc/dnsmasq.conf . Как и с hostapd, я покажу и расскажу про свой вариант конфигурации:
interface=wlan0
except-interface=ppp0
bind-interfaces
cache-size=1000
domain-needed
bogus-priv
dhcp-authoritative
dhcp-lease-max=100
dhcp-range=192.168.1.5,192.168.1.100,12h
3. Настройка интерфейсов Следующим шагом будет настройка интерфейсов, так как их конфигурация
нужна для правильной настройки PPPoE-соединения. Как известно,
интерфейсы настраиваются в файле /etc/network/interfaces. Приводим его к
такому виду:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
broadcast 192.168.1.255
4. Настройка PPPoE Утилита pppoeconf предоставляет псевдографический интерфейс для
полуавтоматического конфигурирования соединения с провайдером. Делается
это путём набора одноимённой команды в терминале:
pppoeconf
Далее там всё интуитивно понятно, после успешной конфигурации в файл
настройки сетевых интерфейсов добавится примерно такая запись:
auto ppp0
iface ppp0 inet ppp
pre-up /sbin/ifconfig eth0 up
provider dsl-provider
5. Базовый проброс Последним шагом будет настройка проброса пакетов из локальной сети во внешнюю и обратно (маскарадинг) Выполняем следующее для установки этого самого MASQUERADE и автозагрузки конфигурации в iptables при запуске системы:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -o eth0 -j ACCEPT
iptables -A FORWARD -o ppp0 -j ACCEPT
iptables-save > /etc/wifi-iptables.conf
echo'#!/bin/sh' > /etc/network/if-up.d/iptables
echo'iptables-restore < /etc/wifi-iptables.conf' >> /etc/network/if-up.d/iptables
chmod +x /etc/network/if-up.d/iptables
Перезагружаемся…
Вместо заключения Фуууххх, ну вот вроде и всё. Устали? Зато теперь у нас есть рабочий
роутер на базе довольно шустрой платы, да ещё и с таким хорошим
адаптером. По моим тестам, пинг в онлайн-играх не превышает 15-25ms, а
за 2 недели аптайма вся система заглючила один раз, что вылечилось
передёргиванием питания. Кстати, о питании. Выяснилось, что для стабильной работы устройства
вместе с адаптером требуется блок питания, расчитанный на мощность как
минимум в 1000mA. Обратите внимание, импульсные зарядники от нокий не подходят! Не ведитесь на совпадение штекеров!
Напоследок, хочу выразить благодарность:
- Интернет-магазину DONT.RU за обеспечение необходимым железом
- Человеку с ником RM и его замечательному ресурсу
P.S.: буду очень признателен за конструктивную критику, но подчеркну, что пеной здесь плеваться совершенно не обязательно. Если вы знаете, как сократить кол-во шагов или сделать что-то лучше, поделитесь, я буду обновлять статью.
|