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

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


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


На всех этапах следует выбирать одинаковую скорость порта.
На всех этапах следует выбирать '''одинаковую скорость порта'''.
 
== Терминалки ==
В репозиториях 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. Практически всегда встречается в BIOS серверных материнских плат Intel. Следует найти соответствующий раздел и настроить.
Как выше было написано, функция есть не в каждом BIOS. Практически всегда встречается в BIOS серверных материнских плат Intel. Следует найти соответствующий раздел и настроить.


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


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


Может случиться так, что до входа в систему дело не дойдёт из-за неправильно настроенной загрузки. Существует способ взаимодействовать с загрузчиком GRUB по последовательному порту. Для этого в файл /boot/grub/menu.lst (или /boot/grub/grub.conf, смотря как у вас) нужно записать:
=== 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>
<pre>
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=30 console serial
terminal --timeout=30 console serial
</pre>
</pre>
При этом во время загрузки GRUB 30 секунд будет выводить и на VGA-консоль и в последовательный порт сообщение "press any key". Откуда поступит первое нажатие клавиши, та консоль и будет считаться рабочей. Туда выведется стандартное меню GRUB, в котором обычно можно выбрать ядро или отредактировать параметры, передаваемые ядру.


=== Lilo ===
=== LILO ===


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


0 - номер порта com1, 1 - номер порта com2. К сожалению, это переключит весь ввод/вывод на RS-232, на мониторе сообщения загрузчика отображаться не будут. USB-serial с Lilo использовать невозможно.
0 - номер порта com1, 1 - номер порта com2. К сожалению, это переключит весь ввод/вывод на RS-232, на мониторе сообщения загрузчика отображаться не будут. USB-serial с Lilo использовать невозможно.
=== SYSLINUX ===
В общую часть syslinux.cfg (isolinux.cfg, extlinux.cfg -- по надобности) добавляем:
serial 0 115200


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


Загрузчик не влияет на то, как будет выводить сообщения ядро. Для него существует отдельный параметр console, который может иметь различное содержание в зависимости от конкретной ситуации. Добавляется в соответствии с используемым загрузчиком.
Загрузчик не влияет на то, как будет выводить сообщения ядро. Для него существует отдельный параметр <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>


Пример для Grub (с подсказками от Сергеея Власова):
=== GRUB1 ===
Пример записи в {{path|/boot/grub/menu.lst}} с подсказками от Сергея Власова:
<pre>
<pre>
title ALTLinux Sisyphus
title ALTLinux Sisyphus
Строка 46: Строка 95:
</pre>
</pre>


Пример для Lilo:
=== LILO ===
Пример записи в {{path|/etc/lilo.conf}}:
<pre>
<pre>
image="/boot/vmlinuz-2.6.32-ovz-el-alt145"
image="/boot/vmlinuz-2.6.32-ovz-el-alt145"
Строка 57: Строка 107:
</pre>
</pre>


== настройка getty ==
== Настройка 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>


Годятся mgetty и agetty. Ставятся из соответствующих пакетов.
== Настройка getty ==


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


=== /etc/inittab ===
=== /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
Строка 74: Строка 126:
</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).
agetty настраивается аналогично, но командная строка отличается:
T0:23:respawn:/sbin/agetty -L ttyS0 115200 vt100


=== /etc/mgetty+sendfax/mgetty.config ===
=== /etc/mgetty+sendfax/mgetty.config ===
Строка 82: Строка 138:


=== Проверка ===
=== Проверка ===
Для проверки надо присоединить к только что настроенному порту кабель (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 ===
=== systemd ===
Всё вышеизложенное касается настройки для классического '''SySV-init'''. В случае использования '''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}}.
Всё вышеизложенное касается настройки для классического '''[[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 чтение].
Дополнительное [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}}}}
{{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!


Ссылки