
Существует опция загрузки ядра 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