14.1 Getty (используется в/etc/inittab)
Введение в Getty
Чтобы запустить процесс входа в систему через последовательный порт (и подключенный к нему терминал) при запуске компьютера (или переключении уровней запуска), в файл/etc/inittab должна быть вставлена команда getty. Запуск getty из командной строки может вызвать проблемы (см. Если getty запускается из командной строки: программы останавливаются, чтобы понять почему). Getty получает TTY (терминал) собирается. Каждому терминалу нужна своя команда getty. В каждом файле/etc/inittab также есть хотя бы одна команда getty для консоли. Найдите это и поместите команды getty для реальных терминалов рядом с ним. Этот файл может содержать примеры строк getty для текстовых терминалов, которые закомментированы, поэтому все, что вам нужно сделать, это раскомментировать их (удалить начальный #) и изменить несколько аргументов.
Допустимые аргументы зависят от того, какой getty вы используете:
Для getts с прямым подключением лучше всего подходят два:
- agetty (иногда его называют getty): очень легко настроить. Нет конфигурационных файлов. Смотри agetty
- getty (часть getty_ps)
Два gettys лучше всего подходят для коммутируемых модемов (избегайте для напрямую подключенных терминалов):
- mgetty: лучший для модемов; работает и для терминалов, но уступает
- uugetty: только для модемов; часть пакета getty_ps
Простые gettys для использования, если вы не используете настоящий текстовый терминал. Большинство пользователей Linux используют один из них на своем мониторе:
- mingetty
- fbgetty
- fgetty
- rungetty
Ваш дистрибутив Linux может поставляться с ps_getty или agetty для текстовых терминалов. Некоторые дистрибутивы не предоставляют ни того, ни другого. К сожалению, они часто просто называют его «getty», поэтому вам может понадобиться определить, какой из них у вас есть, так как аргументы, которые вы указали после него в/etc/inittab, отличаются. Debian использует agetty (в пакете util-linux). RedHat и Fedora использовали ps_getty, который находится по адресу: ps_getty
В качестве последнего средства, чтобы попытаться определить, какой у вас getty, вы можете проверить его исполняемый код (обычно в/sbin). ps_getty имеет/etc/gettydefs, встроенный в этот код. Чтобы найти его, перейдите в/sbin и введите:
strings getty | grep getty
Если getty на самом деле agetty, то приведенное выше ничего не даст. Однако, если вы наберете agetty:
getty -h
должны отобразить опции [-hiLmw].
Если у вас нет нужного вам getty, проверьте другие дистрибутивы и программу alien для конвертации пакетов RPM и Debian. Исходный код может быть загружен с Getty Software.
Если вы не используете линии управления модемом (например, если вы используете только минимальное количество из 3 проводников: передача, прием и общая сигнальная земля), вы должны сообщить об этом getty, используя флаг «local». Формат этого зависит от того, какой getty вы используете.
Getty выходит после входа в систему (и может возродиться)
После входа в систему вы заметите (используя «top», «ps -ax» или «ptree»), что процесс getty больше не выполняется. Что с ним случилось? Почему getty перезапускается снова, если ваша оболочка убита? Вот почему
После того как вы введете свое имя пользователя, getty берет его и вызывает программу входа в систему, сообщая вам ваше имя пользователя. Процесс getty заменяется процессом входа в систему. Процесс входа запрашивает ваш пароль, проверяет его и запускает любой процесс, указанный в вашем файле паролей. Этот процесс часто является оболочкой bash. Если это так, bash запускается и заменяет процесс входа в систему. Обратите внимание, что один процесс заменяет другой, и что процесс оболочки bash изначально запускался как процесс getty. Последствия этого будут объяснены ниже.
Теперь в файле/etc/inittab getty должен возродиться (перезапуститься), если его убили. Так говорится в строке, которая вызывает getty. Но если оболочка bash (или процесс входа в систему) убита, getty респаунится (перезапускается). Зачем? Ну, и процесс входа в систему и bash являются заменой для getty и наследовать
* Указатель с текстовым терминалом
сигнальные соединения устанавливаются их предшественниками. Фактически, если вы наблюдаете детали, вы заметите, что процесс замены будет иметь тот же идентификатор процесса, что и исходный процесс. Таким образом, bash является замаскированным видом с тем же идентификатором процесса. Если bash убит, это как если бы getty был убит (хотя getty больше не работает). Это приводит к возрождению getty.
При выходе из системы все процессы на этом последовательном порте уничтожаются, включая оболочку bash. Это также может произойти (если включено), если сигнал зависания отправляется на последовательный порт при падении напряжения DCD модемом. Выйти или выйти из DCD приведет к возрождению getty. Можно заставить getty возродиться, вручную убив bash (или войдя в систему), либо нажав клавишу k и т. Д., Находясь в «top» или с помощью команды «kill». Скорее всего, вам придется убить его с помощью сигнала 9 (который нельзя игнорировать).
Если getty запускается из командной строки: программы останавливаются
Обычно вы должны запускать getty из /etc/inittab , а не из командной строки, иначе некоторые программы, запущенные на терминале, могут быть неожиданно приостановлены (остановлены). Вот почему (перейдите к следующему разделу, если почему не важно для вас). Если вы запустите getty, скажем, для ttyS1 из командной строки другого терминала, скажем, tty1, то у него будет tty1 в качестве «управляющего терминала», хотя фактическим терминалом, на котором он работает, является ttyS1. Таким образом, он имеет неправильный управляющий терминал. Но если он запускается внутри файла inittab, то в качестве управляющего терминала он будет иметь ttyS1 (правильно).
Несмотря на то, что управляющий терминал неверен, вход в ttyS1 работает нормально (поскольку вы указали ttyS1 в качестве аргумента для getty). Стандартный вход и выход устанавливаются на ttyS1, хотя управляющий терминал остается на tty11. Другие программы, запущенные на ttyS1, могут наследовать этот стандартный ввод/вывод (который подключен к ttyS1), и все в порядке. Но некоторые программы могут ошибаться, пытаясь прочитать данные со своего управляющего терминала (tty1), что неправильно. Теперь tty1 может подумать, что эти программы выполняются в фоновом режиме с помощью tty1, поэтому попытка чтения из tty1 (это должно было быть ttyS1) приводит к остановке процесса, который пытался прочитать. (Фоновый процесс не может читать с управляющего терминала.). На экране может появиться сообщение наподобие « [1] + Остановлено ». В этот момент вы застряли, поскольку не можете взаимодействовать с процессом, который пытается связаться с вами через неправильный терминал. Конечно, чтобы уйти от этого, вы можете перейти к другому терминалу и убить процесс и т. Д.
agetty (может быть назван getty)
Пример строки в/etc/inittab:
S1: 23: респаун:/sbin/getty -L 19200 ttyS1 vt102
S1 от ttyS1. 23 означает, что getty запускается при входе на уровни запуска 2 или 3. respawn означает, что если getty (или процесс, который заменил его, такой как bash) будет убит, getty автоматически запустится (респаун) снова./sbin/getty – это команда getty. -L означает Локальный (игнорировать сигналы управления модемом). -h (не показано в этом примере) включает аппаратное управление потоком (аналогично stty crtscts). 19200 – это скорость передачи данных. ttyS1 означает/dev/ttyS1 (COM2 в MS-DOS). vt102 – это тип терминала, и этот getty установит для переменной среды TERM это значение. Там нет файлов конфигурации. Введите “init q” в командной строке после редактирования getty, и вы должны увидеть приглашение для входа в систему.
Автоопределение проблем паритета в Agetty
Программа agetty попытается автоматически определить четность, установленную внутри терминала (в том числе без четности). Он не поддерживает 8-битные байты данных плюс 1-битная четность. Смотрите 8-битные байты данных (плюс четность). Если вы используете stty для установки четности, agetty автоматически сбросит его, так как изначально он хочет, чтобы бит четности проходил так, как если бы это был бит данных. Это потому, что ему нужно получить последний бит (возможно, бит четности) при вводе имени входа, чтобы он мог автоматически определять четность. Таким образом, если вы используете паритет, включите его только внутри текстового терминала и дайте agetty автоматически обнаружить его и установить на компьютере. Если ваш терминал поддерживает полученную четность, запрос на вход в систему будет выглядеть искаженным, пока вы не введете что-то, чтобы getty могла обнаружить
четности. Неправильная подсказка удержит посетителей и т. Д. От попыток войти в систему. Это может быть именно то, что вы хотите.
Иногда возникает проблема с автоматическим определением четности. Это происходит потому, что после того, как вы сначала ввели свое имя для входа, agetty запускает программу входа, чтобы завершить вход в систему. К сожалению, программа входа в систему не может определить четность, поэтому, если программе getty не удалось определить четность, то логин не сможет определить это тоже. Если первая попытка входа в систему не удалась, вход в систему позволит вам повторить попытку и т. Д. (Все с неправильной четностью). В конце концов, после нескольких неудачных попыток входа в систему (или после истечения времени ожидания) agetty снова запустится и начнёт повторять последовательности входа снова. После того, как getty снова запустится, он сможет определить паритет со второй попытки, поэтому все может работать нормально.
При неправильной четности программа входа не может правильно прочитать введенный вами текст, и вы не можете войти в систему. Если ваш терминал поддерживает полученную четность, вы по-прежнему будете видеть искаженный экран. Если getty не может определить четность, файл/etc/issue обычно выводится на экран непосредственно перед запросом, поэтому на экране могут появиться более искаженные слова.
Почему agetty не может определить четность по первой напечатанной букве? Вот пример: предположим, что он обнаруживает 8-битный байт со своим битом четности 0 (бит старшего разряда) и с нечетным числом 1-бит. Что это за соотношение? Ну, нечетное число 1 бит означает, что это нечетная четность.Но это также может быть 8-битный символ без четности. Пока нет способа определить, какой именно. Но пока мы исключили возможность даже паритета. Таким образом, обнаружение паритета происходит в процессе устранения.
Если следующий набранный байт аналогичен первому, а также исключает возможность четности, определить четность все равно невозможно. Эта ситуация может продолжаться бесконечно, и в редких случаях вход в систему будет невозможен, пока вы не измените свое имя для входа. Если agetty находит бит четности 1, он будет считать, что это бит четности, а не старший бит 8-битного символа. Таким образом, предполагается, что вы не используете метасимволы (набор старших битов) в своем имени пользователя (то есть, что ваше имя находится в ASCII).
Попасть в «цикл входа в систему» можно разными способами. Предположим, вы вводите только одну или две буквы для своего имени для входа, а затем нажимаете клавишу возврата. Если этих букв недостаточно для определения четности, то вход в систему выполняется до обнаружения четности. Иногда эта проблема возникает, если терминал не включен и/или не подключен при первом запуске agetty.
Если вы застряли в этом «цикле входа в систему», выходом из этого является несколько раз нажать клавишу возврата, пока вы не получите приглашение входа в систему getty. Другой способ – просто подождать минуту или около того для тайм-аута. Затем программа getty выведет на экран приглашение для входа в систему getty, и вы можете попытаться снова войти в систему.
8-битные байты данных (плюс четность)
К сожалению, agetty не может обнаружить это соотношение. По состоянию на конец 1999 года он не имеет возможности отключить автоматическое определение четности и, таким образом, обнаружит неправильную четность. В результате процесс входа в систему будет искажен, а четность будет установлена неправильно. Таким образом, кажется невозможным использовать 8-битные байты данных с четностью.
getty (часть getty_ps)
(В основном это из старого Serial-HOWTO Грега Ханкинса).
Для этого getty нужно как поместить записи в файл конфигурации, так и добавить запись в/etc/inittab. Вот несколько примеров записей для вашего терминала, которые вы поместили в файл конфигурации/etc/gettydefs.
Обратите внимание, что DT38400, DT19200 и т. Д. Являются просто метками и должны совпадать с тем, что вы используете в/etc/inittab.
Если вы хотите, вы можете сделать getty print интересными вещами в баннере входа. В моих примерах у меня напечатаны имя системы и серийная строка. Вы можете добавить другие вещи: [blockquote
shade = yes]
Когда вы закончите редактирование/etc/gettydefs, вы можете проверить правильность синтаксиса, выполнив:
Убедитесь, что нет другого конфигурационного файла getty или uugetty для последовательного порта, к которому подключен ваш терминал, например (/etc/default/ndomuu‹getty.ttySN или /etc/conf.ndomuu broadcastgetty.ttySN), так как это, вероятно, помешает запуску getty на терминале. Удалите такие конфликтующие файлы, если они выходят.
Отредактируйте ваш файл/etc/inittab, чтобы он запускал getty на последовательном порту (подставляя правильную информацию для вашей среды – порт, скорость и тип терминала по умолчанию):
На этом этапе вы должны увидеть приглашение для входа в систему на своем терминале. Возможно, вам придется нажать кнопку возврата, чтобы привлечь внимание терминала.
Mgetty
«М» обозначает модем. Эта программа в основном предназначена для модемов, и с середины 2000 года потребуется перекомпилировать ее, чтобы использовать ее для текстовых терминалов (если только вы не используете аппаратное управление потоком данных, а для этого обычно требуется кабель ручной работы). Документация по непосредственно подключенным терминалам приведена в разделе «Direct» руководства: mgetty.texi.
Посмотрите на последние строки /etc/mgetty/mgetty.config для примера настройки его для терминала. Если вы не скажете «toggle-dtr no», вам будет казаться, что у вас есть модем, и вы сбросите (отмените) вывод DTR на ПК в тщетной попытке перезагрузить несуществующий модем. В отличие от других gettys, mgetty не будет подключаться к терминалу, пока кто-нибудь не нажмет какой-либо ключ этого терминала, так что вы увидите? для терминала в верхней или PS, пока это не произойдет. Журналы в/var/log/mgetty/могут содержать несколько предупреждающих сообщений, которые применимы только к модемам, которые вы можете игнорировать.
Вот пример простой строки, которую вы помещаете в/etc/inittab: