linux 、kernel 虚拟机场景中获取 Guest OS 的 log

前言:

GuestOS 中如果发生了一些错误,GuestOS 还活着,shel 已经 hung 住了,如何获取到 GuestOS 中的关键 log 信息呢?

分析:

1,keyboard interrupt

QEMU默认虚拟化出来的键盘i8042,它的irq是1,具有非常高的优先级。可见,在大部分情况下,kernel不挂的情况下,都是可以响应键盘中断的。

2,sysrq

linux提供了一组magic key,用来触发特定的内核行为。在Linux的文档中,linux-4.4/Documentation/sysrq.txt有比较具体的描述,在这里截取几个关键的地方:

echo "number" >/proc/sys/kernel/sysrq,用来打开/关闭sysrq功能。简单一点,number取1就好。

配置好了sysrq之后,键盘中敲alt+prtsc+h或者在shell中敲echo h > /proc/sysrq-trigger,再dmesg就可以看到一些帮助信息。

3,sendkey

基于上述sysrq,那么可以给GuestOS发送magic key来触发GuestOS的sysrq。但是,如果HostOS也是Linux,那么就会magic会被HostOS截获。不能发送到Guest中。

所以可以使用virsh提供的sendkey能力:

virsh send-key e8adebc4-47f8-4d99-95a4-053ac6c6fb11 KEY_LEFTALT KEY_SYSRQ KEY_T

上面的几个KEY_XXX,作者也记不住,每次都要去libvirt/src/util/virkeymaps.h中查看。

4,ttyS0

我们希望把GuestOS的kmsg重定向到Host中的某个文件中,一来方便阅读查看,二来Guest中shell真的hung住了,我们也看不了。

所以,在启动Guest虚拟机之前需要给Guest配置serial设备,在libvirt的文档中使用这样的配置:

    <serial type='file'>
      <source path='/mnt/console/e8adebc4-47f8-4d99-95a4-053ac6c6fb11.log' append='off'/>
      <target port='0'/>
    </serial>

5,grub cfg

在4部配置完成后,启动Guest就可以使用ttyS0设备了。在guest中执行

echo “Hello World” > /dev/ttyS0,就可以在Host的文件中出现这样的log了。

修改grub的配置,编辑/boot/grub/grub.cfg,修改linux的启动参数:

linux    /boot/vmlinuz-4.4.0-21-generic root=UUID=807ac0e5-56ce-4906-8474-3d1f8c5894c4 ro console=ttyS0,115200n8

执行sync,再重启,就可以看到很多log写到了对应的文件中了。

6,printk

上述的步骤配置完成后,可以看到大量的kernel的log,但是依然不能看到sysrq的log。因为log level的关系。

在GuestOS中,敲cat /proc/sys/kernel/printk可以看到printk的log level。默认情况下,应该可以看到“4    4    1    7”这样的显示。

printk的log level在linux-4.4/kernel/printk/printk.c中实现,

我们只要关注第一个就行了,在shell中敲echo “8 4 1 7” > /proc/sys/kernel/printk来调整一下。

接下来再触发sysrq就可以看到log了。

7,analysis

作者这里为了复现一个问题,构造场景的时候,看到了类似的log。在执行write的时候,进程进入了D状态了。也是符合预期的,因为作者是为了测试在GuestOS中写数据的时候,做磁盘热拔的。

8,crash

sysrq中的c是crash,构造一次crash也挺有趣的,还有就是测试kernel的crash dump功能的时候很有用。

那么,crash是如何实现的呢?

inux-4.4.0/drivers/tty/sysrq.c中,

打开panic on oops,在对空指针赋值,就crash了。其他handler也在这个文件中实现的,略有意思。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Nginx流媒体支持配置

有关Nginx相关的基础知识 Linux 6下安装编译安装Nginx Nginx 概述及日常管理 Nginx基于IP,端口,域名配置虚拟主机 L...

630
来自专栏用户2442861的专栏

C语言开发Linux下web服务器(支持GET/POST,SSL,目录显示等)

http://blog.csdn.net/yueguanghaidao/article/details/8450938

542
来自专栏圣杰的专栏

.NET Core容器化@Docker

温馨提示:本文适合动手演练,效果更佳。 ?  1. 引言 我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Wi...

2267
来自专栏阮一峰的网络日志

GPG入门教程

前两篇文章,我介绍了RSA算法。 今天,就接着来看,现实中怎么使用这个算法,对信息加密和解密。这要用到GnuPG软件(简称GPG),它是目前最流行、最好用的加密...

3427
来自专栏前端儿

Cookie 和 Session 的区别

做web开发的人基本上都会用session和cookie,但是仅仅只是会用,并不知道session和cookie的真正的工作原理,都只是凭着感觉来猜测。web开...

551
来自专栏喔家ArchiSelf

嵌入式Linux的网络连接管理

连接管理器(ConnMan)是一个连接管理守护进程 , 用于管理运行 Linux 操作系统中设备的互联网连接。 它以快速、连贯、同步的方式对不断变化的网络条件提...

612
来自专栏容器云生态

监控利器之nagios原理详解

第一节 Nagios简介 nagios是系统管理人员和运维监控人员必须的工具之一,利用nagios可以监控本地或者远程主机资源, 如磁盘空间,系统负载等情况,...

2667
来自专栏用户2442861的专栏

tinyhttpd 剖析

http://blog.csdn.net/jcjc918/article/details/42129311

422
来自专栏散尽浮华

由索引节点(inode)爆满引发的问题

关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享一下: 一、发现问题 在公司一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建...

1988
来自专栏散尽浮华

分布式监控系统Zabbix-3.0.3--短信报警设置

前面已分别介绍了zabbix的邮件、微信报警设置,这些都是手机在有网络时才能收到报警信息,那如果手机没有网的情况下怎么办,这就需要考虑使用短信接口报警了。当服务...

2508

扫码关注云+社区