Следующий Предыдущий Содержание

## 10. Программы, о которых надо сказать

## 10.1 setserial

Данный подраздел присутствует с небольшими отличиями в 3-х HOWTO: этом, Serial и Text-Terminal.

### Проблемы с линмодемами и лэптопами/ноутбуками

setserial, судя по всему, не работает с последовательными портами линмодемов, наподобие ttySHCF0. Если у Вас ноутбук/лэптоп с PCMCIA, то до запуска `setserial` прочтите Ноутбуки/лэптопы: PCMCIA.

### Введение

`setserial` -- программа, предназначенная для взаимодействия с драйвером последовательного порта. При стандартной комплектации ПК с одним или двумя последовательными портами ее применение обычно не требуется. Современные ядра должны в большинстве случаев обнаруживать и дополнительные последовательные порты. setserial может потребоваться, если у Вас старый последовательный порт ISA, настраиваемый перемычками на плате, или если Ваше ядро (это касается версий 2.2 и ниже) не обнаруживает и не настраивает Ваш дополнительный PCI-порт.

`setserial` позволяет Вам (или скрипту оболочки) общаться с драйвером последовательного порта. Но есть еще одна программа -- stty, которая также взаимодействует с последовательным портом и используется для установки скорости порта и т.д.

`setserial` служит для низкоуровневой настройки драйвера: задания IRQ, адреса и т.п., регистров последовательного порта она не затрагивает. Информация о конфигурации последовательных портов, сообщаемая `setserial`, не всегда оказывается верной, поскольку по умолчанию она не проводит опрос последовательных устройств -- ей надо специально указывать на это. А некоторые устройства и вовсе не могут быть обнаружены `setserial`, так как она не поддерживает современных способов опроса шины.

Раньше, когда IRQ и адрес порта выставлялся перемычками на карте, `setserial` использовалась для указания драйверу этих установок. Сегодня, когда нет перемычек, а настройки последовательного порта определяются методами plug-and-play, `setserial`, вообще говоря, не требуется больше -- разве только при наличии проблем или использовании старого последовательного порта. Кроме того, неправильный файл настроек `setserial` вызывает проблемы. В этом случае, если Вы попробуете выяснить настройки порта с помощью `setserial`, то она может просто продублировать неправильную информацию из файла настроек.

`setserial` может стать помощником в нахождении последовательного порта. Но это только при условии, что Вам известны адрес порта и правильные опции для `setserial`. Разыскивать современные порты лучше с использованием методов plug-and-play.

Т.о., название `setserial` (задание параметров последовательного порта -- вольн. перев.) не совсем правильно, т.к. данная программа не настраивает сам порт, она лишь "устанавливает" его адрес и прерывание в драйвер. Драйвер же полностью доверяет той информации, которую передает ему `setserial`, даже если она противоречит сведениям, полученным самим драйвером методами plug-and-play. Плохо то, что при таком конфликте не выдается никаких предупреждений. Поскольку драйвер является частью ядра, то в документации часто используется слово "ядро", под которым подразумевается"драйвер последовательного порта".

В некоторых дистрибутивах (версиях) запуск `setserial` осуществляется во время загрузки системы стартовым скриптом (расположенном в каталогах /etc). Файл настроек данного скрипта может быть в каталогах /etc или /var. В некоторых случаях для запуска `setserial` при загрузке может потребоваться выполнить определенные действия. `setserial` не будет работать, если отсутствует поддержка последовательных устройств (serial support), встроенная в ядро или выполненная в виде загружаемого модуля. Модуль может загружаться автоматически при Вашем (или скрипта) обращении к `setserial`.

`setserial` умеет по заданному адресу ввода-вывода порта определять тип UART и номер IRQ, но имеет несколько ограничений. См. Проверка. Она не умеет задавать IRQ и адрес последовательным портам PCI или PnP (такую возможность имеет драйвер благодаря plug-and-play). Также она не умеет напрямую считывать данные PnP из конфигурационных регистров порта. setserial может передать данные от драйвера, который может считывать эти регистры. Вместо этих возможно правильных данных от драйвера `setserial` может выдать то, что она сама до этого сообщила (может быть неправильно) драйверу. Определить достоверность без других проверок не представляется возможным.

Драйвер последовательных устройств (ядро Linux 2.4+) ищет несколько "стандартных" последовательных портов, PnP-порты на шине ISA и все поддерживаемые порты на шине PCI. Если драйвер правильно распознал порты, то необходимость в использовании `setserial` отпадает. Драйвер не проверяет существующие IRQ, поэтому может назначить их неверно, он также может пропустить старые последовательные порты на шине ISA, настраиваемые перемычками.

Помимо man-страницы информация о `setserial` содержится в `/usr/doc/setserial.../` или `/usr/share/doc/setserial`. Там должно быть сказано, как в Вашем дистрибутиве задействована setserial. Сама `setserial` во всех дистрибутивах работает одинаково, но скрипты, которые ее запускают, настройка (в том числе автоматическая) этих скриптов, названия и размещения файлов скриптов зависят от используемого Вами дистрибутива.

### Выгрузка модуля поддержки последовательных устройств

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

### Команда `setserial`

Повторю, `setserial` не может задавать адреса ввода-вывода и IRQ непосредственно самого порта. Это делают либо программы plug-and-play (запускаемые драйвером), либо установка имеющихся перемычек. Но задание неправильных значений адреса I/O и IRQ посредством `setserial` драйверу приводит к некорректной работе последовательного порта (если он вообще будет работать).

По команде setserial при известном адресе I/O порта можно попытаться определить его IRQ.

Список опций команды можно узнать, просто набрав `setserial` без каких-либо опций и параметров. В полученном списке отсутствуют однобуквенные опции, в том числе -v, обозначающая verbose -- подробный вывод, который не помешает при поиске и решении проблем. Обратите внимание, setserial адрес ввода-вывода называет "port" (портом). Команда

> ``

>     setserial -g /dev/ttyS*

выдаст некоторую информацию о том, как сконфигурирован драйвер. Вы увидите список последовательных портов, показанных с неправильными на первый взгляд IRQ и адресами. Не пугайтесь :), если в строке присутствует `"UART: unknown"`, то такого порта физически не существует и на эту строчку не надо обращать внимания.

Если к опции -g добавить опцию -a, то можно будет получить дополнительную (additional) к общей (general) информацию, которая, в общем-то, может потребоваться немногим, поскольку для большинства хорошо подходят стандартные настройки -- как Вы увидите. Как правило, установки портов соответствуют тем значениям, которые сообщает setserial. Но если у Вас наличествуют проблемы, то очень возможно, что `setserial` не права. Ради эксперимента попробуйте посредством setserial назначить какой-нибудь выдуманный адрес ввода-вывода, любое IRQ и понравившийся Вам тип UART (говоря по-нашему, назначьте их от балды -- поясн. перев. :)). Теперь, набрав "setserial ...", Вы увидите эти ненастоящие значения, которые были получены драйвером. Их также зафиксирует ядро, о чем сообщает команда "scanport" (Debian, см. вверху экрана). Конечно, драйвер будет работать некорректно (если вообще будет работать). Т.е., при задании параметров `setserial` случится может всякое. Почти всякое. Порту не может быть назначен базовый адрес, который уже присвоен другому порту, например 3e8. Но 3e9 (больше на единицу -- прим. перев.) будет принято. К сожалению, адрес 3e9 уже занят -- он входит в диапазон, начинающийся с базового адреса 3e8. Т.о., мораль сей басни такова: прежде, чем назначать с помощью setserial ресурсы, убедитесь в их корректности.

### Файл настроек

Поскольку настройки, произведенные setserial, потеряются при выключении ПК, то для их восстановления при запуске ПК существует файл настроек. В последних версиях все изменения, выполняемые setserial, могут автоматически сохраняться в файл настроек. При запуске `setserial` берет информацию из файла настроек.

Расположения данного файла настроек зависит от дистрибутива. Загляните в дерево каталогов /etc/, где располагаются стартовые скрипты (это может быть подкаталог /etc/init.d/ или /etc/rc.d/), и поищите названия навроде "serial", "setserial" и т.п. Внутри этих скриптов должно быть указано местонахождение файла(ов) настроек. В дистрибутиве Debian есть 4 опции, определяющие использование данного файла настроек:

1. Не использовать этот файл вовсе. При загрузке драйвер сам определяет порты, setserial не запускается (опция "kernel")
2. Запомнить все установки, произведенные `setserial`, в файле настроек только при первом выключении компьютера. При последующих выключениях никаких изменений, в том числе вызванных запуском `setserial` из командной строки, в этот файл не вносить (опция "autosave-once")
3. При каждом выключении производить сохранение установок `setserial` в файл настроек (опция "autosave")
4. Задание конфигурации путем ручной правки файла настроек. Без автосохранения (опция "manual")

Раньше (наверное, до 2000-го года) файла настроек вообще не было, и конфигурация прописывалась вручную в скрипте (сценарии), запускавшем `setserial`. См. Правка скрипта (для setserial версий ниже 2.15).

### Проверка

`setserial` позволяет выполнить проверку портов (под проверкой понимается определение используемых ресурсов -- разъясн. перев.) по указанным адресам ввода-вывода. Естественно, что данные порты должны быть включенными (через PnP, в BIOS, перемычками). Перед проверкой setserial, если Вы используете Debian, полезно дать команду scanport, чтобы проверить (просканировать) за раз все возможные порты. Она выдаст свои предположения относительно некоторых портов, но номера IRQ она не сообщит. Выполнение этой команды может привести к зависанию Вашего ПК, у меня пока что всё работает прекрасно. Похоже, что scanport присутствует только в дистрибутиве Debian. Есть другая программа для сканирования портов?

Итак, `setserial` с соответствующими опциями может проверить последовательный порт, но для этого ей надо задать его адрес. Если просто попросить `setserial` проверить, к примеру, /dev/ttyS2, то сделает это она по адресу, который предполагает для данного порта по умолчанию (2F8). Если у ttyS2 другой адрес, то его надо сообщить setserial явно. То же самое верно и для др. портов.

Результатом проверки в случае присутствия UART по указанному адресу является определение номера его IRQ. Но поскольку есть более быстрые способы определить IRQ: программа wvdialconf, просмотр сообщений системы при загрузке, команды `pnpdump --dumpregs` или lspci -vv, то `setserial` используют редко. Но если Вы все же хотите воспользоваться `setserial`, то можно дать такую команду:
`setserial /dev/ttyS2 -v autoconfig`
Если в полученном сообщении увидите, что тип UART (uart type) 16550A (может быть другой, но маловероятно -- прим. перев.), то порт присутствует. Если увидите "`unknown`" (неизвестный), то либо по данному адресу вообще нет никакого последовательного порта, либо у Вас один из тех дешевых последовательных портов, которые не распознаются правильно.

Кроме автораспознавания типа UART, setserial может автоматически определять номера IRQ, но также не всегда правильно. Сперва она может выдать неправильное прерывание, но после повторения команды может определить верное значение. Начиная с версии 2.15 setserial результаты Вашей последней проверки могут автоматически сохраняться в файл настроек, которым в зависимости от дистрибутива может быть `/etc/serial.conf` или `/etc/sysconfig/serial` или `/var/lib/setserial/autoserial.conf` для Debian. Они будут использованы при следующем запуске Linux.

Может так случиться, что два последовательных порта имеют один и тот же адрес IO. Для шины ISA такая ситуация недопустима, но бывает всякое. Проверка в данном случае выдаст только один порт из двух. Однако, если у портов разные IRQ, то проверка IRQ может показать IRQ = 0.

### Настройка при загрузке

Во время загрузки модуля драйвера последовательного порта (или при загрузке самого ядра, если драйвер последовательного порта в него встроен) выполняется программа, подобная `setserial`, позже из стартового скрипта запускается сама `setserial`. Поэтому, если посмотреть на сообщения во время загрузки, то может показаться, что они повторяются -- так оно и есть :).

Первое сообщение показывает стандартную информацию о стандартных портах (не все из которых могут присутствовать в системе -- прим. перев.). Проверки IRQ не выполняется. Значения IRQ Ваших портов могут отличаться от стандартных. Второе сообщение о последовательных портах -- результат выполнения скрипта /etc/init.d/setserial (скрипт может называться по-другому -- прим.). Скрипт обычно также не осуществляет проверку. Он лишь отображает данные, взятые из файлов настроек. До появления setserial версии 2.15 эти данные вручную прописывались в самом скрипте.

При загрузке ядром модуля драйвера последовательного порта (или самого ядра, если "эквивалент модуля" встроен в него) происходит распознавание всех поддерживаемых портов PnP. Для стандартных портов, соответствующих `ttyS{0-3}`, устанавливаются IRQ 4 и 3 (независимо от номеров IRQ, записанных в портах). Проверки IRQ не производится, но есть возможность сделать ее самомому. На экран выводится сообщение, похожее на сообщение `setserial`.

Исправление возможных ошибок в нумерации IRQ (и некоторые другие действия) производит скрипт, запускающий `setserial`. Если в файле скрипта какие-то IRQ записаны неверно, то и ядро будет иметь неверную информацию о IRQ. Данный скрипт обычно выполняется при начальной загрузке системы. Его запуск или незапуск определяется Вашими настройками (и/или настройками дистрибутива), в том числе установленным уровнем запуска.

Перед тем, как править файл настроек, попробуйте просто запустить `setserial` из командной строки. В некоторых случаях результаты такого выполнения `setserial` при завершении работы системы сохраняются в /etc/serial.conf (или autoserial.conf, или serial, или еще куда-нибудь). Если они Вас устраивают (решают проблему), то необходимость в правке файла настроек сама собой отпадает. См. Configuration method using /etc/serial.conf, etc..

### Правка скрипта (для setserial версий ниже 2.15)

До появления в 1999 году `setserial` версии 2.15 настройка производилась прямой правкой скрипта. Целью было исправление (или создание) файла скрипта в каталоге /etc, запускающего setserial при загрузке. Большинство дистрибутивов содержат такой файл (но располагаться он может не в каталоге /etc).

Так что, до версии 2.15 (1999) было проще (по-видимому, быть пользователем -- добав. перев.). Все, что надо было сделать, -- поправить скрипт. Не было никакого файла /etc/serial.conf (или другого) для настройки setserial. Находите файл, запускающий setserial во время загрузки, и правите его. Если такого файла нет, то создаете его (или прописываете команды в файл, также выполняющий при загрузке). В большинстве случаев этот файл располагался где-нибудь в каталоге /etc. Но в Redhat версии <6.0 он находился в каталоге /usr/doc/setserial/ (в качестве примера -- прим. перев.), его надо было переместить в каталог /etc.

Использовался обычно скрипт `/etc/rc.d/rc.serial`, в Debian -- `/etc/rc.boot/0setserial`. Также использовался скрипт `/etc/rc.d/rc.local`, но он мог запускаться недостаточно рано. Сообщалось, что другие процессы могут попытаться открыть последовательный порт прежде, чем запустится rc.local -- что приводит к ошибке. Можно было бы воспользоваться /etc/init.d/, но его принято оставлять нетронутым (???).

С большой вероятностью в поставляемом файле скрипта под знаками комментариев содержались примеры, по которым можно было произвести правильную настройку (раскомментировав и/или подкорректировав их). Было важно задать правильный путь к `setserial` и правильное название устройства (последовательного порта -- прим. перев.). Запустив (от имени суперпользователя) этот файл, можно было проверить правильность выполнения скрипта -- необязательно было проводить перезагрузку (и не одну) всей системы целиком, занимающую сравнительно долгое время.

С появлением версии 2.15 все стало более сложно, как может показаться, поскольку файл /etc/init.d/setserial или другой с похожим названием, запускающий setserial при старте, не подлежит правке - для настройки есть отдельный файл: см. раздел Настройка с использованием файла /etc/serial.conf или др.

Строка в скрипте, запускавшая setserial, могла быть такой (для ttyS3):

> ``

>     /sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test

или -- при задании автоматического определения типа UART и номера IRQ -- такой:

> ``

>     /sbin/setserial  /dev/ttyS3 auto_irq skip_test autoconfig

Такая строка задавалась для каждого имеющегося в системе последовательного порта -- по одной на порт.

### Настройка с использованием файла /etc/serial.conf или др.

До версии 2.15 (1999) настройка setserial осуществлялась ручной правкой скрипта оболочки, который осуществлял его запуск при загрузке. См. Правка скрипта (для setserial версий ниже 2.15). Простой и понятный способ, который зачем-то заменили на излишне усложненный. Сейчас скрипт и файл настройки представляют собой два различных файла вместо одного. Данный скрипт не изменяется, а требуемые для работы данные получает из файла настройки `/etc/serial.conf` (или `/var/lib/setserial/autoserial.conf`).

Правка serial.conf (файл настройки может называться по-другому) может и не потребоваться, поскольку после запуска setserial из командной строки в serial.conf могут автоматически вноситься соответствующие изменения. Так было сделано для того, чтобы не надо было вручную править какой-либо файл для задания (или изменения) настроек, используемых setserial.

При выключении ПК скрипт, запускавший setserial при загрузке, вновь запускается: посредством setserial он определяет текущие настройки порта и сохраняет их в файл настройки последовательных портов (`serial.conf`). Таким образом, все изменения, сделанные setserial, вносятся в файл настройки не сразу же, а только при нормальном завершении работы.

Надо сказать о проблемах, которые могут случиться в этой ситуации. Если работа системы не будет завершена нормально (кто-то вырубил электричество и т.п.), то изменения сохранены не будут. Если Вы экспериментировали с настройками setserial и забыли вернуть их в первоначальное состояние перед выключением (или ошиблись при восстановлении), то будут сохранены "экспериментальные" настройки. Хуже всего, если Вы не знаете, какие настройки произвели -- о том, что произойдет, остается только догадываться :) В Debian (вероятно, и в других дистрибутивах) есть опция "AUTOSAVE-ONCE", при задании которой сохранение настроек происходит только раз, после первогоих изменения setserial.

При заданной опции "###AUTOSAVE###" все настройки, прописанные вручную в serial.conf, будут потеряны при выключении, потому что setserial заменит их на свои. Избежать этого можно, если из первой строчки serial.conf убрать "###AUTOSAVE###". В Debian удаление "###AUTOSAVE###" из serial.conf происходит автоматически при первом выключении компьютера после установки системы. Была введена специальная опция "AUTOSAVE-ONCE", указывающая на сохранение настроек только во время первого (после установки или обновления setserial) завершения работы системы.

Запуск setserial во время загрузки системы происходит из скрипта (в соответствии с файлом настроек) /etc/init.d/setserial (Debian) или /etc/init.d/serial (Redhat). В Redhat 6.0 (setserial версии 2.15) для того, чтобы обеспечить запуск setserial при загрузке, надо было переписать файл /usr/doc/setserial-2.15/rc.serial в /etc/init.d/.

Чтобы отключить порт, задайте "uart none" в параметрах `setserial`. Данная настройка не сохраняется. В /etc/serial.conf указываются те же параметры, что и в командной строке после "setserial" (?). Если убрать автосохранение, ничто не мешает ручной правке /etc/serial.conf.

Чтобы принудительно сохранить в файл (serial.conf) текущие настройки setserial без завершения работы, выполните `/etc/init.d/{set}serial stop`. На работу портов данная команда не повлияет.

Иногда случается, что в системе возможны оба способа настройки: и старый, и новый, но -- хотелось бы надеяться -- что во время загрузки используется только один из них :) В Debian файлы, относящиеся к старому способу, помечены "...pre-2.15".

### IRQ

По умолчанию ttyS0 и ttyS2 делят IRQ4, а ttyS1 и ttyS3 -- IRQ3. Для шины PCI разделение прерываний является стандартной функцией, тогда как для шины ISA оно допустимо только при следующих условиях: 1. ядро версии 2.2 или выше, 2. ядро скомпилировано с включенной поддержкой разделения прерываний, 3. последовательный порт поддерживает разделение прерываний (все условия обязательны -- поясн. перев.). См. Разделение прерываний, ядра 2.2+. Если у Вас только два последовательных порта, ttyS0 и ttyS1, то беспокоиться не о чем: нет портов -- нет конфликтов разделения прерываний.

При добавлении в систему, уже имеющую ttyS0 и ttyS1, внутреннего модема (не поддерживающего plug-and-play) надо будет постараться найти неиспользуемое IRQ и установить его последовательному порту (или модему), а затем посредством setserial сообщить драйверу. Если IRQ5 не занято звуковой картой, то можно задействовать его.

### Лэптопы: PCMCIA

Про настройку последовательных портов лэптопов/ноутбуков можно прочитать в PCMCIA-HOWTO. Для последовательных портов, расположенных на материнской плате ноутбука, setserial используется также, как и в случае настольного компьютера. Но для карт PCMCIA (в том числе модемных) ситуация обстоит немного иначе. При конфигурировании PCMCIA-устройств setserial должна запускаться автоматически. Самостоятельный запуск (из скрипта или указанием в /etc/serial.conf) может привести к проблемам (из-за различия в настройках). В serial.conf при опции autosave не должно сохраняться что-либо, относящееся к картам PCMCIA (как это было в Debian до 2.15-7) (?). Естественно, никто не мешает воспользоваться setserial для получения информации о настройках драйвера для PCMCIA-устройств.

## 10.2 isapnp

`isapnp` -- программа, для настройки устройств Plug-and-Play (PnP) на шине ISA, в том числе внутренних модемов. Она входит в пакет "isapnptools", включающий также программу "pnpdump", которая находит все PnP-устройства на шине ISA и отображает имеющиеся настройки в формате, используемом в файле /etc/isapnp.conf. При заданной опции --dumpregs она показывает настоящие адрес IO и номер IRQ последовательного порта модема. Команду isapnp можно прописать в стартовом файле, чтобы при каждой загрузке компьютера производился ее запуск и настройка PnP-устройств ISA. Поддержка PnP BIOS'ом не требуется. См. Plug-and-Play-HOWTO.

## 10.3 wvdialconf

Программа `wvdialconf` посредством диалога с пользователем создает файл настроек для программы wvdial. Она сама пытается определить, к какому последовательному порту (ttyS?) подключен модем. `wvdial` предназначена для установки связи по протоколу PPP с провайдером (ISP). Ее можно использовать для нескольких модемов. "Подходящая" для модема строка инициализации предлагается автоматически, но не всегда правильно. Никаких опций при запуске программы задавать не требуется -- надо лишь указать имя файла, в который будет записана строка инициализации (и другие данные). Например: wvdialconf my_config_file_name.

Следующий Предыдущий Содержание