Включить последовательную системную консоль во время выполнения

Включить последовательную системную консоль во время выполнения

Существует опция загрузки ядра Linux для включения системной консоли, например console=, console=ttyS0,115200илиconsole=ttyS0,115200n8 http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re01.html

После передачи этой опции ядро ​​Linux выведет все (или некоторые) сообщения ядра на консоль, что полезно для отладки.

Есть ли способ изменить системную консоль в Linux во время выполнения, без перезагрузки (с помощью некоторых специальных sysctls/ioctls/или в /procфайловых /sysсистемах)?

Первый случай: у меня не было console=возможности в текущей загрузке (проверено в /proc/cmdline), и я хочу включить печать dmesg на последовательный порт /dev/ttyS0 для отладки ситуации.

Второй случай: у меня были неправильные настройки, console=ttyS0,9600и я хочу изменить скорость без перезагрузки (удалить старые настройки консоли, добавить новую консоль с правильными настройками 115200 или просто изменить скорость).

(Где console=анализируется опция, где хранятся текущие настройки? /sys)/proc

решение1

Мне это помогло:

sudo agetty ttyUSB0 115200
sudo password:
ctrl+z
bg
disown

Если вы не используете disown, терминал будет закрыт, а также agetty прекратит работу (сигнал SIGHUP при закрытии терминала).

С другого ПК вы можете войти, используя screen /dev/ttyUSB0 115200. Будет показано приглашение на ввод логина/пароля.

решение2

Не полноценная настоящая аппаратная консоль, добавленная в runtime, но что-то лучшее для некоторых случаев: встречайте "netconsole". Это эмуляция консоли ядра по udp в сетях Ethernet, односторонняя, только для сбора журналов ядра. Больше никаких адаптеров usb-uart или нуль-модемных кабелей или дорогих com-over-ethernet"консольный сервер"устройства. И больше никаких передач (Вы можете использовать классическую консоль ядра для отправкимагия SysRq, но не с netconsole).

Документация:https://www.kernel.org/doc/Documentation/networking/netconsole.txt

Примеры:

Для работы Netconsole необходимо включить (или собрать как модуль) в конфигурации ядра. (Иногда можно собрать модуль netconsole для запуска ядра и модифицировать его в Linux без перезагрузки).

Для включения с помощью командной строки Linux (с перезагрузкой) добавьте:

netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]

Необходимо указать все: исходный udp-порт, исходный ipv4-адрес, имя сетевого интерфейса, например «eth0» (будет ли это работать с udev, переименовывающим eth0 во что-то, связанное с положением устройства?), целевой udp-порт и ipv4, а также целевой MAC-адрес в формате шести байт 00:13:32:20:r9:a5.

Приемник — nc -u -l $tgt_port.

Пример конфигурации времени выполнения из Arch wiki -https://wiki.archlinux.org/index.php/Netconsole

# set log level for kernel messages
dmesg -n 8

modprobe configfs
modprobe netconsole
mount none -t configfs /sys/kernel/config

# 'netconsole' dir is auto created if the module is loaded 
mkdir /sys/kernel/config/netconsole/target1
cd /sys/kernel/config/netconsole/target1

# set local IP address
echo 192.168.0.111 > local_ip
# set destination IP address
echo 192.168.0.17 > remote_ip
# set local network device name (find it trough ifconfig, examples: eth0, eno1, wlan0)
echo eno1 > dev_name
# find destination MAC address
arping -I $(cat dev_name) $(cat remote_ip) -f | grep -o ..:..:..:..:..:.. > remote_mac

echo 1 > enabled

Связанный контент