Руководство FreeBSD
Пред. | Глава 20. Последовательные соединения | След.

# 20.4. Входящие соединения по модему

Предоставил Guy Helmer. Дополнил Sean Kelly.

Настройка системы FreeBSD для поддержки входящих соединений очень похожа на подсоединение терминалов за исключением того, что вы работаете с модемами вместо терминалов.

## 20.4.1. Внешние и внутренние модемы

Внешние модемы более удобны для дозвона, поскольку легко могут быть настроены с помощью параметров, сохраняемых в энергонезависимой памяти. На них обычно есть индикаторы, отображающие состояние основных RS-232 сигналов. Мигающие индикаторы впечатляют, но кроме того они также очень полезны для индикации правильной работы модема.

Внутренние модемы обычно не снабжаются энергонезависимой памятью, поэтому их настройка может ограничиваться установкой DIP переключателей. Если на внутреннем модеме есть индикаторы, их обычно сложно увидеть при закрытой крышке корпуса.

### 20.4.1.1. Модемы и кабели

Если вы используете внешний модем, несомненно потребуется подходящий кабель. Стандартный RS-232C кабель должен подойти, если подключены все обычные сигналы:

- Transmitted Data (TD)

- Received Data (RD)

- Request to Send (RTS)

- Clear to Send (CTS)

- Data Set Ready (DSR)

- Data Terminal Ready (DTR)

- Carrier Detect (CD)

- Signal Ground (SG)

FreeBSD требуются сигналы RTS и CTS для контроля передачи на скоростях выше 2400 bps, сигнал CD для определения, был ли ответ на сигнал или произошло отключение линии, и сигнал DTR для сброса модема после завершения сессии. Некоторые кабели не поддерживают все необходимые сигналы, поэтому, если вы столкнулись с проблемами, например, если сессия не завершается после отсоединения линии, причиной возможно являются проблемы с кабелем.

Как и другие UNIX® подобные операционные системы, FreeBSD использует аппаратные сигналы для определения того, был ли ответ на звонок или линия была отключена и требуется завершить работу модема и сбросить его в начальное состояние. FreeBSD избегает отправлять команды модему или просматривать отчеты о статусе от модема. Если вы знакомы с настройкой BBS, это может показаться неудобным.

## 20.4.2. Рекомендации по последовательным интерфейсам

FreeBSD поддерживает интерфейсы, основанные на NS8250, NS16450, NS16550, и NS16550A EIA RS-232C (CCITT V.24). Устройства 8250 и 16450 снабжены односимвольным буфером. Устройство 16550 снабжено 16-ти символьным буфером, который повышает производительность системы. (Ошибки в 16550 делают невозможным использование 16-символьного буфера, поэтому используйте 16550A если возможно). Поскольку устройства с односимвольным буфером предъявляют большие требования к операционной системе, чем с 16-ти символьным буфером, предпочтительны устройства на 16550A. Если в системе много активных последовательных портов или нагрузка велика, устройства на 16550A лучше подходят для поддержки соединений с малым количеством ошибок.

## 20.4.3. Краткий обзор

Как и с терминалами, `init` запускает процесс `getty` на каждом настроенном для входящих звонков последовательном порту. Например, если модем подключен к `/dev/ttyd0`, команда `ps ax` может вывести следующее:

     4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0

Когда пользователь дозванивается на подключенный модем, модем выдает сигнал CD (Carrier Detect). Ядро определяет, что несущая обнаружена и завершает открытие порта командой `getty`. `getty` отправляет приглашение `login:` на указанной скорости. `getty` ожидает в ответ набор символов, и, как правило, получает неправильный набор (обычно это происходит из-за того, что скорость соединения модема отличается от скорости `getty`). `getty` пробует подобрать скорость линии до тех пор, пока не получит правильный набор символов.

После того, как будет введено имя пользователя, `getty` выполняет `/usr/bin/login`, которая завершает вход, запрашивая пароль пользователя и запуская оболочку.

## 20.4.4. Файлы настройки

Есть три файла настройки системы в каталоге `/etc`, которые возможно потребуется отредактировать для включения удаленного доступа по модему в FreeBSD. Первый, `/etc/gettytab`, содержит информацию по настройке даемона `/usr/libexec/getty`. Второй, `/etc/ttys`, содержит информацию, указывающую `/sbin/init` на каких устройствах `tty` должны быть запущены процессы `getty`. Наконец, вы можете поместить команды инициализации портов в скрипт /etc/rc.serial.

В UNIX есть две школы настройки модемов для входящих соединений. Одна предпочитает настраивать модемы и системы так, что не важно на какой скорости подсоединяется удаленный пользователь. Локальный интерфейс RS-232 компьютер-модем работает на жестко заданной скорости. Преимущество этой настройки в том, что удаленный пользователь всегда сразу видит приглашение ко входу. Обратная сторона в том, что система не знает, какова на самом деле скорость передачи данных, поэтому полноэкранные программы, такие как Emacs, не настраивают свои методы отображения на экране для работы с медленными соединениями.

Другая школа настраивает интерфейс RS-232 для работы с различной скоростью в зависимости от скорости подсоединения удаленного пользователя. Например, соединение модемов по протоколу V.32bis (14.4 Кбит/с) установит скорость порта RS-232 равной 19.2 Кбит/с, а соединение на скорости 2400 бит/с установит скорость RS-232 равной 2400 бит/с. Поскольку `getty` не понимает сообщений модема о скорости соединения, `getty` выдает приглашение `login:` на установленной по умолчанию скорости и считывает символы, полученные в ответе. Если пользователь видит ''мусор'' вместо приглашения ко входу, это означает, что нужно нажимать Enter до тех пор, пока не появится приглашение ко входу. Если скорости не совпадают, `getty` получает все, что вводит пользователь, в виде ''мусора'', пробует переключиться на другую скорость и выдает приглашение `login:` опять. Эта процедура может продолжаться до отвращения, но обычно требуется одно или два нажатия клавиши перед появлением нормально выглядящего приглашения. Очевидно, эта последовательность входа не так хороша, как метод с фиксированной скоростью, но при низкой скорости соединения работать с полноэкранными программами станет проще.

В этом разделе делается попытка дать сбалансированную информацию для настройки, но предпочтение будет отдано установке скорости соединения с модемом в соответствие скорости подключения.

### 20.4.4.1. `/etc/gettytab`

`/etc/gettytab` это файл в стиле termcap(5), содержащей информацию по настройке getty(8). Пожалуйста, обратитесь к странице справочника gettytab(5) за полной информацией о формате файла и за списком возможностей `getty`.

#### 20.4.4.1.1. Настройка фиксированной скорости

Если вы зафиксировали скорость соединения модема на определенной скорости, редактировать файл `/etc/gettytab` скорее всего не потребуется.

#### 20.4.4.1.2. Настройка изменяемой скорости

Вам потребуется сделать запись в `/etc/gettytab` для предоставления `getty` информации о скоростях, которые предполагается использовать для модема. Если у вас 2400 бит/с модем, возможно, подойдет существующая запись D2400.

    #
    # Fast dialup terminals, 2400/1200/300 rotary (can start either way)
    #
    D2400|d2400|Fast-Dial-2400:\
            :nx=D1200:tc=2400-baud:
    3|D1200|Fast-Dial-1200:\
            :nx=D300:tc=1200-baud:
    5|D300|Fast-Dial-300:\
            :nx=D2400:tc=300-baud:

Если у вас более скоростной модем, вам возможно потребуется добавить запись в `/etc/gettytab`; вот запись, которую вы можете использовать для 14.4 Кбит/с модема с максимальной скоростью интерфейса 19.2 Кбит/с:

    #
    # Additions for a V.32bis Modem
    #
    um|V300|High Speed Modem at 300,8-bit:\
            :nx=V19200:tc=std.300:
    un|V1200|High Speed Modem at 1200,8-bit:\
            :nx=V300:tc=std.1200:
    uo|V2400|High Speed Modem at 2400,8-bit:\
            :nx=V1200:tc=std.2400:
    up|V9600|High Speed Modem at 9600,8-bit:\
            :nx=V2400:tc=std.9600:
    uq|V19200|High Speed Modem at 19200,8-bit:\
            :nx=V9600:tc=std.19200:

Эта настройка включает 8-битные соединения без программного контроля четности.

В примере выше скорость порта будет переключаться в цикле начиная с 19.2 Кбит/с (для соединения по V.32bis), затем 9600 бит/с (для V.32), 2400 бит/с, 1200 бит/с, 300 бит/с, и обратно на 19.2 Кбит/с. Переключение скоростей в цикле реализовано с помощью nx= (''next table''). Каждая из линий использует tc= (''table continuation'') для указания ''стандартных'' (std) настроек на каждой скорости.

Если у вас 28.8 Кбит/с модем и/или вы хотите получить преимущество от сжатия на скорости 14.4 Кбит/с, потребуются скорости выше, чем 19.2 Кбит/с. Вот пример записи из `gettytab` для начала соединения на скорости 57.6 Кбит/с:

    #
    # Additions for a V.32bis or V.34 Modem
    # Starting at 57.6 Kbps
    #
    vm|VH300|Very High Speed Modem at 300,8-bit:\
            :nx=VH57600:tc=std.300:
    vn|VH1200|Very High Speed Modem at 1200,8-bit:\
            :nx=VH300:tc=std.1200:
    vo|VH2400|Very High Speed Modem at 2400,8-bit:\
            :nx=VH1200:tc=std.2400:
    vp|VH9600|Very High Speed Modem at 9600,8-bit:\
            :nx=VH2400:tc=std.9600:
    vq|VH57600|Very High Speed Modem at 57600,8-bit:\
            :nx=VH9600:tc=std.57600:

Если у вас медленный CPU или сильно загруженная система без последовательных портов на базе 16550A, на скорости 57.6 Кбит/с могут возникнуть ошибки ```sio`'' ''silo''.

### 20.4.4.2. `/etc/ttys`

Настройка файла `/etc/ttys` была описана в Прим. 20-1. Настройка модемов похожа, но потребуется передавать `getty` различные аргументы и указывать различные типы терминалов. Общий формат для фиксированной и переменной скорости такой:

    ttyd0   "/usr/libexec/getty xxx"   dialup on

Первый пункт в строке выше это специальный файл устройства для этой записи -- ttyd0 означает, что `getty` будет запущена на `/dev/ttyd0`. Второй пункт, "/usr/libexec/getty xxx" (xxx будет замещено на запись из `gettytab` для начальной скорости), это процесс, который будет запущен на данном устройстве. Третий пункт, dialup, это тип терминала по умолчанию. Четвертый параметр, on, указывает `init`, что линия включена. Может быть пятый параметр, secure, но он должен использоваться только для терминалов, которые физически безопасны (таких как системная консоль).

Тип терминала по умолчанию (dialup в примере выше) может зависеть от личных предпочтений. dialup это традиционный тип терминала по умолчанию на линиях для дозвона, который позволяет пользователям, зная что тип терминала dialup, автоматически настраивать свой тип терминала. Однако, автор находит более легким указание vt102 в качестве типа терминала по умолчанию, поскольку пользователи работают на своих удаленных системах с эмулятором терминала VT102.

После внесения изменений в `/etc/ttys`, вы можете отправить процессу `init` сигнал HUP перечитать файл. Используйте команду

    # kill -HUP 1

для отправки сигнала. Если вы настраиваете систему в первый раз, то возможно захотите подождать, пока модем(ы) правильно настроятся и соединятся перед отправкой сигнала `init`.

#### 20.4.4.2.1. Настройка фиксированной скорости

Для настройки соединения с фиксированной скоростью, в файле `ttys` должна быть запись с фиксированной скоростью для `getty`. Для модема, скорость порта которого фиксирована на значении 19.2 Кбит/с, строка в `ttys` может выглядеть так:

    ttyd0   "/usr/libexec/getty std.19200"   dialup on

Если скорость модема фиксирована на другом значении, подставьте соответствующее значение в std.speed вместо std.19200. Убедитесь, что вы используете тип, описанный в `/etc/gettytab`.

#### 20.4.4.2.2. Настройка переменной скорости

В настройке с переменной скоростью, запись в `ttys` должна обращаться к соответствующей ''auto-baud'' (sic) записи в `/etc/gettytab`. Например, если вы добавите предложенную выше запись для подключения модема с переменной скоростью, которая начинается с 19.2 Кбит/с (запись в `gettytab` начинается с V19200), запись в `ttys` может выглядеть так:

    ttyd0   "/usr/libexec/getty V19200"   dialup on

### 20.4.4.3. `/etc/rc.serial`

Для высокоскоростных модемов, таких как V.32, V.32bis и V.34, требуется использование аппаратного контроля передачи (`RTS/CTS`). Вы можете добавить команды `stty` к файлу `/etc/rc.serial` для установки флага аппаратного контроля передачи в ядре FreeBSD для модемных портов.

Например, для установки флага termios crtscts на последовательном порту номер 1 (`COM2`) при инициализации устройств для входящей и исходящей связи, в `/etc/rc.serial`должны быть добавлены следующие строки:

    # Serial port initial configuration
    stty -f /dev/ttyid1 crtscts
    stty -f /dev/cuaia1 crtscts

## 20.4.5. Настройка модема

Если параметры вашего модема могут быть сохранены в энергонезависимой памяти, потребуется использовать терминальную программу (например, Telix под MS-DOS® или `tip` под FreeBSD) для установки параметров. Подсоединитесь к модему, используя ту же скорость соединения, которую использует `getty` в качестве начальной скорости, и настройте модем для соответствия следующим требованиям:

- CD включен после соединения

- DTR включен во время работы; сброс DTR отключает линию и переводит модем в начальное состояние

- CTS контроль переданных данных

- Контроль потока XON/XOFF отключен

- RTS контроль принятых данных

- ''Тихий'' режим (без кодов возврата)

- Эхо команд отключено

Прочтите документацию на модем для определения какие команды и/или DIP переключатели требуются чтобы установить эти настройки.

Например, для установки вышеуказанных параметров на внешнем 14,400 модеме U.S. Robotics® Sportster®, требуется отправить модему следующие команды:

    ATZ
    AT&C1&D2&H1&I0&R2&W

Вы, возможно, захотите настроить и другие параметры модема, такие как использование сжатия V.42bis и/или MNP5.

Внешний U.S. Robotics Sportster 14,400 модем также снабжен некоторыми DIP переключателями, которые требуется установить; для других модемов эти настройки могут быть использованы в качестве примера:

- Переключатель 1: вверх -- нормальный DTR

- Переключатель 2: N/A (визуальные коды возврата/числовые коды возврата)

- Переключатель 3: вверх -- подавление кодов возврата

- Переключатель 4: вниз -- без эхо, offline команды

- Переключатель 5: вверх -- авто ответ

- Переключатель 6: вверх -- нормальный контроль несущей

- Переключатель 7: вверх -- загрузить установки по умолчанию из NVRAM

- Переключатель 8: N/A (Smart/Dumb режимы)

Коды возврата должны быть отключены/подавлены для устранения проблем, которые могут возникнуть, если `getty` ошибочно выдаст приглашение `login:` модему в командном режиме и модем вернет (echo) эту команду или код возврата. Эта последовательность может привести к дополнительному и бессмысленному обмену командами между `getty` и модемом.

### 20.4.5.1. Настройка фиксированной скорости

Для настройки фиксированной скорости вам потребуется настроить модем с поддержкой постоянной скорости обмена данными модем-компьютер независимо от скорости соединения. На внешнем модеме U.S. Robotics Sportster 14,400 эти команды зафиксируют скорость передачи модем-компьютер на скорости, которая установлена при выполнении команды:

    ATZ
    AT&B1&W

### 20.4.5.2. Настройка переменной скорости

Для настройки переменной скорости вам потребуется настроить модем с поддержкой изменения скорости передачи данных через последовательный порт в соответствии через скоростью соединения. Следующие команды зафиксируют скорость передачи данных с коррекцией ошибок внешнего модема U.S. Robotics Sportster 14,400 на значении, которое установлено при выполнении команды, но сделают возможным изменение скорости последовательного порта для соединений без коррекции ошибок:

    ATZ
    AT&B2&W

### 20.4.5.3. Проверка настроек модема

Большинство высокоскоростных модемов предоставляют команды для просмотра текущих параметров модема в виде, отчасти приспособленном для чтения. Для внешних модемов U.S. Robotics Sportster 14,400 команда `ATI5` отображает установки, сохраненные в энергонезависимой памяти. Для просмотра действующих параметров модема (с учетом положения DIP переключателей), используйте команду `ATZ`, а затем `ATI4`.

Если ваш модем другого производителя, проверьте руководство к модему для аккуратной проверки параметров настройки модема.

## 20.4.6. Решение проблем

Вот несколько шагов, которые нужно выполнить для проверки настроек.

### 20.4.6.1. Проверьте систему FreeBSD

Подсоедините модем к системе FreeBSD, загрузите систему, и, если на модеме есть индикаторы, посмотрите, загорелся ли индикатор DTR при появлении приглашения `login:` на системной консоли -- если он загорелся, это означает, что FreeBSD запустила процесс `getty` на соответствующем коммуникационном порту и модем ожидает входящего звонка.

Если индикатор DTR не загорелся, войдите на консоль системы FreeBSD и выполните команду `ps ax`, чтобы увидеть, пытается ли FreeBSD запустить процесс `getty` на соответствующем порту. Вы должны увидеть строки вроде этих среди показанных процессов:

      114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
      115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1

Если вы видите что-то другое, вроде этого:

      114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0

и модем все еще не принимает звонок, это означает, что `getty` завершила открытие коммуникационного порта. Это может означать проблему с кабелем или неправильную настройку модема, поскольку `getty` не должна открывать коммуникационный порт, пока модем не установит CD (обнаружение несущей).

Если вы не видите процессов `getty`, ожидающих открытия соответствующего порта `ttydN`, внимательно проверьте записи в `/etc/ttys` и попробуйте найти ошибки, если они есть. Проверьте также лог файл `/var/log/messages`, нет ли там сообщений от `init` или `getty`, имеющих отношение к проблеме. Если сообщения есть, проверьте еще раз файлы настройки `/etc/ttys` и `/etc/gettytab`, как и соответствующие специальные файлы устройств `/dev/ttydN`, чтобы обнаружить ошибки, отсутствующие записи или отсутствующие специальные файлы устройств.

### 20.4.6.2. Попробуйте позвонить на модем

Попробуйте дозвониться до системы; убедитесь, что используете 8 бит без четности и 1 стоп бит на удаленной системе. Если вы не получите приглашение сразу, или получите случайные данные, попробуйте нажимать Enter примерно раз в секунду. Если вы все еще не видите приглашения `login:` после нескольких попыток, попробуйте отправить команду `BREAK`. Если вы используете для дозвона высокоскоростной модем, попробуйте позвонить еще раз после фиксирования скорости интерфейса дозванивающегося модема (например, с помощью команды `AT&B1` для модема U.S. Robotics Sportster).

Если вы все еще не можете получить приглашение `login:`, проверьте `/etc/gettytab` еще раз и убедитесь, что

- Имя параметра `getty`, указанного в `/etc/ttys`, совпадает с именем параметра в `/etc/gettytab`

- Каждая запись nx= соответствует имени другой записи в `gettytab`

- Каждая запись tc= соответствует имени другой записи в `gettytab`

Если система FreeBSD не отвечает на звонок, убедитесь, что модем настроен для ответа на звонок при включении DTR. Если модем настроен правильно, проверьте, что DTR включается, взглянув на индикаторы модема (если они есть).

Если вы проверили все несколько раз и все еще не добились результата, сделайте перерыв и вернитесь к настройкам позже. Если опять ничего не получилось, возможно вам потребуется отправить письмо в Список рассылки, посвящённый вопросам и ответам пользователей FreeBSD, описав модем и возникшую проблему, участники рассылки попробуют помочь вам.

Пред. | Начало | След.
Терминалы | Уровень выше | Исходящие соединения по модему

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам связанными с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.