如何设置Linux串口终端为console
Linux串口终端已经设立成功,但是依然无法接收Kernel消息,必须要配置为console。本文阐述了如何配置串口终端为console的全部过程。
【说明】本文的所有命令和输出均在Ubuntu 20.04.4中实现
在上一篇文章 Win10 USB转串口连接Linux主机调试_qq_42000667的博客-CSDN博客CSDNhttps://mp.csdn.net/mp_blog/creation/editor/125585717里介绍了如何用USB转串口连接Win10 PC和Linux主机(或开发板),实现串口调试的功能。但是,做到文中的几步,还是只能设置一个普通的串口终端,虽然可以实现ssh等pts所拥有的全部功能,kernel消息还是无法在连接串口的Win10 Putty上显示。如运行如下Magic SysRq命令(见参考文献3):
$sudo sh -c 'echo c > /proc/sysrq-trigger'
可以让kernel奔溃,如果此时主console(通过Alt+Ctrl+F3切换)是tty3,可以看到kernel panic的stacktrace消息。
[ 7.952685] sysrq: Trigger a crash
[ 7.952850] Kernel panic - not syncing: sysrq triggered crash
[ 7.953098] CPU: 0 PID: 71 Comm: linuxrc Not tainted 5.19.0-rc2 #1
[ 7.953259] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
[ 7.953655] Call Trace:
[ 7.954133] <TASK>
[ 7.954332] dump_stack_lvl+0x34/0x44
[ 7.954651] panic+0x102/0x27b
[ 7.954756] ? _printk+0x53/0x6a
[ 7.954847] sysrq_handle_crash+0x11/0x20
[ 7.954953] __handle_sysrq.cold+0x43/0x11b
[ 7.955065] write_sysrq_trigger+0x1f/0x30
[ 7.955167] proc_reg_write+0x4c/0x90
[ 7.955267] vfs_write+0xb4/0x290
[ 7.955362] ksys_write+0x5a/0xd0
[ 7.955453] do_syscall_64+0x3b/0x90
[ 7.955553] entry_SYSCALL_64_after_hwframe+0x46/0xb0
[ 7.955773] RIP: 0033:0x4a8531
[ 7.955999] Code: e0 ff ff ff f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b3 0f 1f 80 00 00 00 00 8b 05 d2 26 1e 00 85 c0 75 16 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 57 c3 66 0f 1f 44 00 00 8
[ 7.956427] RSP: 002b:00007ffde8168508 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
[ 7.956625] RAX: ffffffffffffffda RBX: 000000000101a8a0 RCX: 00000000004a8531
[ 7.956787] RDX: 0000000000000002 RSI: 00000000010201e0 RDI: 0000000000000001
[ 7.956949] RBP: 0000000000000001 R08: fefefefefefefeff R09: fefefefefefeff62
[ 7.957113] R10: 00000000000001b6 R11: 0000000000000246 R12: 00000000010201e0
[ 7.957275] R13: 0000000000000002 R14: 00007ffde8168701 R15: 00007ffde8168578
[ 7.957467] </TASK>
[ 7.957806] Kernel Offset: 0x34a00000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[ 7.958215] ---[ end Kernel panic - not syncing: sysrq triggered crash ]---
但是,这个时候在连接串口的Putty上看不到任何消息。
所以,这个时候该串口的Putty连接,还只是一个普通终端,不是一个console. 那么它用于调试,在系统崩溃时依然无法抓到宝贵的kernel消息,也无法进入kdb等Debug环境。
我们先来看当前Linux主机的console是什么。可以通过运行如下命令:(见参考文献1)
$cat /sys/devices/virtual/tty/console/active
tty0
可以看出,输出是tty0,即连接Linux主机的显示器,键盘鼠标接口,通常有图形界面。可以Ctr+Alt+Fn(n=1-6)切换到纯文本console(command line) ttyn。
要想设置串口为console, 首先必须把serial port这个模块编译到Linux内核中(compiled in),而不能是以可加载module的形式。$make menuconfig 进入Kernel配置菜单,在Device driver ‣ Character devices ‣ Serial drivers ‣ 8250/16550 and compatible serial support ‣ Console on 8250/16550 and compatible serial port 选择built-in。(见参考文献2)
如果已经选择了则无需理会,如果原来不是built-in, 则需要修改配置,保存后重新编译内核,然后重启。
这时候我们需要修改Linux Kernel启动时command line参数,在里面加入console=ttyS1(我选择的是COM2,如果COM1选择ttyS0)。(见参考文献3)
$sudo vim /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
只需要修改GRUB_CMDLINE_LINUX_DEFAULT=后面的内容,只要是Linux正常启动都会使用该配置。加上console=ttyS1,115200 kgdboc=ttyS1,115200, 因为我要使用串口进行kgdb调试,所以加上了它,后面可以看到效果。不需要的同学无需添加和理会。kgdb支持需要内核配置,我可能后面会另写文章阐述。
修改后该行变成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet console=ttyS1,115200 kgdboc=ttyS1,115200 splash"
保存退出,再运行:(记住一定要,否则修改无效)
$sudo update-grub
$sudo reboot
这时候再查看当前console:
$ cat /sys/devices/virtual/tty/console/active
ttyS1
已经换成ttyS1(COM2)了。
此时,把串口连上,Win10 的Putty启动(如何配置见上一篇文章),在Linux主机上再调用getty。
$sudo /sbin/getty -L ttyS1 115200 vt102
这时候Putty端就会收到Logon提示信息,输入用户名,密码等信息,就进入了console交互界面。
在Linux主机上触发kgdb,使用Magic SysRq key(需要配置,见参考文献3).
$ sudo sh -c 'echo g > /proc/sysrq-trigger'
这时候Linux主机进入kgdb转态,Putty界面显示:
minipc@minipc-H81U:~$ [ 611.439892] sysrq: DEBUG
Entering kdb (current=0xffff9b534ab06500, pid 1614) on processor 3 due to NonMaskable Interrupt @ 0xffffffffb25a3c64
[3]kdb>
以上就是配置串口为console的全过程,要点是kernel启动时command line的参数配置。把全部环节打通我还是花了近2天的时间,google了很多资料。感谢各路大侠在网上的无私奉献,大家有什么问题也可以在下面留言,我尽可能解答。
1.
2. Linux Serial Console — The Linux Kernel documentationhttps://docs.kernel.org/admin-guide/serial-console.html 3. Linux Magic System Request Key Hacks — The Linux Kernel documentationhttps://www.kernel.org/doc/html/v4.17/admin-guide/sysrq.html
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)