Для чего я взялся писать этот дайджест? Для себя. Чтобы при переустановке не разыскивать снова разрозненные описания и компоненты программного обеспечения, не выискивать заметки в сети, пытаясь в очередной раз составить из ста зайцев одну целую лошадь.
Статья сделана откровенно в «детском» стиле — делай раз, делай два. Сам я Linux знаю плохо, потому старался сделать всё нарочито подробно. Буду рад любым комментариям, дополнениям, исправлениям. Всё слать на Carpenter@wormhole.ru
Предполагается, что Вы уже закрепили и настроили антену, сигнал принимается более чем прекрасно. Если же нет, то очень настоятельно рекомендую почитать статью «Установка и настройка спутниковой антены»[13]. Лучше и не напишешь!
Писался этот дайджест (а это именно дайджест, обзор. Т.е., ничегонового в нём нет — всё это сборная солянка с кучей ссылок) нарочито подробно, так чтобы человек также плохо знающий Linux, как и я, смог бы «поднять» сетевое подключение хотя бы за пару часов.
Подготовка к работе всегда занимает времени больше, чем сама работа
Народная мудрость
Самый простой на мой взгляд путь — это работать с ветвью ядра версии 2.6.xx. На данный момент на сайте kernel.org доступная версия 2.6.13.1. Насколько я понял, начиная с версии 2.6.11, благодаря стараниям NuclearCat встроенные в ядро драйвера DVB-карт SkyStar 11 и SkyStar 2 прекрасно работают.
Итак, если Вы подробнейшим образом ознакомились со статьёй Алексея Силякова «DVB-карта SkyStar-1, релиз 1.5. Technotrend. Работа над ошибками.»[1], очаровались сервисами, предоставляемыми этой картой и стали её счастливейшим обладателем (за какие-нибудь 190$-200$) то лучше ничего и придумать нельзя, как использовать её в среде #nix. Она вполне работоспособна как под FreeBSD, так и в среде Linux
Сейчас мы устанавливаем карточку SkyStar 1 под Linux, с ядром версии не ниже 2.6.11. Сам я экспериментировал с ядром 2.6.12.2.
Должен Вас предупредить, что карта эта — весьма капризная особа и к ней, как минимум понадобится дополнительный охладитель. Впрочем, это отдельная история и о ней можно подробно почитать в статье Николая Штермеля «Охлаждение SkyStar 1»
В файл конфигурации надо доабавить следующие опции ([m] — в виде модуля, [y] — собрать вместе с ядром):
#
# Digital Video Broadcasting Devices
#
DVB=[y]
CONFIG_DVB=[y]
CONFIG_DVB_CORE=[m|y]
CONFIG_DVB_VES1X93=[m|y]
CONFIG_DVB_AV7110=[m|y]
CONFIG_DVB_AV7110_OSD=[y]
CONFIG_VIDEO_SAA7146=[m|y]
CONFIG_VIDEO_SAA7146_VV=[m|y]
CONFIG_VIDEO_VIDEOBUF=[m|y]
CONFIG_VIDEO_TUNER=[m|y]
CONFIG_VIDEO_BUF=[m|y]
CONFIG_VIDEO_BTCX=[m|y]
CONFIG_VIDEO_IR=[m|y]
После сборки должен получится следующий набор модулей[2]:
dvb-ttpci | Основной драйвер полнофункциональных карт, основанных на чипсете AV7110. |
videodev | Модуль ядра Video4Linux. Это основной модуль, предоставляющий доступ к аналоговой «картинке» mpeg2-декодера av7110. |
v4l2-common | Модуль вспомогательных функций драйверов Video4Linux-2. |
v4l1-compat | Модуль вспомогательных функций для обратной совместимости приложений, использующих Video4Linux-1. |
dvb-core | Модуль ядра DVB. Обеспечивает поддержку работы с утройствами каталога /dev/dvb/adapter/ |
saa7146 | Ядро драйвера SAA7146. Необходим для работы со всеми устройствами, основанными на чипсете saa7146. |
saa7146_vv | Поддержка функций Видео и Виртуальных Двоичных Интерфейсов (VBI — Video Binary Interface). Этот модуль необходим только для работы с полнофункциональными DVB-картами. |
video-buf | Вспомогательный модуль saa7146 для захвата видеопотока. Модуль для захвата видеопотока. |
dvb-ttpci | Основной драйвер карт основанных на AV7110 и полнофункциональных DVB-S/C/T |
Подгружать модули в память и перезагружаться с обновлённым ядром пока рановато. Вряд-ли dvb-ttpci загрузится без необходимых программных средств — firmware. Этот файл будет загружаться непосредственно в исполнительное устройство карты, примерно также, как подгружаются firmware-файлы в софтварные модемы. Так, что необходимо в зависимости от версии карты загрузить с сайта LinuxTV необходимый файл:
Name | Last Modified | Size | |
Parent Directory | 09-Jun-2005 19:52 | - | |
dvb-ttpci-01.fw-261a | 14-Nov-2004 00:48 | 221k | |
dvb-ttpci-01.fw-261b | 14-Nov-2004 00:48 | 221k | |
dvb-ttpci-01.fw-261c | 14-Nov-2004 00:48 | 221k | |
dvb-ttpci-01.fw-261d | 26-Dec-2004 01:02 | 227k | |
dvb-ttpci-01.fw-261f | 06-Jul-2005 00:44 | 229k |
А можно нигде эти файлы не искать и загрузить нужный файл при помощи скрипта, находящегося в документации, прилагающейся к исходному коду ядра — Documents/dvb/get_dvb_firmware
Нужный файл надо переименовать в dvb-ttpci-01.fw и положить в папку /lib/firmware. (Расположение этой директории, как правило определяется переменной FIRMWARE_DIR в файле /etc/hotplug/firmware.agent.)
Если карта установлена в компьютер, то можно попытаться всё это загрузить: modprobe dvb_core dvb_shutdown_timeout=0 dvb_net_debug=1 и dvb-ttpci videodev v4l2-common v4l1-compat saa7146 saa7146_vv video-buf dvb-ttpci.
Обратите внимание на параметр, передаваемый при загрузке модуля dvb_core — dvb_shutdown_timeout=0. Дело в том, что карты SkyStar 1 и SkyStar 2 для защиты от перегрева при отсутствии нагрузки выключаются и теряют связь. Число 0 означает не выключаться никогда.[2]
Если всё прошло успешно, то dmesg | less должен показать примерно такую распечатку:
dvb-ttpci: gpioirq unknown type=0 len=0
dvb-ttpci: info @ card 0: firm f0240009, rtsl b0250018, vid 71010068, app 8000261d
dvb-ttpci: firmware @ card 0 supports CI link layer interface
dvb-ttpci: Crystal audio DAC @ card 0 detected
saa7146_vv: saa7146 (0): registered device video0 [v4l2]
DVB: registering frontend 0 (ST ST V0299 DVB-S)...
dvb-ttpci: found av7110-0.
Осталось прописать модули в автоматическую загрузку, обновить ядро и перезагрузиться.
Для меня, как для человека знакомого с Linux весьма поверхностно, существование двух вполне пополуярных веток ядер было и остаётся загадкой. Быть может, подразумеваеются ветви Stable, Current и Release? Или нечто подобное тому, как до сих пор довольно популярно использование FreeBSD v4.11? Точно не знаю.
Так или иначе, но мне пришлось проэкспериментировать с ядром 2.4.31.
В отличие от ядра 2.6.xx.x в нём драйверов для карт SkyStar 1 и SkyStar 2 нет. Драйвера придётся загрузить с опять-таки с сайта LinuxTV. На данный момент это — linuxtv-dvb-1.1.1.tar.bz2[327K]. Правда, во многих местах в сети, в частности в статьте, размещённой на сайте General Satellite «Программное обеспечение под Linux 2.4»[3], утверждается, что эти драйвера для работы с интернет не годятся — всё нормально загружается, но спутник не «лочится». У меня, правда, всё заработало. Возможно, что информация просто устарела.
Во всяком случае, в большинстве сетевых заметок, настоятельно рекомендуется взять альтернативные драйвера от Дениса Федорищенко (NuclearCat)[5] — ss1linux-rc5.tar.gz[1.8M].
В сети есть немало статей, посвящённых установке и настройке DVB-драйверов в под ядром Linux v2.4.xx.x, в частности, например, статьи Сергея Мазенкова «Как запустить интернет через DVB-S под Linux 2.4»[4], Сергея Ткачова «Digital Video Broadcasting или как заставить работать TechniSat SkyStar-1 под Linux»[6] или «Установка спутникового Internet под Linux»[7]
Все эти руководства, кроме последнего, предлагают устанавливать dvbds-2, dvbd3. Желательно созданный Andrix'ом[8]. Даже в знаменитом Sat-HOWTO[10] предлагается использовать этот путь, но я даже пробовать этот вариант не стал: во-первых сразу отпугнула фраза в Readme2, , а во-вторых, для полноценной компиляции и установки dvbd необходимо загрузить драйверы siemens_dvb-0.8.2.tar.gz, причём именно данной версии. Кроме того, об этом, как выше было сказано, в сети написано более чем достаточно и подробно.
Как мне кажется, данная концепция на сей день несколько устарела, так что остановим наше внимание на «штатных» драйверах: linuxtv-dvb-1.1.1.tar.bz2 от LinuxTV.
Порядок установки вполне соответствует декларированному в прилагаемом Readme-файле. Нужно только не забыть скачать firmware (в моём случае это файл dvb-ttpci-01.fw-261d) «Раскручиваем» куда-нибудь полученный исходник: tar -jxvf linuxtv-dvb-1.1.1.tar.bz2, заходим в получившуюся директорию linuxtv-1.1.1. Файл firmware помещаем в поддиректорию build-2.4, переименовав его в dvb-ttpci-01.fw.
Не стоит забывать, что надо сделать ссылку /usr/src/linux из того места, где находятся исходные годы Вашего ядра. В моём случае это выглядело так: ln -sf /usr/src/linux-2.4.31 /usr/src/linux.
Теперь можно запустить (прямо из linuxtv-1.1.1/build-2.4 make.
Поправим файл linuxtv-1.1.1/build-2.4:
# DVB core
insmod ./dvb-core.o
на
# DVB core
insmod ./dvb-core.o dvb_shutdown_timeout=0
Это, опять таки, необходимо, чтобы карта при отсутствии каких-либо действий, самопроизвольно не выключилась. Если загрузка модулей прошла удачно, то следующей командой должна быть ./insmod.sh load (её следует запускать только из linuxtv-1.1.1/build-2.4)
Если lsmod покажет что-то вроде этого:
dvb-core 39616 0 [ttusb_dec dvb-ttusb-budget dvb-ttpci mt312 cx24110
grundig_29504-491 grundig_29504-401 tda1004x ves1820 stv0299 alps_tdmb7 alps_tdlb7 ves1x93]
К моему удивлению, dmesg | less наличия dvb-ttpci устройства не показал, но карта работала! Впрочем, об этом будем говорить несколько позже. На данный момент dmesg выдал следующее:
Linux video capture interface: v1.00
saa7146: register extension 'dvb'.
PCI: Found IRQ 5 for device 00:09.0
saa7146_core: found saa7146 @ mem d09f4000 (revision 1, irq 5) (0x13c2,0x0000).
DVB: registering new adapter (Siemens/Technotrend/Hauppauge PCI rev1.3).
probe_tuner: try to attach to Siemens/Technotrend/Hauppauge PCI rev1.3
stv0299.c: setup for tuner BSRU6, TDQB-S00x
DVB: registering frontend 0:0 (STV0299/TSA5059/SL1935 based)...
Siemens/Technotrend/Hauppauge PCI rev1.3 adapter 0 has MAC addr = 00:d0:5c:03:8b:14
DVB: AV7110(0) - firm f0240009, rtsl b0250018, vid 71010068, app 8000261b
DVB: AV7110(0) - firmware supports CI link layer interface
av7110(0): Crystal audio DAC detected
saa7146_fops: saa7146 (0): registered device video0 [v4l2]
av7110: found av7110-0.
saa7146: register extension 'budget dvb'.
saa7146: register extension 'budget_ci dvb'.
saa7146: register extension 'budget dvb /w video in'.
Если нас всё устраивает, то можно зайти в linuxtv-1.1.1 и набрать make install и настроить автоматическую загрузку модулей при запуске системы, на забыв про dvb-core dvb_shutdown_timeout=0
Теперь попробуем установить SkyStar 2. Пожалуй, самое толковое руководство по этому вопросу сделано NuclearCat — «Руководство по установке SkyStar2 под Linux 2.4»[9].Это вполне понятно — кто лучше автора расскажет о том, как оно всё работает. И даже не важно, что оно сделано для ядра 2.4 — для ядер ветки 2.6.xx.x технология будет почти такой же, за исключением того, что с сайта LinuxTV нам ничего загружать не придётся. «Родные» драйвера ядра вполне работоспособны. Таким образом, нам осталось добавить в /usr/src/linux/.config следующие настройки:
#
# Digital Video Broadcasting Devices
#
CONFIG_DVB=y
CONFIG_DVB_CORE=m
#
# Supported FlexCopII (B2C2) Adapters
#
CONFIG_DVB_B2C2_FLEXCOP=m
CONFIG_DVB_B2C2_FLEXCOP_PCI=m
CONFIG_DVB_B2C2_FLEXCOP_USB=m
# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set
CONFIG_DVB_B2C2_SKYSTAR=m
#
# DVB-S (satellite) frontends
#
CONFIG_DVB_STV0299=m
CONFIG_DVB_MT312=m
Ну чтож, теперь наберём в директории cd /usr/src/linux/ && make mrproper && make modules && make modules_install. Модули готовы.
Понадобится нам всего три из них: dvb-core, stv0299, skystar2. Как и в случае со SkyStar 1 при загрузке модуля dvb-core следует загружать с параметрами dvb_shutdown_timeout=0. В противном случае, сигнала Вы просто не увидите!
Итак: modprobe dvb-core dvb_shutdown_timeout=0 dvb_net_debug=1 && modprobe stv0299 && modprobe skystar2. dmesg должен показать следующее (MAC-адрес должен соответсвовать MAC-адресу с метки на Вашей карте):
drivers/media/dvb/b2c2/skystar2.c: FlexCopIIB(rev.195) chip found
drivers/media/dvb/b2c2/skystar2.c: the chip has 38 hardware filters
driver_initialize MAC address = 00:d0:d7:0c:d3:1d:34:cf
DVB: registering new adapter (SkyStar2).
DVB: registering frontend 0 (ST STV0299 DVB-S)...
Если Вы видите что-то подобное у себя, значит драйвера установлены вполне удачно.
Процесс установки под ядром 2.4.xx.x почти идентичен установке под 2.6.xx.x, за исключением того, что нам придётся взять драйвера linuxtv-dvb-1.1.1.tar.bz2 с LinuxTV или «родные» драйвера от NuclearCat — linuxtv-dvb-1.1.1a.tar.bz2.
Как и в случае с картой SkyStar 2, нам понадобится «раскрутить» драйвера в какую-нибудь директорию: tar -jxvf linuxtv-dvb-1.1.1.tar.bz2, зайти в полученную папку и набрать make. Не будем, также, забывать, что в /usr/src/linux должен находится исходный код ядра Linux.
Если процесс компилляции прошёл удачно, заходим в linuxtv-1.1.1/build-2.4 и загружаем модули: ./insmod.sh load. dmesg должен показать что-то вроде:
Linux video capture interface: v1.00
saa7146: register extension 'dvb'.
saa7146: register extension 'budget dvb'.
saa7146: register extension 'budget_ci dvb'.
saa7146: register extension 'budget dvb /w video in'.
usb.c: registered new driver Technotrend/Hauppauge USB-Nova
usb.c: registered new driver ttusb-dec
PCI: Found IRQ 5 for device 00:09.0
skystar2.c: FlexCopIIB(rev.195) chip found
skystar2.c: the chip has 38 hardware filters
DVB: registering new adapter (Technisat SkyStar2 driver).
probe_tuner: try to attach to Technisat SkyStar2 driver
stv0299.c: setup for tuner Samsung TBMU24112IMB
DVB: registering frontend 0:0 (STV0299/TSA5059/SL1935 based)...
Если всё выглядит так, то считаем установку удачной и можем позволить себе запустить cd linuxtv-1.1.1 && make install и прописываем автозагрузку модулей при запуске системы.
— А теперь, дорогие товарищи пассажиры, пристегнитесь. Мы попытаемся вместе со всей этой фигнёй взлететь.
Из анекдота
Остальные действия от версии ядра почти не зависят, так что дальше разбиения на разделы 2.4 и 2.6 не будет. Также будет почти сходна настройка карт SkyStar 1 и SkyStar 2.
Итак, если у Вас не установлена devfs, то Вам придётся создать соответсвующие интерфейсы. Лучше всего это сделать при помощи скрипта, предлагаемого NuclearCat в заметке «Руководство по установке SkyStar2 под Linux 2.4.». Почему-то в драйверах linuxtv-1.1.1.tar.bz2 скрипт так и неисправлен, так что копируйте его у NuclearCat и запускайте: ./makedev-dvb.sh. Впрочем, думаю, что лучше использовать devfs.
Теперь настаёт достаточно сложный и ответственный момент: нам предстоит настроить карту на приём информации. Для этого понадобится набор утилит linuxtv-dvb-apps-1.1.0.tar.bz2, всё с того же сайта LinuxTV. Если мы под ядром 2.4.xx.x, то всё в порядке — просто распаковываем поставку, заходим в получившуюся директорию linuxtv-dvb-apps-1.1.0 набираем make, если же ядро 2.6.xx.x, то нужно зайти в директорию linuxtv-dvb-apps-1.1.0/util/ и набрать make. После компилляции, получившиеся файлы:
linuxtv-dvb-apps-1.1.0/utils/av7110_loadkeys/evtest
linuxtv-dvb-apps-1.1.0/utils/av7110_loadkesy/av7110_evtest
linuxtv-dvb-apps-1.1.0/utils/dvbdate/dvbdate
linuxtv-dvb-apps-1.1.0/utils/dvbnet/dvbnet
linuxtv-dvb-apps-1.1.0/utils/dvbtraffic
linuxtv-dvb-apps-1.1.0/utils/scan/dvb-c
linuxtv-dvb-apps-1.1.0/utils/scan/dvb-s
linuxtv-dvb-apps-1.1.0/utils/scan/dvb-t
linuxtv-dvb-apps-1.1.0/utils/szap/czap
linuxtv-dvb-apps-1.1.0/utils/szap/szap
linuxtv-dvb-apps-1.1.0/utils/szap/tzap
либо в локальный ~/bin, в /usr/local/bin/ или ещё куда-нибудь, в «исполняемую» директорию. В этой «игре» нам понадобится всего три утилиты: szap, dvbnet и dvbtraffic
Теперь нам предстоит «рассказать» карте о том, с каким транспондером и с каким каналом ей предстоит работать. Например, я использую Сервис Raduga, спутник Intelsat-904:
частота | 11595 GHz |
поляризация | Вертикальная |
скороть передачи | 29270 Msps |
PID | 4152 |
Формат файла, содержащего в себе описания каналов S-диапазона таков:
Поле | Значение | Описание |
Название канала/сервиса | - | Если есть символы, отличные от буквенно-цифровых или пробелы, то название заключить в двойные кавычки. |
Частота | GHz | Частота передачи канала со спутника в GHz. |
поляриазция | v/h | Поляриазция: v — вертикальная, h — горизонтальная (соответственно, для круговой h — левая круговая, v — правая круговая) |
diseqc | 0/1 | Если принимающая головка одна, то «0», если больше, то «1» |
symbol rate | Msps | Скороcть символьной передачи данных (symbol rate — Mega symbols per rate) |
V-PID | номер | Идентификатор Пакетов Видеопотока (Video Packet Identificator) |
A-PID | номер | Идентификтора Аудио Пакетов (Audio Packet Identificator) |
SID | номер | Идентификатор Сервиса (используется только в цифровом вещании) для использованием рессивера определённого сервиса (Service ID) |
Соответственно, создаём файл /etc/channels.conf и делаем в нём запись:
Raduga:11595:v:0:29270:0:0:0
Конечно, можно было бы и создать файл, скажем с названием Intelsat-904.60W и нашпиговать его параметрами транспондеров. Ну путь это будет спутник Intelsat-904 W60°. Параметры можно будет взять с сайта SatCodX:
S 11155000 H 2963000 3/4
S 11491000 V 5787000 3/4
S 11520000 V 12000000 3/4
S 11529000 V 2893000 3/4
S 11555000 H 2927000 5/6
S 11595000 H 29270000 5/6
S 11595000 V 29270000 7/8
«напустить» scan на этот файл. Если всё верно настроено и антена хорошо сориентирована, то на экране получится что-то вроде
scanning Intel904.60W
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
initial transponder 11595000 H 29270000 7
initial transponder 11595000 V 29270000 7
initial transponder 11520000 V 12000000 3
>>> tune to: 11595:h:0:29270
WARNING: >>> tuning failed!!!
>>> tune to: 11595:h:0:29270 (tuning failed)
WARNING: >>> tuning failed!!!
>>> tune to: 11595:v:0:29270
WARNING: filter timeout pid 0x0011
WARNING: filter timeout pid 0x0000
WARNING: filter timeout pid 0x0010
>>> tune to: 11520:v:0:12000
0x0000 0x0001: pmt_pid 0x0105 MIR-Teleport -- Moskow (running)
0x0000 0x0002: pmt_pid 0x0106 Teleport MIR -- HTB (running)
0x0000 0x0003: pmt_pid 0x0107 MIR-Teleport -- MIR-TV (running)
0x0000 0x0004: pmt_pid 0x0108 MIR Teleport -- MGOU (running)
0x0000 0x0006: pmt_pid 0x010a MIR-Teleport -- MIR Radio Service (running)
0x0000 0x0007: pmt_pid 0x0101 MIR-Teleport -- MAYAK FM (running)
0x0000 0x0008: pmt_pid 0x0100 MIR-Teleport -- MIR Service (running)
0x0000 0x0009: pmt_pid 0x0102 Mir Teleport -- Radio MIR (running)
Network Name 'NDS'
dumping lists (8 services)
Moskow:11520:v:0:12000:512:650:1
HTB:11520:v:0:12000:515:653:2
MIR-TV:11520:v:0:12000:514:652:3
MGOU:11520:v:0:12000:517:655:4
MIR Radio Service:11520:v:0:12000:0:660:6
MAYAK FM:11520:v:0:12000:0:662:7
MIR Service:11520:v:0:12000:513:651:8
Radio MIR:11520:v:0:12000:0:665:9
Done.
Только беда в том, что сервисы данных scan не «отловит» (обратите внимание на строчку >>> tune to: 11595:h:0:29270 WARNING: >>> tuning failed!!! Как раз, нужный мне транспондер) так что для настроек на Интернет Провайдера, придётся создавать файл channels.conf вручную.
Попробуем настроить карту на приём данных: /bin/szap -c /etc/channels.conf. Опять же, если всё было сделано верно, то мы увидим на экране следующее:
brat3 util # szap -c /etc/channels.conf -n 1 -x
reading channels from file '/etc/channels.conf'
zapping to 1 'I904':
sat 0, frequency = 11595 MHz V, symbolrate 29270000, vpid = 0x0000, apid = 0x0000
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
status 03 | signal ba7a | snr 7aeb | ber 000026cd | unc 00000000 |
status 1f | signal b8fe | snr cfe1 | ber 000005c6 | unc 00000000 | FE_HAS_LOCK
Понятно, что если сигнал по той или иной причине пропал, ну например, произошло затенение отражателя, то эту процедуру надо повторить.
Осталось активировать сетевой интерфейс. Будьте внимательны — всё завист от того, какой тип фильтрации сетевых пакетов использует Ваш Интернет Провайдер. Если фильтрация пакетов идёт по MAC-адресу, то исправлять ничего не надо. Если фильтрация идёт по IP-адресу, то необходимо установить MAC-адрес карты в нужное значение. Например, если выданный мне провайдером IP-адрес 10.252.155.40, то его необходимо перевести в шестнадцатеричную форму: 0A:FC:9B:28 и прибавить в начале ещё два нуля: 00:00:0A:FC:9B:28. Иногда, правда, провайдер добавляет специальный префикс. Например, 02:00:0A:FC:9B:28. Впрочем, всю эту информацию вы у него и должны узнать.
Адрес карты устанавливаем произвольный, причём, желательно, чтоб этот адрес не попадал ни в одну из внутренних подсетей. Ну, например, для моей сети вполне подойдёт адрес 10.95.2.1, Поскольку внутренняя подсеть у меня 10.95.1.0/24. Итак:
1. Настраиваем фильтрацию по PID-у, указанному провайдером (Идентификатору Пакетов) и создаём сетевой интерфейс. Например: dvbnet -p 4152.
brat3 root # dvbnet -p 4152
DVB Network Interface Manager
Version 1.1.0-TVF (Build Fri Aug 12 14:12:43 2005)
Copyright (C) 2003, TV Files S.p.A
Device: /dev/dvb/adapter0/net0
Status: device dvb0_0 for pid 4152 created successfully.
2. Присваиваем интерфейсу IP-адрес и MAC-адрес. Здесь будьте внимательны — если вы сделаете что-то неверно, то tcpdump будет показывать наличие траффика, но работать ничего не будет.
ifconfig dvb0_0 10.95.2.1 netmask 255.255.255.255 broadcast 255.255.255.255
ifconfig dvb0_0 hw ether 00:00:0A:FC:9B:28
route add 10.95.2.1 dev dvb0_0
Теперь ifconfig должен показать что-то в этом роде:
dvb0_0 Link encap:Ethernet HWaddr 00:00:0A:FC:F3:9F
inet addr:10.95.2.1 Bcast:255.255.255.255 Mask:255.255.255.255
UP BROADCAST RUNNING NOARP MULTICAST MTU:4096 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Base address:0x1038
а в таблице маршрутизации должна появится следующая строка:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.95.2.1 0.0.0.0 255.255.255.255 UH 0 0 0 dvb0_0
Настал трепетный момент проверки работоспособности сетевого интрефейса. Вариантов два. Самый простой:
# tcpdump -ni dvb0_0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on dvb0_0, link-type EN10MB (Ethernet), capture size 96 bytes
21:42:01.020568 IP 217.10.39.84.80 > <GW_IP>88.2909: . 1195548608:1195549945(1337)
ack 1701755686 win 57491
21:42:01.020584 IP 217.10.39.84.80 > <GW_IP>88.2909: . 1337:2674(1337) ack 1 win
57491
21:42:01.020586 IP 217.16.19.219.80 > 10.252.246.254.2394: S 3017247152:3017247152(0)
ack 4146269160 win 5840 <mss 1460>
Вот когда такое по экрану ползёт, рука сама тянется «напустить» на всё это sniffit, но мы это делать не будем, поскольку неприлично подглядывать за чужим траффиком. Так делают только очень нехорошие дяди. Нам вполне должно быть достаточно того, что всё работает, однако!
Второй вариант проверки работоспособности интерфейса и того проще:
brat3 root # dvbtraffic
0365 10 p/s 1 kb/s 15 kbit
1029 89 p/s 16 kb/s 134 kbit
1030 166 p/s 30 kb/s 250 kbit
1031 774 p/s 142 kb/s 1164 kbit
1036 312 p/s 57 kb/s 469 kbit
1037 616 p/s 113 kb/s 926 kbit
1038 1035 p/s 190 kb/s 1557 kbit
1039 678 p/s 124 kb/s 1020 kbit
1040 91 p/s 16 kb/s 137 kbit
1042 119 p/s 21 kb/s 180 kbit
1050 1 p/s 0 kb/s 2 kbit
1051 2161 p/s 396 kb/s 3250 kbit
1056 5 p/s 0 kb/s 8 kbit
1057 359 p/s 65 kb/s 540 kbit
1058 961 p/s 176 kb/s 1445 kbit
1059 5 p/s 0 kb/s 8 kbit
1101 244 p/s 44 kb/s 367 kbit
1102 222 p/s 40 kb/s 334 kbit
1103 9 p/s 1 kb/s 14 kbit
1104 166 p/s 30 kb/s 249 kbit
1105 49 p/s 8 kb/s 73 kbit
1109 1095 p/s 201 kb/s 1647 kbit
2000 9177 p/s 1684 kb/s 13802 kbit
-PID--FREQ-----BANDWIDTH-BANDWIDTH-
0365 9 p/s 1 kb/s 14 kbit
Теперь неплохо бы собрать это всё в один скрипт. Ну пусть он называется, скажем, dvb.sh. Честно сказать, я воспользовался готовым, который взял из заметки Виталия Прядко «Установка Skystar-2 на Linux (skystar dvb linux driver)»[12]
Клопы отдельно, тараканы — отдельно
Народная мудрость
Думаю, что никому не открою страшной тайны, если скажу, что спутниковый доступ к Интернет ассиметричный. То есть, исходящий траффик должен идти по другому каналу, который, как правило, называют почему-то «наземным». Забавно, но в большей части случаев подключение к Интернет через спутник осуществляется через GPRS (EDGE) или CDMA мобильному телефону. Гораздо реже связь осуществляется через спутник же, но такое подключение обходится по себестоимости дороже трафика через GPRS-провайдера (порядок цен ~ .22$ за мегабайт). Правда подключение такое будет двунаправленным, а вовсе ни разу не симметричным — устройство для исходящего трафика отдельно, для входящего — отдельно.
Ниже я размещу картинку, дабы подчеркнуть размеры пропасти между пользователем, спутником и провайдером (что-то порядка 36.000 км до геостационарной орбиты спутника и столько же обратно):
Во-первых, мы отправляем запрос к нашему спутниковому провайдеру через подключение к наземному Интернет-провайдеру, например, через GPRS, EDGE, CDMA или другим способом. Получив наш запрос наземный провайдер передаёт его Спутниковому Провадйдеру. Последний, в свою очередь, обрабатывает его и отправляет данные на спутник. Со спутника данные принимаются нашей спутниковой антеной и попадают через Спутниковую Карту на наш компьютер и, может быть, во внутренню интрасеть.
Современные спутниковые провайдеры как правило предоставляют наземное поключение по Виртуальной Частной Сети (VPN). На мой взгляд, самый простой способ осуществить подключение к сети — использовать OpenVPN. Начиная со второй версии, Клиент OpenVPN при подключении самостоятельно настраивает маршрутизацию и что, кстати, немаловажно при подключении через мобильный телефон GPRS, EDGE или CDMA, устойчиво «держит» связь (в отличие, скажем от P-t-P MPPE/MPPC подключения).
Кроме того, OpenVPN-подключение можно установить и через GPRS и EDGE. Такие провайдеры, как БиЛайн и МТС закрыли возможность подключения по обычному VPN.
Если Ваш провайдер предоставляет подключение через OpenVPN, то всё, что Вам нужно — это загрузить последнюю версию программного обеспечения, установить её. Далее, загрузить файлы ключей и конфигурационный файл у провайдера, положить их в какую-нибудь директорию (например /etc/openvpn/config/ и набрать из командной строки: openvpn --config client.config.
В простейшем виде, конфигурационный файл может выглядеть примерно так:
client
dev tap
dev-node <название_узла_подключения>
proto udp
remote <PROVIDER_IP> 55684
resolv-retry infinite
nobind
persist-key
persist-tun
ca <файл_сертификата_сервера>
cert <файл_сертификата_клиента>
key <файл_ключа_клиента>
ns-cert-type server
verb 3
Подробнее о настройке OpenVPN можно прочитать в OpenVPN ™ 2.x HOWTO[14]. Ну а если Вы и так всё правильно настроили, то при подключении OpenVPN-клиента должно получиться что-то в этом роде:
brat3 config # openvpn --config client.ovpn
Sat Sep 17 21:01:00 2005 OpenVPN 2.0 i686-pc-linux [SSL] [LZO] [EPOLL] built on Aug 14 2005
Sat Sep 17 21:01:00 2005 IMPORTANT: OpenVPN's default port number is now 1194, based on an
official port number assignment by IANA.
OpenVPN 2.0-beta16 and earlier used 5000 as the default port.
Sat Sep 17 21:01:00 2005 WARNING: file 'Client.key' is group or others accessible
Sat Sep 17 21:01:00 2005 Control Channel MTU parms [ L:1573 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sat Sep 17 21:01:00 2005 Data Channel MTU parms [ L:1573 D:1450 EF:41 EB:4 ET:32 EL:0 ]
Sat Sep 17 21:01:00 2005 Local Options hash (VER=V4): '2c50bd2c'
Sat Sep 17 21:01:00 2005 Expected Remote Options hash (VER=V4): '0ddbb6e3'
Sat Sep 17 21:01:00 2005 UDPv4 link local: [undef]
Sat Sep 17 21:01:00 2005 UDPv4 link remote: <SERVER_IP>:55684
Sat Sep 17 21:01:08 2005 TCP/UDP: Incoming packet rejected from 127.0.0.1:53[2],
expected peer address: <SERVER_IP>:55684 (allow this incoming source address/port
by removing --remote or adding --float)
Sat Sep 17 21:01:08 2005 TCP/UDP: Incoming packet rejected from 127.0.0.1:53[2],
expected peer address: <SERVER_IP>:55684 (allow this incoming source
address/port by removing --remote or adding --float)
Sat Sep 17 21:01:10 2005 TLS: Initial packet from <SERVER_IP>:55684, sid=7bcc4f6c bae60adb
Sat Sep 17 21:01:51 2005 VERIFY OK: depth=1,
/C=RU/ST=MW/L=MOSCOW/O=RadugaVPN/emailAddress=support@telecom-service.net
Sat Sep 17 21:01:51 2005 VERIFY OK: nsCertType=SERVER
Sat Sep 17 21:01:51 2005 VERIFY OK: depth=0,
/C=RU/ST=MW/O=RadugaVPN/CN=RadugaVPN/emailAddress=support@telecom-service.net
Sat Sep 17 21:01:55 2005 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Sat Sep 17 21:01:55 2005 Data Channel Encrypt: Using 160 bit message hash 'SHA1'
for HMAC authentication
Sat Sep 17 21:01:55 2005 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Sat Sep 17 21:01:55 2005 Data Channel Decrypt: Using 160 bit message hash 'SHA1'
for HMAC authentication
Sat Sep 17 21:01:55 2005 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA,
1024 bit RSA
Sat Sep 17 21:01:55 2005 [RadugaVPN] Peer Connection Initiated with <SERVER_IP>:55684
Sat Sep 17 21:01:56 2005 SENT CONTROL [RadugaVPN]: 'PUSH_REQUEST' (status=1)
Sat Sep 17 21:01:57 2005 PUSH: Received control message:
'PUSH_REPLY,redirect-gateway,dhcp-option DNS <SERVER_IP>,
route-gateway <GW_IP>,ping 10,
ping-restart 120,
route 0.0.0.0 0.0.0.0 <GW_IP>,
dhcp-option DNS 82.118.131.162,
ifconfig <LOCAL_IP> 255.255.255.0'
Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: timers and/or timeouts modified
Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: --ifconfig/up options modified
Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: route options modified
Sat Sep 17 21:01:57 2005 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Sat Sep 17 21:01:57 2005 TUN/TAP device tap0 opened
Sat Sep 17 21:01:57 2005 /sbin/ifconfig tap0 <LOCAL_IP>
netmask 255.255.255.0 mtu 1500 broadcast <BROADCAST_IP>
Sat Sep 17 21:01:57 2005 /sbin/route add -net <SERVER_IP>
netmask 255.255.255.255 gw 212.119.97.85
Sat Sep 17 21:01:57 2005 /sbin/route del -net 0.0.0.0 netmask 0.0.0.0
Sat Sep 17 21:01:57 2005 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw <GW_IP>
Sat Sep 17 21:01:57 2005 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw <GW_IP>
Sat Sep 17 21:01:57 2005 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw <GW_IP>
Sat Sep 17 21:01:57 2005 Initialization Sequence Completed
, где <LOCAL_IP> — IP-адрес, предоставленный Вам провайдером для подключения (если используется фильтрация по IP-адресу), <SERVER_IP> — адрес сервера, к которому осуществляется подключение, <BROADCAST_IP> — IP-адрес широковещательной передачи, <GW_IP> — IP-адрес шлюза.
Таблица маршрутизации после создания VPN-подключения, соответственно, будет выглядеть так:
Destination | Gateway | Genmask | Flags | Metric | Ref | Use | Iface |
<EARTHLINK_GW> | 0.0.0.0 | 255.255.255.255 | UH | 0 | 0 | 0 | ppp0 |
<SATLINK_GW> | <EARTHLINK_GW> | 255.255.255.255 | UGH | 0 | 0 | 0 | ppp0 |
<LOCAL_DVB_IP> | 0.0.0.0 | 255.255.255.255 | UH | 0 | 0 | 0 | dvb0_0 |
<LOCAL_NET> | 0.0.0.0 | <LOCAL_NETMASK> | U | 0 | 0 | 0 | eth0 |
<DVB_NETWORK> | 0.0.0.0 | <DVB_NETMASK> | U | 0 | 0 | 0 | tap0 |
127.0.0.0 | 127.0.0.1 | 255.0.0.0 | UG | 0 | 0 | 0 | lo |
0.0.0.0 | <EARTHLINK_GW> | 0.0.0.0 | UG | 0 | 0 | 0 | tap0 |
, где <EARTHLINK_GW> — шлюз для наземного подключения (в данном случае — ppp0); <SATLINK_GW> — шлюз спутникового подключения; <LOCAL_DVB_IP> — IP-адрес, присвоенный dvb-интерфейсу спутниковой карты; <LOCAL_NET>, <LOCAL_NETMASK> — соответственно, адрес локальной (интранет) сети (если есть) и маска подсети; <DVB_NETWORK>, <DVB_NETMASK> — адрес сети из которой Вам выдаётся IP-адрес при подключении и маска подсети.
Соответственно, ppp0 — интерфейс «наземного» подключения, tap0 — OpenVPN-подключение, dvb0_0 — интерфейс спутниковой карты, eth0 — сетевое подключение к внутренней (интранет) сети (если она, конечно же есть).
Ну чтож, всё, что осталось сделать — это запустить
brat3 root # ping ya.ru
PING ya.ru (213.180.204.8) 56(84) bytes of data.
64 bytes from ya.ru (213.180.204.8): icmp_seq=1 ttl=50 time=623 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=2 ttl=50 time=598 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=3 ttl=50 time=519 ms
и убедиться, что всё работает… ну или не работает… тогда начинать всё сначала, проверять и перепроверять, тестировать оборудование… да мало ли?
Думаю, что в первую очередь, надо проверять, верно ли настроена филтрация IP-пакетов в спутниковой карте.
Для меня это подключение, увы, оказалось несколько бесполезным: «наземное» подключение осуществляется через CDMA-аппарат Ubiquam-100, а он имеет свойство в моменты «затишья» выключаться. ppp-клиент, обнаружив, что связи нет, обрывает VPN соединение. Как с этим боротся, пока не разобрался. Впрочем, нет худа без добра: теперь могу подключаться к SkyLink со сжатием данных, что очевидно экономит траффик.
Для GPRS/EDGE-подключения MPPE/MPPD-подключение также оказалось бесполезным — нужные порты просто закрыты провайдером (у меня Билайн)
Кроме того, настройка этого подключения под Linux оказалась несколько более хлопотная, чем установка, настройка и подключение через OpenVPN. Ну да ладно, хватит жаловаться на неблагоприятные погодно-материальные условия! Начнём, пожалуй.
Во-первых, понадобится патч для ядра, ppp-клиента и самый ppp-клиент, версии не ниже, чем 2.4.2. Патчи можно взять на сайте MPPE/MPPC kernel module for Linux (бывший www.polbox.com). Ну а что же до ppp-клиента, то его домашний сайт находится там же где и всегда — PPP Web-page
Не забудьте, что версии патчей должны соответствовать версиям ядра и ppp-клиента.
Начнём с ядра. Предположим, что вы распаковали исходный код яра и сделали линк на /usr/src/linux и зали в эту директорию (патч остался в папке /usr/src/linux-2.XX.XX-mppe-mppc-1.X.patch.gz) Набираем команду: gzip -cd linux-2.XX.XX-mppe-mppc-1.X.pathc.gz && patch -p1.
Далее, набираем make mrproper && make menuconfig (ну или, к чему Вы там привыкли?) И находим в разделе «Network device support» «PPP (point-to-point protocol) support» и «Microsoft PPP compression/encryption (MPPC/MPPE)». Отмечаем их для компиляции.
Кроме того, в разделе «Cryptographic API» надо отметить «SHA Digest algorithm» и «ARC4 cipher algorithm»[15]. Сохраняем конфигурацию ядра и пересобираем его.
Теперь очередь pppd. «Раскручиваем» исходный код в какую-нибудь директорию, и накладываем патч: patch -p0 < ppp-2.4.X-mppe-mppc-1.X.patch.gz (patch (1)) и далее делаем всё по инструкции установки: ./configure && make && make install.
Теперь надо настроить конфигурационные файлы ppp. Начнём с файлов авториации: /etc/ppp/chap-secrets. CHAP (Challenge Handshake Authentication Protocol протокол аутентификации с предварительным согласованием вызова) Открываем файл /etc/ppp/chap-secrets и дописываем туда логин/пароль, выданные провайдером для подключения в хорошо знакомом всем формате:
#<login> <server> <password> <IP-Address>
mylogin * mypassword *
Далее принимаемся за файл /etc/options.pptp:
#
# Lock the port
#
lock
#
# Debug option
#
debug
#
# We don't need the tunnel server to authenticate itself
#
noauth
#
# Turn off transmission protocols we know won't be used
#
nobsdcomp
nodeflate
#
#
#
lock
#
# We want MPPE
#
mppe required,stateless
#
# We want a sane mtu/mru
#
mtu 1000
mru 1000
#
# Time this thing out of it goes poof
#
lcp-echo-failure 10
lcp-echo-interval 10
# Handshake Auth Method
+chap
:
# +mschap-v2
Я пробовал увеличивать значение lcp-echo-failure, но почему-то к толковому результату это не привело. Связь всё равно до обидного быстро обрывалась.
Теперь редактируем файл самого подключения. Обычно эти файлы находятся в директории /etc/ppp/peers. Свой файл назвал Raduga по имени сервиса, к которому подключаюсь.
#
# PPTP Tunnel configuration for tunnel 904.d-v.ru
# Server IP: 904.d-v.ru
# Route: add -host 80.81.208.34/0 gw 10.252.243.159
#
#
# Tags for CHAP secret selection
#
name mylogin
-pap
+chap
-mschap
-mschap-v2
debug
noauth
novj
nobsdcomp
noproxyarp
nodeflate
silent
Ну вот, пожалуй и всё. Можно набрать pptp-command start Raduga. Опять же, если всё правильно настроено, то вы логе Вы можете увидеть следующие сообщения:
Sep 18 00:24:17 brat3 pppd[1313]: Connect: ppp1 <--> /dev/pts/4
…
Sep 18 00:24:58 brat3 pppd[1313]: sent [CHAP Response id=0x65 , na
me = "MyLogin"]
…
Sep 18 00:24:58 brat3 pppd[1313]: rcvd [LCP EchoRep id=0x0 magic=0x39495f17]
Sep 18 00:24:58 brat3 pppd[1313]: rcvd [CHAP Success id=0x65 "Access granted"]
Sep 18 00:24:58 brat3 pppd[1313]: CHAP authentication succeeded: Access granted
Sep 18 00:24:58 brat3 pppd[1313]: sent [CCP ConfReq id=0x1 ]
…
Если Вы хотите поподробнее почитать о настройке VPN подключения, то обратитесь к более специальной статье. Например, рекомендую заглянуть в заметку Алекса Зорга «Настройка VPN (использование pptp-client'а)»[16].
Ну тут всё просто (особенно, если заглянуть в «Masquerading Made Simple HOWTO»:[17]
$> modprobe ipt_MASQUERADE # If this fails, try continuing anyway
$> iptables -F; iptables -t nat -F; iptables -t mangle -F
$> iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
$> echo 1 > /proc/sys/net/ipv4/ip_forward
или, если Вы используете MPPC/MPPE-подключение:
$> modprobe ipt_MASQUERADE # If this fails, try continuing anyway
$> iptables -F; iptables -t nat -F; iptables -t mangle -F
$> iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
$> echo 1 > /proc/sys/net/ipv4/ip_forward
Что любопытно, теперь спутниковое подключение к Интернет будет доступно со всех компьютеров Вашей Локальной Сети.
Ой, разберитесь сами, не совсем понимаю, как это работает.
[1] Алексей Силяков «DVB-карта SkyStar-1, релиз 1.5. Technotrend. Работа над ошибками.» На мой взгляд, одна из самых подробных и разносторонних статей об этой, несомненно, по сей день популярной DVB-карте.
[2] Файл Documentation/dvb/faq.txt из пакета документации ядра Linux 2.6.12.2
[3] «Програмное обеспечение под Linux» (обзор)
[4] «Как запустить интернет через DVB-S под Linux 2.4»
[5] Сайт NuclearCat'a
[6] «Digital Video Broadcasting или как заставить работать TechniSat SkyStar-1 под Linux»
[7] Установка спутникового Internet под Linux
[8] Сайт Andrix'а (dvbd, dvbroute)
[9] NuclearCat, s.o.v.a., «Руководство по установке SkyStar2 под Linux 2.4»
[10] Роберто Аркомано, Sat-HOWTO
[11] Denis Kot (DCot), «Настройка выхода в Internet через SkyStar2 (b2c2) под Linux (linux skystar dvb)»
[12] Виталий Прядко, «Установка Skystar-2 на Linux (skystar dvb linux driver)»
[13] «Установка и настройка спутниковой антены»
[15] MPPE/MPPC kernel module for Linux
[16] Alex Zorg, «Настройка VPN (использование pptp-client'а)»
[17] John Tapsell, Thomas Spellman, Matthias Grimm, «Masquerading Made Simple HOWTO»
1 не стоит путать её, с картой SkyStar 1 CI — это несколько разные вещи, хотя утверждается, что эта карта работает вполне нормально работает с теми же драйверами. Что же до SkyStar 1, то она довольно давно снята с производства, хотя до сих пор свободно продаётся в России и странах СНГ.
Приобрести её можно, например здесь.
2Dont flame me if it does not work for you, destroys your computer or what-not. I take no responsibility. My intention was to modify Carsten's dvbd so that it does not need patching anymore (at least for me). I also added this docs, help for commandline flags acceptable by dvbd, and made a few extensions inside the program - consult the top of dvbd.c file if you are wondering.