MarsBoard. Debian. Роутер. HOWTO

от автора


Доброго времени суток, сообщество! Я уже писал по поводу замечательной платы на чипе 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.
Далее:

  1. Переходим в папку со скачанными файлами
  2. Пишем систему на карту:
    bzip2 -dc a10-debian-server-2gb.2013-09-20.img.bz2 > /dev/sdX 
  3. Пишем 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) 

В итоге должна быть примерно такая картина:

Далее жмём 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 # диапазон раздачи адресов (c, по, время аренды): 	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.: буду очень признателен за конструктивную критику, но подчеркну, что пеной здесь плеваться совершенно не обязательно. Если вы знаете, как сократить кол-во шагов или сделать что-то лучше, поделитесь, я буду обновлять статью.

ссылка на оригинал статьи http://habrahabr.ru/post/197862/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *