Скрипт инициализации портов /etc/rc.serial сам по себе
довольно объемен. Он содержит все (или почти все) возможные параметры инициализации для
большинства известных науке девайсов, подключаемых к последовательному порту. Нас же
интересует наличие раздела инициализации последовательных портов для модемов:
modem() {
# Modem that supports CTS and perhaps RTS handshaking.
ci=$1; shift
co=$1; shift
for i in $*
do
# may depend on modem
comcontrol /dev/tty${ci}${i} dtrwait 100 drainwait 180
# Lock crtscts on.
# Speed reasonable for V42bis.
stty < /dev/ttyi${ci}${i} crtscts 57600
stty < /dev/ttyl${ci}${i} crtscts
stty < /dev/cuai${co}${i} crtscts 57600
stty < /dev/cual${co}${i} crtscts
done
}.
Сим инициализируются порты, идентификаторы и номера которых передаются функции в качестве аргументов.
Собственно, настройка заключается в раскомментировании строки в конце файла. Для
терминалов ttyd1 и ttyd2 (в терминах Microsoft это COM2 и COM3) строка должна выглядеть так:
# Initialize assorted 8250-16550 (sio) ports.
modem d a 1 2
Параметры проинициализированных портов получаются такими:
stty < /dev/ttyi${ci}${i} crtscts 115200
...
stty < /dev/cuai${co}${i} crtscts 115200
Теперь, если отдать:
dial-in-server# cd /etc
dial-in-server# sh rc.serial
то порты проинициализируются нужными скоростями. Для пущей уверенности правильность настроек
проверяется соединением с модемом с помощью терминалки. Об этом
в разделе, посвященном настройке модемов.
Напоследок, есть немаловажные и не совсем очевидные детали при установке скоростей нескольких модемов на одном сервере, которую автор не встречал ни в одном из руководств по dial-in:
Правится это в /etc/ppp/ppp.conf, в параметре set speed. Мне это
стоило двух дней - понять, где «собака порылась». Файл /etc/ppp/ppp.conf:
set speed 57600
Вообще, передача данных на физическом уровне бывает синхронной и асинхронной. Терминалы исторически пользуются только асинхронными протоколами последовательных линий. Начало пакета данных определяется положительным или отрицательным фронтом импульса. Затем следует заранее оговоренное число импульсов данных с заранее оговоренной скоростью. Количество переданных полезных бит может быть больше количества импульсов - данные могут передаваться и по фронтам. Далее могут следовать служебные данные типа бита четности. Завершают пакет стоп-биты. Сервер и терминал должны поддерживать и быть сконфигурированы на один тот же протокол.
Настройки линий собраны в файле /etc/gettytab. Естественно,
getty, каждый раз, при старте его перечитывает. То есть, после правки, при следующем
коннекте будут действовать уже правленые настройки. Секция default
определяет параметры, общие для всех секций. Началом секции считается начало строки, окончание и
разделитель - двоеточие, продолжение секции на следующей строке - «\» перед концом строки:
default:\
:cb:ce:ck:lc:fd#1000:im=\r\n%s/%m (%h) (%t)\r\n\r\n:sp#1200:\
:if=/etc/issue:
Умолчания такие:
Интересующие нас секции std находятся под комментарием:
# Fixed speed entries
Для dial-in сгодится большинство из них, если не использовать модем на 2400.
Как видим, в секциях определяется запрещение эмуляции контроля четности и
использование восьмибитных символов (np), затем переопределяется скорость порта (sp#):
g|std.19200|19200-baud:\
:np:sp#19200:
std.38400|38400-baud:\
:np:sp#38400:
std.57600|57600-baud:\
:np:sp#57600:
std.115200|115200-baud:\
:np:sp#115200:
std.230400|230400-baud:\
:np:sp#230400:
Редактировать (пока) ничего не нужно, важно лишь наличие секции с выбранной скоростью
портов и определения в ней протокола 8-N-1:
Настройка сводится к конфигурированию и записи в NVRAM модемов профиля, который будет загружаться при включении и сбросе сигнала DTR. Делается это с помощью любой терминалки и не важно, будет это Windows HyperTerminal, cu или tip UNIX. Мне, однако, претит лишний раз возиться в пыли-грязи с разъемами, да и колотить по клавиатуре в csh получается все же быстрее, чем возить мышью.
Итак, запустим терминалку (модем, подключенный к sio1, проинициализирован на 57600):
dial-in-server# cu -l /dev/cuaa1 -s 57600
она лаконично ответит:
Connected.
По команде ATI4 модем обязан послушно выдать листинг текущего профиля.
В зависимости от значений этого самого профиля модем может и не
дублировать ввод, и не отвечать «ОК». Аналоги ATI4
реализованы во всех модемных чипсетах, так что, скорее всего, листинг будет примерно таким:
U.S. Robotics 56K FAX EXT Settings...
B0 E0 F1 L2 M1 Q1 V1 X4 Y0
BAUD=57600 PARITY=N WORDLEN=8
DIAL=PULSE ON HOOK CID=0
&A3 &B1 &C1 &D2 &G0 &H1 &I0 &K1
&M4 &N0 &P2 &R2 &S0 &T5 &U0 &Y1
S00=001 S01=000 S02=043 S03=013 S04=010 S05=008 S06=002
S07=060 S08=002 S09=006 S10=014 S11=070 S12=050 S13=000
S15=000 S16=000 S18=000 S19=000 S21=010 S22=017 S23=019
S25=020 S27=000 S28=008 S29=020 S30=000 S31=128 S32=002
S33=000 S34=000 S35=000 S36=014 S38=000 S39=012 S40=000
S41=004 S42=010
LAST DIALED #:
Для нормального функционирования модем должен иметь следующие настройки профиля:
AT&F1E0F1Q1Y0&A3&B1&C1&D2&G0&H1&K1&M4&N0&P0&R2&S0&T5&U0S0=1&W0
Можно поступить по-другому: загрузить заводской шаблон с аппаратным управлением потоком,
пролистать его, подправить настройки и записать в NVRAM:
AT&F1
ATI4
AT&F1E0F1Q1Y0 U0S0=1
Измененный заводской шаблон сохраняется в профиль 0 NVRAM командой:
AT&W0
Проверить настройки можно перезагрузив модем с профилем по умолчанию:
ATZ0
ATI4
Выход из cu по:
~.
dial-in-server#
В старых (и некоторых не очень старых) модемах есть DIP-переключатели, они имеют наибольший приоритет по сравнению с командами и регистрами, настройка локального эха, автоответа, результирующих кодов и прочих разностей осуществляется ими.
Определения терминалов находятся в файле /etc/ttys.
В числе прочих его пользует init, который и запускает на
терминале управляющую программу. В контексте настройки dial-in правке подлежат строки
определений последовательных терминалов:
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0 "/usr/libexec/getty std.9600" dialup off secure
ttyd1 "/usr/libexec/getty std.9600" dialup off secure
ttyd2 "/usr/libexec/getty std.9600" dialup off secure
ttyd3 "/usr/libexec/getty std.9600" dialup off secure
В исходном состоянии каждым из четырех dial-in терминалов ttyd заведует getty с
параметрами секции std.9600 из файла
/etc/gettytab. Параметр secure разрешает логин
rootом, а off - говорит init, что терминал отключен.
Чтобы реализовать dial-in подключение к ttyd1 и ttyd2, нужно включить терминал,
указать ему секцию с настройками порта и одновременно запретить getty
принимать логин rootа - немного паранойи никому не помешает:
ttyd0 "/usr/libexec/getty std.9600" dialup off secure
ttyd1 "/usr/libexec/getty std.57600" dialup on insecure
ttyd2 "/usr/libexec/getty std.57600" dialup on insecure
ttyd3 "/usr/libexec/getty std.9600" dialup off secure
Теперь отдадим:
dial-in-server# kill -HUP 1
Этим мы заставляем init перезагрузиться и, соответственно,
перечитать конфигурационные файлы, через момент внешний модем должен зажечь индикатор «TR»
(или «DTR» у некоторых модемов, если он есть). Отдадим:
dial-in-server# ps ax | grep ttyd
и убедимся, что getty готов принимать звонки на нужных нам терминалах с нужными скоростями:
232 ?? I 0:00,07 /usr/libexec/getty std.57600 ttyd1
237 ?? I 0:00,07 /usr/libexec/getty std.57600 ttyd2
Особое внимание в листинге процессов стоит уделить второму столбцу. Символы «??»
свидетельствуют о нормальном открытии порта getty и ожидании им модемного соединения
(активности сигнала DCD). Нечто отличное, вроде «d1» для ttyd1 означает, что модем,
подключенный к sio1, принял звонок и установил связь с удаленным коллегой или о
неправильной настройке сигнала CD модема.
На этом настройку dial-in сервера можно закончить, если его основное назначение - удаленное администрирование, ибо dial-in консоли для этих целей вполне достаточно. Настройка PAP и CHAP аутентификации «как у взрослых провайдеров» рассматривается в главе «Настройка сервера удаленного доступа», но перед этим автор настоятельно рекомендовал бы убедиться в полной работоспособности «голой» dial-in консоли. В любом случае траблшутинг придется начинать с отключения протоколов авторизации, так как основных исходных причин немного:
Если Вы знакомы с удаленной консолью, то этот раздел можно пропустить и пользоваться для dial-in тем же аккаунтом, что и для удаленной консоли.
В предыдущем разделе «Настройка терминалов»
удаленные терминалы были объявлены как insecure. Администрировать же нужно от
имени rootа. Создадим с помощью
/stand/sysinstall или adduser
нового пользователя так, чтобы он являлся членом группы wheel - только доверенным лицам позволено su.
Можно просто отредактировать /etc/group, если аккаунт уже существует.
wheel:*:0:root,remoteuser
Теперь, после логина под таким аккаунтом в любое время можно стать rootом:
% su -
Password:
dial-in-server#
Тире - параметр su, позволяющий пользовать окружение
rootа, если его опустить, окружение
будет взято пользовательское. Кроме dial-in такой аккаунт годится и для любой удаленной консоли.
Неплохим решением будет очистить или отредактировать
/etc/motd (оставив две пустые строки в конце) -
его содержимое выводится на все виды консолей при логине.
Желающим «крутить» систему, подсказка - секция
default в /etc/login.conf, мне
же было достаточно:
FreeBSD 4.7-RELEASE (NETKERNEL) #8: Thu Feb 5 22:05:48 MSK 2004
Welcome to FreeBSD!