SerialLogin: различия между версиями

Материал из ALT Linux Wiki
м (Typo fixed)
м (+initrd; +quiet)
 
(не показаны 33 промежуточные версии 7 участников)
Строка 5: Строка 5:
Напомню, что последовательные порты в Linux именуются в виде файлов {{path|/dev/ttyS*}} (на месте звёздочки может быть любой номер порта, начиная с нуля). Иногда, если используются адаптеры COM2USB, порты могут именоваться {{path|/dev/ttyUSB*}} (тоже начиная с нуля).
Напомню, что последовательные порты в Linux именуются в виде файлов {{path|/dev/ttyS*}} (на месте звёздочки может быть любой номер порта, начиная с нуля). Иногда, если используются адаптеры COM2USB, порты могут именоваться {{path|/dev/ttyUSB*}} (тоже начиная с нуля).


Для настройки входа через последовательный порт вам надо выполнить два обязательных шага и, возможно, один необязательный:
Задача состоит из четырёх этапов, каждый из которых может быть необязательным, в зависимости от конечной цели.
# Настройка перенаправления консоли в BIOS. У десктопных материнских плат, как правило, отсутствует. Позволяет видеть процесс загрузки BIOS и управлять им.
# Настройка загрузчика. Позволяет видеть сообщения загрузчика и управлять им.
# Настройка ядра. Позволяет видеть сообщения ядра в процессе загрузки (включая kernel panic).
# Настройка getty. Позволяет получить доступ к загруженной ОС.


== Установка mgetty ==
На всех этапах следует выбирать '''одинаковую скорость порта'''.
В ALT Linux вход по модемным линиям (здесь я их не рассматриваю) и последовательным портам обслуживает утилита '''mgetty'''. Для настройки входа вам нужно установить её. Сделайте это обычным методом (apt-get, aptitude, synaptic).


== /etc/inittab ==
== Терминалки ==
В репозиториях ALT доступны несколько пакетов программ для работы по COM-порту:
* {{pkg|cutecom}} (графический)
* {{pkg|minicom}} (текстовый полноэкранный)
текстовые строчные:
* {{pkg|picocom}}: {{cmd|picocom -b115200 /dev/ttyUSB0}}
* {{pkg|python-module-serial}}: {{cmd|miniterm.py --eol CRLF --raw /dev/ttyUSB0 115200}}
* {{pkg|python3-module-serial}}: {{cmd|pyserial-miniterm3 --eol CRLF --raw /dev/ttyUSB0 115200}}
* {{pkg|uucp}}: {{cmd|cu -l ttyS0 -s 115200}}
 
Также с последовательным портом возможно применение screen или tmux:
screen -fn /dev/ttyS0 115200
tmux new-session -d -s SoL /usr/bin/minicom -D /dev/ttyS0 -C /var/log/sol.log -8 -R utf8
 
== Удаленное подключение к Serial Console через IPMI ==
Для удаленного подключения к Serial Console через [[IPMI]] потребуется настроить управление сервером в BIOS или при помощи [[ipmitool]]; для подключения используется следующая команда:
<pre>$ ipmitool -I lanplus -U admin -f /home/admin/.ipmi_password' -H 10.32.4.178 sol activate</pre>
 
== Настройка BIOS ==
Как выше было написано, функция есть не в каждом BIOS. Практически всегда встречается в BIOS серверных материнских плат Intel. Следует найти соответствующий раздел и настроить.
 
== Настройка загрузчика ==
 
Может случиться так, что до входа в систему дело не дойдёт из-за неправильно настроенной загрузки. Существует способ взаимодействовать с загрузчиком по последовательному порту.
 
=== GRUB ===
...при этом во время загрузки GRUB 30 секунд будет выводить и на VGA-консоль и в последовательный порт сообщение "press any key". Откуда поступит первое нажатие клавиши, та консоль и будет считаться рабочей. Туда выведется стандартное меню GRUB, в котором обычно можно выбрать ядро или отредактировать параметры, передаваемые ядру.
 
==== GRUB2 ====
 
В файл {{path|/etc/sysconfig/grub2}} нужно записать:
<pre>
GRUB_TERMINAL_OUTPUT='serial console'
GRUB_TERMINAL_INPUT='serial console'
GRUB_SERIAL_COMMAND='serial --unit=0 --speed=115200'
GRUB_TIMEOUT=30
</pre>
и далее выполнить {{cmd|update-grub}} (если этого скрипта ещё не было, то {{cmd|grub-mkconfig -o /boot/grub/grub.cfg}}).
 
==== GRUB1 ====
 
В файл /boot/grub/menu.lst нужно записать:
<pre>
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=30 console serial
</pre>
 
=== LILO ===
 
В общие параметры загрузчика следует добавить
 
serial=0,115200n8
 
0 - номер порта com1, 1 - номер порта com2. К сожалению, это переключит весь ввод/вывод на RS-232, на мониторе сообщения загрузчика отображаться не будут. USB-serial с Lilo использовать невозможно.
 
=== SYSLINUX ===
 
В общую часть syslinux.cfg (isolinux.cfg, extlinux.cfg -- по надобности) добавляем:
 
serial 0 115200
 
== Настройка ядра ==
 
Загрузчик не влияет на то, как будет выводить сообщения ядро. Для него существует отдельный параметр <tt>console</tt>, который может иметь различное содержание в зависимости от конкретной ситуации. Добавляется в соответствии с используемым загрузчиком (само значение параметра <tt>console</tt> зависит, разумеется, не от загрузчика, а от ядра и железа).
 
Может пригодиться <tt>quiet</tt> для заглушения некритичных сообщений и некоторого ускорения загрузки.
 
=== GRUB2 ===
Пример изменения {{path|/etc/sysconfig/grub2}} (''без'' splash!):
<pre>
GRUB_CMDLINE_LINUX_DEFAULT='console=ttyS0,115200n8 panic=60'
</pre>
 
=== GRUB1 ===
Пример записи в {{path|/boot/grub/menu.lst}} с подсказками от Сергея Власова:
<pre>
title ALTLinux Sisyphus
        root (hd0,0)
        kernel /vmlinuz-smp ro root=/dev/hda2 console=uart,io,0x3f8,115200n8 fastboot
        initrd /initrd-smp.img
</pre>
 
=== LILO ===
Пример записи в {{path|/etc/lilo.conf}}:
<pre>
image="/boot/vmlinuz-2.6.32-ovz-el-alt145"
        initrd="/boot/initrd-2.6.32-ovz-el-alt145.img"
        label="2.6.32-ovz-el-alt145"
        addappend=" console=ttyS0,115200"
        root="UUID=c0de2323-72f0-4d8a-bcd0-6bc4815dfac1"
        read-only
        optional
</pre>
 
== Настройка initrd ==
=== make-initrd ===
Там же, где передали <tt>console=ttyS0,115200n8</tt>, [http://git.altlinux.org/gears/m/make-initrd.git?p=make-initrd.git;a=blob;f=make-initrd/Documentation/BootParameters.md;hb=HEAD добавляем] <tt>rdlog=console</tt>
 
== Настройка getty ==
 
=== Установка ===
Годятся mgetty и agetty. Ставятся из соответствующих пакетов. Для настройки входа вам нужно установить одну из этих утилит. Сделайте это обычным методом (apt-get, aptitude, synaptic).
 
=== /etc/inittab ===
Нужно поправить файл {{path|/etc/inittab}}, указать init-у запускать mgetty на нужных портах. Формат файла довольно прост и хорошо комментирован (в частности, есть пример и для mgetty). Подробности можно уточнить в inittab(5).
Нужно поправить файл {{path|/etc/inittab}}, указать init-у запускать mgetty на нужных портах. Формат файла довольно прост и хорошо комментирован (в частности, есть пример и для mgetty). Подробности можно уточнить в inittab(5).


Например, это может выглядеть так:
Например, это может выглядеть так (mgetty):
<pre>
<pre>
~ # grep -iE '^[^#].*mgetty' /etc/inittab
~ # grep -iE '^[^#].*mgetty' /etc/inittab
T3:23:respawn:/sbin/mgetty -r -s 9600 -x 0 ttyS0
T3:23:respawn:/sbin/mgetty -r -s 115200 -x 0 ttyS0
T4:23:respawn:/sbin/mgetty -r -s 9600 -x 0 ttyS1
T4:23:respawn:/sbin/mgetty -r -s 115200 -x 0 ttyS1
</pre>
</pre>


Эти параметры (с которыми init запустит mgetty для первых двух последовательных портов) означают, что что на портах /dev/ttyS[01] (mgetty сам умеет добавлять /dev/) ожидаются прямые (-r, то есть, с других компьютеров/терминалов, в противоположность модемным) соединения со скоростью 9600 бод (-s) и с уровнем отладочной информации равным нулю (-x). Изменения вступят в силу лишь после прочтения файла init-ом (в результате команды {{cmd|telinit q}} от суперпользователя или перезагрузки машины).
Эти параметры (с которыми init запустит mgetty для первых двух последовательных портов) означают, что на портах /dev/ttyS[01] (mgetty сам умеет добавлять /dev/) ожидаются прямые (-r, то есть, с других компьютеров/терминалов, в противоположность модемным) соединения со скоростью 115200 бит/с (-s) и с уровнем отладочной информации равным нулю (-x). Изменения вступят в силу лишь после прочтения файла init-ом (в результате команды {{cmd|telinit q}} от суперпользователя или перезагрузки машины).


Дополнительную краткую информацию по вызову mgetty можно почерпнуть из mgetty(8).
Дополнительную краткую информацию по вызову mgetty можно почерпнуть из mgetty(8).


== /etc/mgetty+sendfax/mgetty.config ==
agetty настраивается аналогично, но командная строка отличается:
 
T0:23:respawn:/sbin/agetty -L ttyS0 115200 vt100
 
=== /etc/mgetty+sendfax/mgetty.config ===
Это необязательный шаг. Всё поведение mgetty контролируется ключами командной строки, однако если вы захотите задать параметры в отдельном файле (и перенести туда все специфичные для портов параметры), то для этого есть файл {{path|/etc/mgetty+sendfax/mgetty.config}}. Здесь вы можете задать как параметры, общие для всех портов, так и индивидуальные параметры линий. Подробности (а так же множество другой информации по последовательному входу) можно уточнить в полном руководстве — {{cmd|info mgetty}}.
Это необязательный шаг. Всё поведение mgetty контролируется ключами командной строки, однако если вы захотите задать параметры в отдельном файле (и перенести туда все специфичные для портов параметры), то для этого есть файл {{path|/etc/mgetty+sendfax/mgetty.config}}. Здесь вы можете задать как параметры, общие для всех портов, так и индивидуальные параметры линий. Подробности (а так же множество другой информации по последовательному входу) можно уточнить в полном руководстве — {{cmd|info mgetty}}.


== Проверка ==
=== Проверка ===
Для проверки надо присоединить к только что настроенному порту кабель (COM2USB или DB-9 «мама-мама», для соединения с другим компьютером, либо другие кабеля, для другого оборудования), запустить терминальную программу ('''cu''', '''minicom''', '''cutecom'''), указать ей параметры соединения — порт (на машине откуда соединяемся) и скорость (указанную при запуске mgetty) и дать команду на соединение. В случае успеха на экран ничего не выводится — надо попробовать нажать несколько буквенно-цифовых (не функциональных) клавиш, чтобы mgetty распознал, что его зовут. Если всё хорошо — mgetty откликнется приглашением '''login:'''. Можно вводить имя пользователя и пароль, как обычно. Заметьте, что по умолчанию ALT Linux не пускает пользователя '''root''' через последовательные порты. Вы можете это изменить, поправив файл {{path|/etc/securetty}}.
Для проверки надо присоединить к только что настроенному порту кабель (COM2USB или DB-9 «мама-мама» для соединения с другим компьютером, либо другие кабели для другого оборудования), запустить [[#Терминалки|терминальную программу]], указать ей параметры соединения — порт (на машине, откуда соединяемся) и скорость (указанную при запуске mgetty) и дать команду на соединение. В случае успеха на экран ничего не выводится — надо попробовать нажать несколько буквенно-цифовых (не функциональных) клавиш, чтобы mgetty распознал, что его зовут. Если всё хорошо — mgetty откликнется приглашением '''login:'''. Можно вводить имя пользователя и пароль, как обычно. Заметьте, что по умолчанию ALT не пускает пользователя '''root''' через последовательные порты. Вы можете это изменить, поправив файл {{path|/etc/securetty}}.
 
=== systemd ===
Всё вышеизложенное касается настройки для классического '''[[sysvinit]]'''. В случае использования '''[[systemd]]''' достаточно дать от суперпользователя команду {{cmd|ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service}} (Команда {{cmd|systemctl enable getty@ttyS0}} по умолчанию не действует, т.к. нет отдельного service-файла). Аналогично для других консолей. Это запустит agetty, требуемый systemd, при загрузке. Заметьте, что файл {{path|/etc/securetty}} действует и тут. Параметры запуска getty можно посмотреть в {{path|/lib/systemd/system/getty@.service}}.
 
Дополнительное [http://0pointer.de/blog/projects/instances.html чтение].
 
{{attention|без {{cmd|systemctl disable ModemManager}} могут наблюдаться проблемы в работе COM-порта с подобными симптомами (mcst#4856):<pre>ModemManager: <warn>  (ttyS0): couldn't set serial port closing_wait to none: Invalid argument
ModemManager: <warn>  (ttyS0): serial port closing_wait was reset!</pre>}}
 
== Ссылки ==
* [http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ Remote Serial Console HOWTO]
* [http://git.altlinux.org/people/mike/packages/?p=installer-feature-serial-stage3.git installer-feature-serial-stage3]
* [http://elinux.org/Grabserial ещё один скриптик для работы с COM-портом] (отличается развитыми возможностями хронометража, найдено [https://unix.stackexchange.com/questions/104834/how-to-log-serial-data-with-time-stamp здесь])
* [[эльбрус/com|Последовательный порт на ВК "Эльбрус"]]


[[Категория:Admin]]
[[Категория:Admin]]
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}

Текущая версия от 01:26, 2 ноября 2023

Как настроить вход на машину через последовательный порт (Serial Login)

Для чего может понадобиться вход на Linux-машину через последовательный порт? Да мало ли для чего — например, если других способов связи нет, или для подключения к «безголовой» машине, конфигурация сети которой в общем случае неизвестна. В общем, бывает нужно.

Напомню, что последовательные порты в Linux именуются в виде файлов /dev/ttyS* (на месте звёздочки может быть любой номер порта, начиная с нуля). Иногда, если используются адаптеры COM2USB, порты могут именоваться /dev/ttyUSB* (тоже начиная с нуля).

Задача состоит из четырёх этапов, каждый из которых может быть необязательным, в зависимости от конечной цели.

  1. Настройка перенаправления консоли в BIOS. У десктопных материнских плат, как правило, отсутствует. Позволяет видеть процесс загрузки BIOS и управлять им.
  2. Настройка загрузчика. Позволяет видеть сообщения загрузчика и управлять им.
  3. Настройка ядра. Позволяет видеть сообщения ядра в процессе загрузки (включая kernel panic).
  4. Настройка getty. Позволяет получить доступ к загруженной ОС.

На всех этапах следует выбирать одинаковую скорость порта.

Терминалки

В репозиториях ALT доступны несколько пакетов программ для работы по COM-порту:

  • cutecom (графический)
  • minicom (текстовый полноэкранный)

текстовые строчные:

  • picocom: picocom -b115200 /dev/ttyUSB0
  • python-module-serial: miniterm.py --eol CRLF --raw /dev/ttyUSB0 115200
  • python3-module-serial: pyserial-miniterm3 --eol CRLF --raw /dev/ttyUSB0 115200
  • uucp: cu -l ttyS0 -s 115200

Также с последовательным портом возможно применение screen или tmux:

screen -fn /dev/ttyS0 115200
tmux new-session -d -s SoL /usr/bin/minicom -D /dev/ttyS0 -C /var/log/sol.log -8 -R utf8

Удаленное подключение к Serial Console через IPMI

Для удаленного подключения к Serial Console через IPMI потребуется настроить управление сервером в BIOS или при помощи ipmitool; для подключения используется следующая команда:

$ ipmitool -I lanplus -U admin -f /home/admin/.ipmi_password' -H 10.32.4.178 sol activate

Настройка BIOS

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

Настройка загрузчика

Может случиться так, что до входа в систему дело не дойдёт из-за неправильно настроенной загрузки. Существует способ взаимодействовать с загрузчиком по последовательному порту.

GRUB

...при этом во время загрузки GRUB 30 секунд будет выводить и на VGA-консоль и в последовательный порт сообщение "press any key". Откуда поступит первое нажатие клавиши, та консоль и будет считаться рабочей. Туда выведется стандартное меню GRUB, в котором обычно можно выбрать ядро или отредактировать параметры, передаваемые ядру.

GRUB2

В файл /etc/sysconfig/grub2 нужно записать:

GRUB_TERMINAL_OUTPUT='serial console'
GRUB_TERMINAL_INPUT='serial console'
GRUB_SERIAL_COMMAND='serial --unit=0 --speed=115200'
GRUB_TIMEOUT=30

и далее выполнить update-grub (если этого скрипта ещё не было, то grub-mkconfig -o /boot/grub/grub.cfg).

GRUB1

В файл /boot/grub/menu.lst нужно записать:

serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=30 console serial

LILO

В общие параметры загрузчика следует добавить

serial=0,115200n8

0 - номер порта com1, 1 - номер порта com2. К сожалению, это переключит весь ввод/вывод на RS-232, на мониторе сообщения загрузчика отображаться не будут. USB-serial с Lilo использовать невозможно.

SYSLINUX

В общую часть syslinux.cfg (isolinux.cfg, extlinux.cfg -- по надобности) добавляем:

serial 0 115200

Настройка ядра

Загрузчик не влияет на то, как будет выводить сообщения ядро. Для него существует отдельный параметр console, который может иметь различное содержание в зависимости от конкретной ситуации. Добавляется в соответствии с используемым загрузчиком (само значение параметра console зависит, разумеется, не от загрузчика, а от ядра и железа).

Может пригодиться quiet для заглушения некритичных сообщений и некоторого ускорения загрузки.

GRUB2

Пример изменения /etc/sysconfig/grub2 (без splash!):

GRUB_CMDLINE_LINUX_DEFAULT='console=ttyS0,115200n8 panic=60'

GRUB1

Пример записи в /boot/grub/menu.lst с подсказками от Сергея Власова:

title ALTLinux Sisyphus
        root (hd0,0)
        kernel /vmlinuz-smp ro root=/dev/hda2 console=uart,io,0x3f8,115200n8 fastboot
        initrd /initrd-smp.img

LILO

Пример записи в /etc/lilo.conf:

image="/boot/vmlinuz-2.6.32-ovz-el-alt145"
        initrd="/boot/initrd-2.6.32-ovz-el-alt145.img"
        label="2.6.32-ovz-el-alt145"
        addappend=" console=ttyS0,115200"
        root="UUID=c0de2323-72f0-4d8a-bcd0-6bc4815dfac1"
        read-only
        optional

Настройка initrd

make-initrd

Там же, где передали console=ttyS0,115200n8, добавляем rdlog=console

Настройка getty

Установка

Годятся mgetty и agetty. Ставятся из соответствующих пакетов. Для настройки входа вам нужно установить одну из этих утилит. Сделайте это обычным методом (apt-get, aptitude, synaptic).

/etc/inittab

Нужно поправить файл /etc/inittab, указать init-у запускать mgetty на нужных портах. Формат файла довольно прост и хорошо комментирован (в частности, есть пример и для mgetty). Подробности можно уточнить в inittab(5).

Например, это может выглядеть так (mgetty):

~ # grep -iE '^[^#].*mgetty' /etc/inittab
T3:23:respawn:/sbin/mgetty -r -s 115200 -x 0 ttyS0
T4:23:respawn:/sbin/mgetty -r -s 115200 -x 0 ttyS1

Эти параметры (с которыми init запустит mgetty для первых двух последовательных портов) означают, что на портах /dev/ttyS[01] (mgetty сам умеет добавлять /dev/) ожидаются прямые (-r, то есть, с других компьютеров/терминалов, в противоположность модемным) соединения со скоростью 115200 бит/с (-s) и с уровнем отладочной информации равным нулю (-x). Изменения вступят в силу лишь после прочтения файла init-ом (в результате команды telinit q от суперпользователя или перезагрузки машины).

Дополнительную краткую информацию по вызову mgetty можно почерпнуть из mgetty(8).

agetty настраивается аналогично, но командная строка отличается:

T0:23:respawn:/sbin/agetty -L ttyS0 115200 vt100

/etc/mgetty+sendfax/mgetty.config

Это необязательный шаг. Всё поведение mgetty контролируется ключами командной строки, однако если вы захотите задать параметры в отдельном файле (и перенести туда все специфичные для портов параметры), то для этого есть файл /etc/mgetty+sendfax/mgetty.config. Здесь вы можете задать как параметры, общие для всех портов, так и индивидуальные параметры линий. Подробности (а так же множество другой информации по последовательному входу) можно уточнить в полном руководстве — info mgetty.

Проверка

Для проверки надо присоединить к только что настроенному порту кабель (COM2USB или DB-9 «мама-мама» для соединения с другим компьютером, либо другие кабели для другого оборудования), запустить терминальную программу, указать ей параметры соединения — порт (на машине, откуда соединяемся) и скорость (указанную при запуске mgetty) и дать команду на соединение. В случае успеха на экран ничего не выводится — надо попробовать нажать несколько буквенно-цифовых (не функциональных) клавиш, чтобы mgetty распознал, что его зовут. Если всё хорошо — mgetty откликнется приглашением login:. Можно вводить имя пользователя и пароль, как обычно. Заметьте, что по умолчанию ALT не пускает пользователя root через последовательные порты. Вы можете это изменить, поправив файл /etc/securetty.

systemd

Всё вышеизложенное касается настройки для классического sysvinit. В случае использования systemd достаточно дать от суперпользователя команду ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service (Команда systemctl enable getty@ttyS0 по умолчанию не действует, т.к. нет отдельного service-файла). Аналогично для других консолей. Это запустит agetty, требуемый systemd, при загрузке. Заметьте, что файл /etc/securetty действует и тут. Параметры запуска getty можно посмотреть в /lib/systemd/system/getty@.service.

Дополнительное чтение.

Внимание! без systemctl disable ModemManager могут наблюдаться проблемы в работе COM-порта с подобными симптомами (mcst#4856):
ModemManager: <warn>  (ttyS0): couldn't set serial port closing_wait to none: Invalid argument
ModemManager: <warn>  (ttyS0): serial port closing_wait was reset!


Ссылки