如何在伪终端(通过ssh远程登录)显示内核打印信息
时间:2010-07-13
来源:互联网
作者: linuxer_lhw 发布时间: 2010-07-13
作者: Godbach 发布时间: 2010-07-13
不是启动信息,自己编写的内核模块的printk信息,比如模块手动加载或运行时产生的信息。以前做嵌入式开发的时候,修改内核参数可以把信息打印到串口终端上,不知道能不能用什么方法打印到这种远程登录的客户端上,有个netconsole方法不知道行不行
作者: linuxer_lhw 发布时间: 2010-07-13
作者: Godbach 发布时间: 2010-07-13
作者: Godbach 发布时间: 2010-07-13
作者: vermouth 发布时间: 2010-07-13
作者: lmarsin 发布时间: 2010-07-13
我的终端是windows下的,没法看日志。呵呵。其实一般可以查看dmesg 或者/var/log/message ,主要是有时后oops死机时要查看瞬间的信息。
作者: linuxer_lhw 发布时间: 2010-07-13
我的终端是windows下的,没法看日志。呵呵。其实一般可以查看dmesg 或者/var/log/ ...
linuxer_lhw 发表于 2010-07-13 19:25
查看日志看文件/var/log/messages就可以了。
你通过终端同样也可查看该文件啊
作者: Godbach 发布时间: 2010-07-13
如果可以的话给大家说说哈。谢谢
作者: linuxer_lhw 发布时间: 2010-07-13
没死机可以,但调试时出oops一般就死机了就没法看了,重启后就没了。死机前oops倾泄出来的信息会打印到控制台上,但我每次都得跑到服务器那边看,很麻烦,所以我想能不能将prink信息直接打印到本地机器的终端上,我本地机器是windows,通过SecureCRT远程登录
作者: linuxer_lhw 发布时间: 2010-07-13
BTW,你的系统重启之后就没有以前的日志信息了吗,用的是硬盘吗?
作者: Godbach 发布时间: 2010-07-13
解决方法2:
void print_string(char *str)
{
struct tty_struct *my_tty;
my_tty = current->tty;
if (my_tty != NULL) {
(*(my_tty->driver).write)( my_tty, 0, str,strlen(str));
(*(my_tty->driver).write)( my_tty, 0, "" "", 2);
}
}
作者: unbutun 发布时间: 2010-07-13
作者: unbutun 发布时间: 2010-07-13
回复 linuxer_lhw
花了半天的时间,对昨天的想法做了验证,基本实现了,并贴上代码。以下代码只是验证我的思路而已,请大牛们拍砖。
我们知道,当通过ssh连接主机时,linux会在/dev/pts/下创建对应的终端设备文件,通过写此文件即可向对应的终端发送信息,以下图示例:
首先通过SecureCRT登录到linux主机,可以看到/dev/pts下有设备文件0。
然后,在虚拟机的命令行上输入echo "123456789" > /dev/pts/0 回车后,便在ssh的虚拟终端上输出123456789。
我们知道printk最终是输出到console,只要我们创建一个自己的console并注册到系统中,这样当调用printk时,我们可以很容易的得到printk输出的信息,此时再将此信息输向到/dev/pts/xxx即可。
代码

在虚拟机的窗口操作效果如下:通过printk打印的内容同时输出到了终端上。
作者: lmarsin 发布时间: 2010-07-14
不过我本地出现了一下错误,应该是oops信息:
np.pty_file:cd068900
open file: 0
BUG: sleeping function called from invalid context at include/asm/uaccess_32.h:512
in_atomic():0, irqs_disabled():1
Pid: 5112, comm: insmod Not tainted 2.6.24.4 #2
[<c01259f8>] __might_sleep+0xa4/0xa9
[<c01ec615>] copy_from_user+0x2d/0x60
[<c02284a7>] tty_write+0x132/0x1c7
[<c022c585>] write_chan+0x0/0x1b3
[<c017389a>] vfs_write+0xac/0x12c
[<e0a0a04b>] write_msg+0x4b/0x73 [ptyconsole]
[<e0a0a000>] write_msg+0x0/0x73 [ptyconsole]
[<c01289ba>] __call_console_drivers+0x51/0x5b
[<c0128ad7>] call_console_drivers+0xb2/0xd4
[<c01290f4>] release_console_sem+0x70/0xb0
[<e0a0a12a>] init_ptyconsole+0x40/0x54 [ptyconsole]
[<c01461df>] sys_init_module+0x91/0x11b
[<c0104dc6>] sysenter_past_esp+0x5f/0x85
=======================
ptyconsole: network logging started
作者: Godbach: 发布时间: 2010-07-14
回复 Godbach
你的系统打开了CONFIG_DEBUG_SPINLOCK_SLEEP功能,应该是在中断或软中断上下文的输出过程中睡眠了,printk在中断或软中断以及进程上下文中都可以被调用。
代码只是验证了我的思路,没有进行中断调用的测试。
作者: Godbach 发布时间: 2010-07-14
作者: lmarsin 发布时间: 2010-07-14
回复 Godbach
这种情况没有测试。
对于你上面发生的问题,可以在write_msg函数中,注释掉
local_irq_save(flags);
local_irq_restore(flags);
之后测试下看看
static void write_msg(struct console *con, const char *msg, unsigned int len)
{
#if USE_SYS_CALL
unsigned long flags;
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
sys_write(np.pty_fd, msg, len);
set_fs(old_fs);
#else
unsigned long flags;
ssize_t ret = -EBADF;
mm_segment_t old_fs;
if (np.pty_file) {
old_fs = get_fs();
set_fs(KERNEL_DS);
loff_t pos = np.pty_file->f_pos;
ret = vfs_write(np.pty_file, msg, len, &pos);
np.pty_file->f_pos = pos;
set_fs(old_fs);
}
#endif
}
作者: Godbach 发布时间: 2010-07-14
注释掉了local_irq_save(flags);
对应的local_irq_restore(flags);也需要注释掉啊
作者: lmarsin 发布时间: 2010-07-14
那是应该的。
本来我是直接调用系统调用的,但不知为何加载时链接不到sys_open符号,所以用filp_open等方法了,用USE_SYS_CALL来区分两种方法。
作者: Godbach 发布时间: 2010-07-14
作者: lmarsin 发布时间: 2010-07-14
- static void write_msg(struct console *con, const char *msg, unsigned int len)
- {
- #if USE_SYS_CALL
- unsigned long flags;
- mm_segment_t old_fs;
-
- // local_irq_save(flags);
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- sys_write(np.pty_fd, msg, len);
- set_fs(old_fs);
-
- // local_irq_restore(flags);
- #else
- unsigned long flags;
- ssize_t ret = -EBADF;
- mm_segment_t old_fs;
-
- if (np.pty_file) {
- local_irq_save(flags);
-
- old_fs = get_fs();
- set_fs(KERNEL_DS);
-
- loff_t pos = np.pty_file->f_pos;
- ret = vfs_write(np.pty_file, msg, len, &pos);
- np.pty_file->f_pos = pos;
-
- set_fs(old_fs);
-
- // local_irq_restore(flags);
- }
- #endif
- }
np.pty_file:d59e3780
open file: 0
BUG: sleeping function called from invalid context at include/asm/uaccess_32.h:512
in_atomic():0, irqs_disabled():1
Pid: 6590, comm: insmod Not tainted 2.6.24.4 #2
[<c01259f8>] __might_sleep+0xa4/0xa9
[<c01ec615>] copy_from_user+0x2d/0x60
[<c02284a7>] tty_write+0x132/0x1c7
[<c022c585>] write_chan+0x0/0x1b3
[<c017389a>] vfs_write+0xac/0x12c
[<e0a0a04a>] write_msg+0x4a/0x6f [ptyconsole]
[<e0a0a000>] write_msg+0x0/0x6f [ptyconsole]
[<c01289ba>] __call_console_drivers+0x51/0x5b
[<c0128ad7>] call_console_drivers+0xb2/0xd4
[<c01290f4>] release_console_sem+0x70/0xb0
[<e0a0a126>] init_ptyconsole+0x40/0x54 [ptyconsole]
[<c01461df>] sys_init_module+0x91/0x11b
[<c0104dc6>] sysenter_past_esp+0x5f/0x85
=======================
ptyconsole: network logging started
作者: Godbach 发布时间: 2010-07-14
回复 Godbach
好像你还漏改了一个地方,你贴代码的20行
作者: Godbach 发布时间: 2010-07-14
惭愧,这个关键的地方漏掉了。

作者: lmarsin 发布时间: 2010-07-14
np.pty_file:c6d48b40
open file: 0
BUG: sleeping function called from invalid context at include/asm/uaccess_32.h:512
in_atomic():0, irqs_disabled():1
Pid: 7481, comm: insmod Not tainted 2.6.24.4 #2
[<c01259f8>] __might_sleep+0xa4/0xa9
[<c01ec615>] copy_from_user+0x2d/0x60
[<c02284a7>] tty_write+0x132/0x1c7
[<c022c585>] write_chan+0x0/0x1b3
[<c017389a>] vfs_write+0xac/0x12c
[<e0a2a041>] write_msg+0x41/0x66 [ptyconsole]
[<e0a2a000>] write_msg+0x0/0x66 [ptyconsole]
[<c01289ba>] __call_console_drivers+0x51/0x5b
[<c0128ad7>] call_console_drivers+0xb2/0xd4
[<c01290f4>] release_console_sem+0x70/0xb0
[<e0a2a11d>] init_ptyconsole+0x40/0x54 [ptyconsole]
[<c01461df>] sys_init_module+0x91/0x11b
[<c0104dc6>] sysenter_past_esp+0x5f/0x85
=======================
ptyconsole: network logging started
作者: Godbach 发布时间: 2010-07-14
作者: Godbach 发布时间: 2010-07-14
作者: Godbach 发布时间: 2010-07-14
系统会挂掉吗?
作者: lmarsin 发布时间: 2010-07-14
作者: lmarsin 发布时间: 2010-07-14
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28