
有 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“控制台伺服器”裝置.並且不再傳輸(您可能想使用經典的核心控制台來發送魔法系統請求,但不適用於 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