[linux][kernel]dump kmsg到文件系统中

前言:

有的时候,看到panic了,但是最后一次访问的backtrace有点长,一个屏幕内的log非常短,刚好错过了关键的backtrace。。。

分析:

1,patch

作者写了一个patch,方便把kmsg信息保存到文件中,下次启动可以查看:

修改linux-4.4/kernel/panic.c文件,增加函数:

#ifdef CONFIG_PRINTK
void dump_kmsg_to_file(void)
{
    struct file *fkmsg = NULL;
    struct file *ffile = NULL;
    loff_t pos_kmsg = 0;
    loff_t pos_file = 0;
    int open_fflag = O_CREAT | O_RDWR | O_NOFOLLOW | O_SYNC;
    char *buf = NULL;
    size_t size = PAGE_SIZE;
    size_t ret = 0;
    const char __user *p;
    mm_segment_t old_fs;

    pr_emerg("trigger dump kmsg\n");
    fkmsg = filp_open("/dev/kmsg", O_RDONLY, 0600);
    if (fkmsg == NULL) {
        pr_emerg("open /dev/ksmg fail\n");
        goto out;
    }

    //(void) sys_unlink((const char __user *)"/var/KDUMPMSG");
    ffile = filp_open("/var/KDUMPMSG", open_fflag, 0600);
    if (ffile == NULL) {
        pr_emerg("open /dev/ksmg fail\n");
        goto close_fkmsg;
    }

    buf = vmalloc(size);
    if (buf == NULL) {
        pr_emerg("vmalloc fail\n");
        goto close_ffile;
    }

    pr_emerg("start dump kmsg\n");
    old_fs = get_fs();
    set_fs(get_ds());
    p = (__force const char __user *)buf;
    fkmsg->f_pos = 0;
    ffile->f_pos = 0;
    while ((ret = __vfs_read(fkmsg, p, size, &pos_kmsg)) > 0) {
        int n = 0;
        fkmsg->f_pos = pos_kmsg;

        while (ret) {
            n = __vfs_write(ffile, p, ret, &pos_file);
            if (n <= 0) {
                pr_emerg("write log fail\n");
                goto free_buf;
            }
            ffile->f_pos = pos_file;
            ret -= n;
        }
    }

free_buf:
    set_fs(old_fs);
    if (buf)
        kvfree(buf);

close_ffile:
    if (ffile)
        filp_close(ffile, NULL);

close_fkmsg:
    if (fkmsg)
        filp_close(fkmsg, NULL);

out:
    return;
}
#endif    /*#ifdef CONFIG_PRINTK*/

在pr_emerg("Kernel panic - not syncing: %s\n", buf);函数后面调用dump_kmsg_to_file();即可。

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

原文发表时间:2017-12-18

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏醉生梦死

MySQL管理工具 mysqladmin 原

1141
来自专栏散尽浮华

Mysql的二进制日志binlog的模式说明

binlog模式总共可分为以下三种:row,statement,mixed 1.Row 日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进...

1985
来自专栏me的随笔

SQL Server中锁与事务隔离级别

SQL Server中可以锁定的资源包括:RID或键(行)、页、对象(如表)、数据库等等。

1502
来自专栏Jackson0714

30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

2916
来自专栏jeremy的技术点滴

数据库事务备忘

3154
来自专栏jouypub

MySQL查询用户权限

简书主页:https://www.jianshu.com/u/756c9c8ae984

9656
来自专栏微信公众号:Java团长

深入理解Mysql——锁、事务与并发控制

本文对锁、事务、并发控制做一个总结,看了网上很多文章,描述非常不准确。如有与您观点不一致,欢迎有理有据的拍砖!

2023
来自专栏沃趣科技

mysqldump与innobackupex备份过程你知多少(完结篇)

相关阅读: mysqldump与innobackupex备份过程你知多少(三) mysqldump与innobackupex备份过程你知多少(二) mysqld...

3808
来自专栏社区的朋友们

MySQL 入门常用命令大全(下)

作为一个 MySQL 的初学者,在短短的几个月中接触了一下,记录了一下工作中用到的 SQL 语句以及未来可能会用到的 MySQL 知识点,作为日后的参考手册。因...

4920
来自专栏CodingToDie

MySQL MVCC(多版本控制)

MySQL 提供了两种事务型的存储引擎:InnoDB 和 NDB Cluster 。另外还有一些第三方存储引擎也支持事务

1745

扫码关注云+社区