有 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
运行时没有添加完整的真实硬件控制台,但在某些情况下会更好:使用“netconsole”。它是以太网中通过 udp 进行的内核控制台仿真,单向,仅用于收集内核日志。不再需要 usb-uart 适配器或零调制解调器电缆或价格过高的 com-over-ethernet“控制台服务器”设备。并且不再传输(您可能希望使用经典内核控制台来发送魔法 SysRq,但不适用于 netconsole)。
文档:https://www.kernel.org/doc/Documentation/networking/netconsole.txt
例子:
应在内核配置中启用 Netconsole(或将其构建为模块)才能使其正常工作。(有时可以构建用于运行内核的 netconsole 模块,并将其 modprobe 到 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