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

前言: GuestOS中如果发生了一些错误,GuestOS还活着,shell已经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,analysic

作者这里为了复现一个问题,构造场景的时候,看到了类似的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也在这个文件中实现的,略有意思。 后记: Good Luck!

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2017-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏杂谈

node.js模块的坑

在写一个工具的时候,需要将xml转为json方便处理,以前电脑上装的node.js的版本为0.8,结果我再安装node-xml2json时提示版本过低,然后我又...

1532
来自专栏北京马哥教育

那些吓人的 Linux 命令

哪些Linux命令会让人联想到妖魔鬼怪?不妨好好瞧一瞧! ? 每年一度的万圣节马上就要到来,是时候稍微关注一下Linux那吓人的一面了。哪些Linux命令会让...

4318
来自专栏散尽浮华

Kafka(分布式发布-订阅消息系统)工作流程说明

Kafka系统架构 Apache Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速...

1472
来自专栏娱乐心理测试

小程序的网络请求封装

5777
来自专栏互扯程序

mybatis之二级缓存

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

1292
来自专栏依乐祝

Ocelot简易教程(四)之请求聚合以及服务发现

上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍,今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能。希望能对大家有所帮助。

2102
来自专栏腾讯大数据的专栏

网卡收包流程

0.前言 为提升信鸽基础服务质量,笔者就网络收包全流程进行了内容整理。 网络编程中我们接触得比较多的是socket api和epoll模型,对于系统内核和网卡驱...

2.1K14
来自专栏开源FPGA

Isim你不得不知道的技巧(整理)

来源:电子产品世界;   注:本文由NingHeChuan本人多出整理所得,原文章图片不清晰,自己整理配图后重新发表   安装好ISE,系统已经自带了ISim仿...

2906
来自专栏云计算与大数据

Linux CPU 如何判断忙

摘录自:http://www.ruanyifeng.com/blog/2016/12/user_space_vs_kernel_space.html

3052
来自专栏恰童鞋骚年

.NET Core微服务之基于Ocelot实现API网关服务

  API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。以前...

1483

扫码关注云+社区

领取腾讯云代金券