実行時にシリアルシステムコンソールを有効にする

実行時にシリアルシステムコンソールを有効にする

システムコンソールを有効にするLinuxカーネルブートオプションがあります。console=たとえば、console=ttyS0,115200またはconsole=ttyS0,115200n8 http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re01.html

このオプションを渡すと、Linux カーネルはすべての (または一部の) カーネル メッセージをコンソールに出力します。これはデバッグに役立ちます。

再起動せずに実行時に Linux のシステム コンソールを変更する方法はありますか (特別な sysctl/ioctl/またはファイルシステムを使用/proc) /sys?

最初のケース: 現在のブートにはオプションがなかったためconsole=(/proc/cmdline で確認済み)、状況をデバッグするために /dev/ttyS0 シリアル ポートへの dmesg 印刷を有効にしたいと考えています。

2 番目のケース: 設定が間違っていたためconsole=ttyS0,9600、再起動せずに速度を変更したい (古いコンソール設定を削除し、適切な 115200 設定の新しいコンソールを追加するか、速度を変更するだけです)。

(console=オプションはどこで解析され、現在の設定はどこに/sys保存/procされますか?)

答え1

これは私にとってはうまくいきました:

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

disown を使用しない場合、ターミナルは閉じられ、agetty も終了します (ターミナルを閉じるときに SIGHUP 信号が送信されます)。

別の PC からは を使用してログインできます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 モジュールをビルドし、再起動せずに Linux に modprobe できることがあります)。

Linux コマンドライン (再起動あり) で有効にするには、次を追加します。

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

すべて指定する必要があります: ソース UDP ポート、ソース IPv4 アドレス、「eth0」のようなネットワーク インターフェイス名 (eth0 を位置に関連した名前に変更する udev で動作しますか?)、ターゲット UDP ポートと IPv4、および 6 バイト 00:13:32:20:r9:a5 形式のターゲット MAC アドレス。

受信者は です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

関連情報