如何让内核“日记”一条不丢?

当我们想要查看内核相关信息的时候,经常会用到dmesg命令,但是我们知道dmesg是从环形缓冲区内得到这些消息的,而这个缓冲区通常只有128KB的大小;假如内核打印的消息过多,就难免会“丢掉”前面的消息,那么如何保证让内核信息一条也不丢失呢?

系统日志架构

主要步骤:

改动DTS文件时需要慎重一些,改动前记得存一个备份文件。
以kenel/include/net/bluetooth/bluetooth.h为例。

  1. 找到bluetooth.h文件,关于调试打印信息的宏定义是通过下面的话去定义的。
    #define BT(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
  2. 但是pr_debug是否把信息打印出来,是需要去手动去开启的;假如我们想要在系统启动阶段,就获取相应的信息,那么就需要用到printk;也就是要把宏定义改成下面的样子。
    #define BT(fmt, ...) printk(fmt "\n", ##__VA_ARGS__)
  3. 完成修改后保存,再去编译内核,然后把boot.img换到GDK8内就行(可参考https://www.nanocode.cn/wiki/docs/gdk8_primer/primer_gdk8_img )。
  4. 但当重新开机以后,去查看dmesg信息,会发现dmesg信息只打印出来了一部分,[11.999043]之前的消息全都消失不见了;如下图所示。
    当然内核肯定是打印了这些消息的,不过没有显示罢了!这显然是因为缓冲区的空间大小有点小,信息又太多,于是前面的信息就被覆盖掉了;但是这样可不行啊!dmesg信息就相当于内核的“日记”,如果内核“日记”丢了几页,那么我们就不能轻松的知道当时内核发生过什么事情了,排除问题的难度也会加大;因此我们必须要让内核“日记”一页也不丢!
  5. 想要让缓冲区空间变大就要去修改DTS文件;于是立马打开DTS文件,找到chosen{…};如下所示。
     chosen {
         bootargs = "storagemedia=emmc androidboot.mode=normal androidboot.verifiedbootstate=orange 
         androidboot.slot_suffix= androidboot.serialno=EA4R1B8R7J  rw rootwait earlycon=uart8250,mmio32,0xff130000 
         swiotlb=1 kpti=0 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 coherent_pool=1m";
     };
  6. 在chosen{……}内添加log_buf_len=2M;设置一下缓冲区的大小,如下所示(具体大小也可以自己去设置,别几百Mb的去设置就好)。
     chosen {
         bootargs = "storagemedia=emmc androidboot.mode=normal androidboot.verifiedbootstate=orange 
         androidboot.slot_suffix= androidboot.serialno=EA4R1B8R7J  rw rootwait earlycon=uart8250,mmio32,0xff130000 
         swiotlb=1 kpti=0 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4
    coherent_pool=1m
         log_buf_len=2M";
     };
  7. 此时在完成刷机后,再次开机查看dmesg信息;就可以看到完整的“日记”了;同时可以在log_buf_len那一行看到,经过设置的缓冲区大小。
作者:admin  创建时间:2021-12-08 10:42
最后编辑:admin  更新时间:2024-03-12 10:45