О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

26.07.2008

Настройка dial-up в Linux

2004 г

Не смотря на свою тягу к ручной настройке всего и вся, есть область, в которой я всегда полагался на любого рода автоматику. Это - сетевые соединения, в которых я мало чего понимаю. Однако давеча мои упражнения в Linux-самострое вынудили меня заняться настройкой модемного подключения, что называется, с "нуля". То есть - протокола PPP. Поскольку вопросы такого рода время от времени возникают в народе, я решил изложить свой опыт в виде данной заметки.

Сразу скажу, что речь идет о настройке обычного "железного" внешнего модема (U.S.Robotics 56K Faxmodem - именно так написано на коробке) на последовательном порту, который беспроблемно определяется любым не-Windows. О шаманстве в отношении всякого рода win-модемов и USB-модемов я говорить не буду - могу только выразить свое сочувствие их счастливым обладателям.

Отправная точка для дальнейших упражнений - самостройный Base Linux в объеме, примерно соответствующем LFS, но несколько урезанном за счет отказа от Texinfo и соответствующей документации, с системой инициализации в BSD-стиле, заимствованной из дистрибутива CRUX.

Первое, что требуется для использования модема, - поддержка ядром системы. Для этого при конфигурировании оного (посредством make menuconfig; дело происходило во времена версии 2.4.X, но и в 2.6.X в этом отношении ничего не изменилось) отправляемся в пункт Network device support, где сначала включаем общую поддержку сетевых устройств (Network device support), после чего отмечаем пункты Dummy net driver support и PPP (point-to-point protocol) support. Внутри последнего требуется также включить поддержку PPP через асинхронный последовательный порт (PPP support for async serial ports), сиречь наш обычный COM, и, вероятно, одного из протоколов компрессии (PPP Deflate compression или PPP BSD-Compress compression), в зависимости от того, какой поддерживается провайдером (в сомнительных случаях можно включить оба).

Все эти опции конфигурации ядра могут быть как встроены в него, так и подключаться в качестве загружаемых модулей. Какой способ выбрать - вопрос спорный, я, во избежание лишнего головоломства, встраиваю в ядро все, кроме протоколов компрессии (их резонно держать модулями).

Далее требуется собрать сам пакет ppp. Ничего специфичного в этом нет - разворачиваем тарбалл, переходим в образовавшийся каталог, читаем соответствующий README (в нашем случае - README.linux) и выполняем три сакраментальных деяния - ./configure (опции --help при этом не предусмотрено, суть конфигурирования сводится просто к установлению ссылок на Make-файлы, соответствующие данной ОС), make и make install. В результате мы получаем несколько исполнимых файлов /usr/sbin/ppp*, относящихся собственно к ppp-демону, и команду /usr/sbin/chat, используемую для дозвона, а также три пустых конфигурационных файла в каталоге /etc/ppp - chap-secrets, options и pap-secrets.

А теперь, как обычно в мире Unix, средь мира дольного для сердца вольного, - было два пути. Первый - просто отредактировать файлы конфигурации демона pppd в текстовом редакторе (и создать недостающие). Благо, например, на сайте моего провайдера имеются примеры таковых для Unix-систем. Однако это, во-первых, показалось мне ленивым, во-вторых, я не очень понял сути процесса, хотя он и подробно (на мой взгляд - излишне подробно) описан в соответствующем HOW-TO. А главное, за короткий период своей онлайновой жизни я успел привыкнуть к звонилке wvdial, выполняющей к тому же функцию опознавателя модема и ppp-конфигуратора. И потому я избрал другой путь - установку wvdial.

Полноты картины для замечу, что есть и другие средства автоматического (или полуавтоматического) конфигурирования ppp-соединения. Одно из них, заимствованное из Debian, - это pppsetup, используемый, например, в LiveCD Lonix. Она задает несколько вопросов, ответы на которые достаточно очевидны, на основе чего и генерит требуемые файлы конфигурации и сценарии дозвона, устанавливая заодно и команды инициализации модема. Однако для ее сборки наверняка потребовались бы какие-нибудь дополнительные компоненты, разбираться с которыми у меня не было ни малейшего желания. И, повторяю, общение с wvdial'ом не вызывало у меня никакого стремления искать добра от добра - очень уж он прост в настройке и использовании.

Но вот сборка wvdial'а неожиданно оказалась не вполне тривиальной задачей. Для начала он требует библиотеки wvstreams, что само по себе проблемой не было. Однако на соответствующем сайте она оказалась представленной двумя версиями - стабильной (3.70) и разрабатываемой (wvstreams-3.73f0-2003-05-02). Для начала я скачал и развернул первую. Никакого конфигурирования в ней не требовалось (да и скрипта configure не было, внести необходимые изменения, типа префикса каталога для инсталляции, можно было только непосредственно в Makefile) - достаточно, видимо, было выполнить make и make install. Однако попытка свершить первое действо почти мгновенно привела к выпадению с не вполне внятным сообщением об ошибке, причины которой я поначалу не понял.

Пришлось взяться за разрабатываемую версию. В ней сценарий конфигурирования имелся (вернее, автоматически генерировался при первом запуске make), однако его выполнение оборвалось на требовании OpenSSL, которого у меня, естественно, не было. И хотя в ./configure (согласно выводу в ответ на опцию --help) как-будто бы имелась опция --without-openssl, без OpenSSL библиотека конфигурироваться не желала.

Не увенчалась успехом и попытка соблюсти десятую заповедь компьютерщика - если после выполнения предыдущих девяти заповедей ничего не вышло, прочесть, наконец, документацию. Файл README содержал одну строчку, гласящую, что подробная документация имеется в каталоге Docs. Если же он пуст (а он именно пуст и был) - предлагалось сгенерить ее командой make doxyfile. Однако в ответ на нее радостно рапортовалось, что исполнение команды make невозможно без определения переменной окружения по имени WVPACKAGES. И узнать о смысле которой, вероятно, можно было из той самой документации...

В общем, развернул я OpenSSL. Почти обычным образом - ./configure, make, make install, причем обязательно с префиксом /usr, в /usr/local wvstreams находить его отказывался категорически. После чего, наконец, выполнил /configure и стал размышлять о великой сермяжной правде, скрытой в переменной WVPACKAGES. Можно было предполагать, что она должна была содержать список пакетов, подлежащих сборке. А в качестве имен пакетов можно было рассматривать подкаталоги в дереве исходников wvstreams, носивших имена типа ipstreams, linuxstreams, oggvorbis и т.д. Просмотр их содержимого привел меня к мысли, что для моих целей (сборки wvdial) довольно было бы ipstreams, но и linuxstreams для страховки не казался лишним. В итоге я определил переменную

$ export WVPACKAGES="ipstreams,linuxstreams"

после чего, наконец, требуемая мне библиотека благополучно собралась.

Со сборкой wvdial никаких проблем не возникло - прошла комбинацией из двух стандартных действ. Осталось его сконфигурировать - командой

$ wvdialconf /etc/wvdial.conf

Которая определяет модем и записывает строку его инициализации в указанный файл /etc/wcdial.conf. Куда остается только добавить указание на пульсовый набор

Dial Command = ATDP

телефон для дозвона к провайдеру

Phone = 1234567

логин и пароль для авторизации

Username = my_user_name
Password = my_password

Казалось бы, можно запускать звонилку:

$ wvdial

Ан не тут-то было. wvdial дозванивался по указанному номеру вполне справно, устанавливал соединение, отсылал учетные данные, авторизовывался на провайдерском сервере, запускал pppd, присваивая ему номер процесса - и по прошедствии пары-тройки секунд соединение разрывалось с выдачей кода ошибки (code exit) 2. Правда, вежливо рекомендуя посмотреть, что это такое, в man pppd. Из какового следовало, что exit code 2 возникает при обнаружении противоречивых опций (или что-то в этом роде).

О природе этой нехорошей опции оставалось только гадать. Или, как это принято в приличном обществе, почитать в man (5) wvdial.conf. Где и обнаружилось, что для ppp версии 2.3.0 и выше wvdial должен создавать файл /etc/ppp/peers/wvdial, без которого работать не собирается. Каталога /etc/ppp/peers у меня и в помине не было, и никакого такого файла не образовалось и после его создания и перезапуска wvdialconf.

Благо, в той же man-странице нашлось решение этой проблемы: достаточно было внести в файл wvdial.conf строку, запрещающую использование файла /etc/ppp/peers/wvdial:

New PPPD = no

После чего, наконец-то, удалось дозвониться без всяких проблем.

К чему я столь подробно описываю столь частную задачу? Просто для того, чтобы не забывать о подводных камнях Linux-самостроя, во-первых. А во-вторых - дабы еще раз отдать должное труду сборщиков дистрибутивов, благодаря которому большинство пользователей Linux'а об этих подводных камнях просто не подозревает...