掌桥专利:专业的专利平台
掌桥专利
首页

一种基于swap交换分区的Linux操作系统死机日志转储方法

文献发布时间:2024-04-18 20:01:23


一种基于swap交换分区的Linux操作系统死机日志转储方法

技术领域

本申请涉及操作系统的内核调试领域,尤其涉及一种基于swap交换分区的Linux操作系统死机日志转储方法。

背景技术

随着国产CPU、国产PC厂商的蓬勃发展,基于linux的操作系统发展兴起了一次飞跃式的发展。随着国产PC和操作系统应用越来越广泛,基于linux的系统维护工作带来了严重的考验,当系统发生死机时,技术人员不得不像调试嵌入式设备一样打开机箱,找到调试串口,复现问题抓取日志,操作逻辑非常不方便,不友好,非常需要一个试用于通用国产PC操作系统的日志保存/转储方案。

目前通用linux日志转储解决方案中,有基于pstore的日志转储方案,但他目前只实现了基于mtd、ram的方案,这种方案比较适合于嵌入式操作系统,由于桌面操作系统环境没有实现这种方案的硬件条件,所以当桌面操作系统出现系统死机时,就不得不接上调试串口进行抓取日志分析,不及时也不方便,很大程度上影响了技术人员分析问题。

发明内容

为解决上述问题,本发明提供了一种基于swap交换分区的Linux操作系统死机日志转储方法,采用如下的技术方案:

一种基于swap交换分区的Linux操作系统死机日志转储方法,包括:

当检测到操作系统内核发生崩溃时,分析操作系统注册的swap交换分区,获取操作系统可使用的有效swap交换分区的信息;

获取内核的实时内核死机日志kmsg;

基于swap交换分区的信息将内核死机日志kmsg写入到swap交换分区,并将内核死机日志kmsg的信息以及内核死机日志转储标志写入swap交换分区的头部信息块中;

等待操作系统重启;

当操作系统重启后,内核挂载swap交换分区,并读取swap交换分区的头部信息块,判断是否存在内核死机日志转储标志;

若不存在,则启动操作系统;

若存在,则读取内核死机日志kmsg并将内核死机日志kmsg转储至内存中,启动操作系统。

在另一种可能实现的方式中,基于swap交换分区信息将内核死机日志kmsg写入到swap交换分区,并将内核死机日志kmsg的信息以及内核死机日志转储标志写入swap交换分区的头部信息块中,包括:

步骤Sa1,申请一个缓存内存页;

步骤Sa2,获取swap_writer,swap_writer是操作swap交换分区读写数据页的重要handler;

步骤Sa3,初始化bio请求队列;

步骤Sa4,按页分割内核死机日志kmsg,拷贝一页内核死机日志kmsg的日志数据到缓存内存页中;

步骤Sa5,发起一个bio写请求,将缓存的一页日志数据写入swap交换分区;

步骤Sa6,循环执行步骤Sa4以及步骤Sa5,直至最后一页日志数据写入到swap交换分区中;

步骤Sa7,等待bio写请求完成;

步骤Sa8,结束bio请求队列;

步骤Sa9,计算和统计内核死机日志kmsg的数据信息,并在swap交换分区的头部信息块中写入内核死机日志转储标志SWAPSTORE字符;

步骤Sa10,释放swap_writer,结束。

在另一种可能的实现方式中,读取内核死机日志kmsg,包括:

步骤Sb1,获取swap_writer;

步骤Sb2,通过bio发起读取swap交换分区的头部信息块的请求,解析内核死机日志kmsg的重要信息,重要信息包括内核死机日志kmsg的大小、CRC校验值以及日志数据第一个数据页在swap交换分区中的存储地址;

步骤Sb3,清除内核死机日志转储标志SWAPSTOR,并通过BIO发起写swap交换分区头部信息块的操作,回填清除了SWAPSTOR标志信息的swap交换分区头部信息块;

步骤Sb4,基于内核死机日志kmsg的大小,申请缓存区内存页;

步骤Sb5,初始化bio请求队列;

步骤Sb6,发起一个bio读请求,将内核死机日志kmsg的数据页从swap交换分区读到缓存区内存页中;

步骤Sb7,等待bio完成数据读取;

步骤Sb8,循环执行步骤Sb6以及步骤Sb7,直至swap交换分区中的全部数据页读到缓存区内存页中;

步骤Sb9,等待bio读请求完成,并释放bio请求队列;

步骤Sb10,对缓存区内存页中的数据进行CRC校验,释放swap_writer,结束。

在另一种可能的实现方式中,将内核死机日志kmsg转储至内存中,包括:

判断是否成功读取内核死机日志kmsg;

若读取成功,则创建内核死机日志kmsg对应的日志转储kthread;

休眠500ms,等待操作系统的文件系统挂载日志目录;

判断日志目录是否被成功挂载;

若挂载,则在日志目录中创建文件,文件名基于内核死机日志kmsg的日志类型以及发生时间拼接而成;

将缓存在内存中的日志写入日志文件名对应的文件中;

结束日志转储kthread。

综上,本申请包括以下有益技术效果:

本发明方法首次提出适用于linux桌面操作系统的日志转储方案,该方案补充了桌面硬件环境无法适用的基于mtd、ram的pstore日志转储解决方案。该方案也区别于通过死机后直接将日志文件写入根文件系统的方案。避免了由于内核死机后仍然发起对系统根文件系统分区文件读写的非安全非可靠的问题。并且也避免了技术人员需要拆机、接串口、复现问题等尴尬分析问题的境地。给基于linux的桌面操作系统提供了一个辅助技术人员分析问题的日志转储方案。

附图说明

图1是本申请实施例中的一种基于swap交换分区的Linux操作系统死机日志转储方法的流程示意图。

图2是本申请实施例中的一种将内核死机日志kmsg写入swap交换分区的方法的流程示意图。

图3是本申请实施例中的一种读取内核死机日志kmsg的方法的流程示意图。

图4是本申请实施例中的一种将内核死机日志kmsg转储至内存的方法的流程示意图。

具体实施方式

以下结合附图1-4对本申请作进一步详细说明。

本领域技术人员在阅读完本说明书后可以根据需要对本实施例做出没有创造性贡献的修改,但只要在本申请的权利要求范围内都受到专利法的保护。

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,如无特殊说明,一般表示前后关联对象是一种“或”的关系。

下面结合说明书附图对本申请实施例作进一步详细描述。

如图1所示,本申请实施例提供了一种基于swap交换分区的Linux操作系统死机日志转储方法,使用该方法的内核不需要提供ram、mtd支持,不同于直接写日志到文件系统的方式,利用磁盘swap交换分区进行日志转储,该方法具体包括:

步骤S101,当检测到操作系统内核发生崩溃时,分析操作系统注册的swap交换分区,获取操作系统可使用的有效swap交换分区的信息。

对于本申请实施例,swap交换分区用于临时存储内核死机日志kmsg,以麒麟操作系统为例,解析麒麟操作系统SP1的swap交换分区,麒麟操作系统在安装时会默认一个10G的swap交换分区。

步骤S102,获取内核的实时内核死机日志kmsg。

对于本申请实施例,内核死机日志kmsg中包含第一时间的内核panic信息以及时标信息等。具体的,获取内核的实时内核死机日志kmsg可以通过Linux内核pstore机制获取,通常内核死机日志kmsg在200kb-300kb不等,也可以通过内核的prink子系统获取,还可以通过其他自定义的方式获取,在此不做限定。

步骤S103,基于swap交换分区的信息将内核死机日志kmsg写入到swap交换分区,并将内核死机日志kmsg的信息以及内核死机日志转储标志写入swap交换分区的头部信息块中。

对于本申请实施例,具体的,将内核死机日志kmsg分割成磁盘页大小的数据页,并通过bio一页一页的写入swap交换分区的数据区,当写完最后一个数据页后,将内核死机日志kmsg的信息以及内核死机日志转储标志写入swap交换分区的头部信息块中。

更具体的,将内核死机日志kmsg写入到swap交换分区,是通过内核的接口获取到swap交换分区的分区格式信息,比如分区格式、分区大小、磁盘块/页大小等信息,再将获取到的内核死机日志kmsg按照磁盘页大小一页一页的写入swap交换分区,在写入时,为避免和Linux文件系统通用块层有过多的耦合导致写入方式成功率不高的问题,写入方式基本不依赖操作系统挂载的根文件系统,只是初始化一个新的通用块层的bio读写合并请求队列,提高读写内核死机日志kmsg的读写效率,其他操作均为最底层的操作方式,因此即使是因为操作系统死机是因为文件系统逻辑出现问题,也不会影响到日志转储写入交换分区的逻辑。当内核死机日志kmsg写入到最后一页之后,会将检索的内核死机日志kmsg的信息以及死机日志转储标志写入到swap交换分区的头部信息块中,其中,内核死机日志kmsg的信息包括日志大小、死机发生时间、日志来源、日志的CRC校验值、内核死机日志kmsg在swap交换分区中块数据的组织形式以及内核死机日志kmsg第一页在swap交换分区数据的偏移地址,另外,死机日志转储标志是后续判断swap交换分区中是否存在日志转储的重要标志,当swap交换分区的头部信息块写入swap交换分区后,整个内核死机日志kmsg写入swap交换分区的流程就完成,如图2所示,具体步骤如下:

步骤Sa1,申请一个缓存内存页,以便于缓存需要写入到swap交换分区的数据;

步骤Sa2,获取swap_writer,swap_writer是操作swap交换分区读写数据页的重要handler,在本申请实施例中,通过get_swap_writer获取到swap交换分区写操作的handler;

步骤Sa3,初始化bio请求队列,具体的,初始化一个专用于日志转储的通用块层bio读写合并请求队列,在本申请实施例中,通过调用通用块层的blk_start_plug初始化一个专用于日志转储读写合并请求的队列swap_bio_plug;

步骤Sa4,按页分割内核死机日志kmsg,拷贝一页内核死机日志kmsg的日志数据到缓存内存页中;

步骤Sa5,发起一个bio写请求,将缓存的一页日志数据写入swap交换分区;

步骤Sa6,循环执行步骤Sa4以及步骤Sa5,直至最后一页日志数据写入到swap交换分区中,在本申请实施例中,磁盘页的大小为4kb,若获取到的内核死机日志kmsg有200kb时,则将存在50个页写入到swap交换分区;

步骤Sa7,等待bio写请求完成;

步骤Sa8,结束bio请求队列;

步骤Sa9,计算和统计内核死机日志kmsg的数据信息,并在swap交换分区的头部信息块中写入内核死机日志转储标志SWAPSTORE字符;

步骤Sa10,释放swap_writer,结束。

步骤S104,等待操作系统重启。

步骤S105,当操作系统重启后,内核挂载swap交换分区,并读取swap交换分区的头部信息块,判断是否存在内核死机日志转储标志,即读取swap_header block信息,判断是否存在内核死机日志转储标志SWAPSTORE字段。

步骤S106,若不存在,则启动操作系统。

步骤S107,若存在,则读取内核死机日志kmsg并将内核死机日志kmsg转储至内存中,启动操作系统。

对于本申请实施例,读取内核死机日志kmsg,具体包括,当存在SWAPSTORE字段标志时,会解析头部信息块swap_header block中的内核死机日志kmsg的信息,并记录信息中内核死机日志的大小、CRC校验值以及日志数据第一个数据页在swap交换分区中的存储地址(也即上文所提到的死机日志第一页在swap交换分区数据的偏移地址),然后按照信息中记录的日志数据第一个页的存储地址,发起对通用块层bio磁盘数据页的读请求,并将数据页中的信息存储到内存中事先申请的日志大小的缓存池中,当全部数据页读取完毕后,会对整个读取到内存中的内核死机日志kmsg进行CRC校验。另,会清除掉swap_header block中的SWAPSTORE标志,防止下一次重启重复读取SWAP交换分区保存的kmsg日志。至此读取完成。如图3所示,具体步骤如下:

步骤Sb1,获取swap_writer;

步骤Sb2,通过bio发起读取swap交换分区的头部信息块的请求,解析内核死机日志kmsg的重要信息,重要信息包括内核死机日志kmsg的大小、CRC校验值以及日志数据第一个数据页在swap交换分区中的存储地址;

步骤Sb3,清除内核死机日志转储标志SWAPSTOR,并基于日志数据第一个数据页在swap交换分区中的存储地址,通过BIO发起写swap交换分区头部信息块的操作,回填swap交换分区头部信息块swap header,即重新写入一个不具有内核死机日志转储标志SWAPSTOR的swap交换分区头部信息块,从而达到防止下一次重启重复读取swap交换分区缓存的内核死机日志kmsg的效果;

步骤Sb4,基于内核死机日志kmsg的大小,申请缓存区内存页,即缓存区内存页的大小为内核死机日志kmsg的大小;

步骤Sb5,初始化bio请求队列;

步骤Sb6,发起一个bio读请求,将内核死机日志kmsg的数据页从swap交换分区读到缓存区内存页中;

步骤Sb7,等待bio完成数据读取;

步骤Sb8,循环执行步骤Sb6以及步骤Sb7,直至swap交换分区中的全部数据页读到缓存区内存页中;

步骤Sb9,等待bio读请求完成,并释放bio请求队列;

步骤Sb10,对缓存区内存页中的数据进行CRC校验,释放swap_writer,结束,其中,通过将缓存区内存页中的CRC校验值与重要信息中的CRC校验值进行对比,当对比正确时,释放SWAP reader流程结束,当对比失败时,报错退出。

因此,本发明的方案可以绕开文件系统层,直接在通用块层发起磁盘swap交换分区的数据页读写。

而在将swap交换分区内的内核死机日志kmsg读取到缓存区内存页后,会通过内核线程进行转储,具体的,首先会发起一个swpstr_savelog_thread的内核转储日志的内核线程。内核线程首先会等待操作系统的/var/log/目录被正确挂载完,接着会将日志类型kmsg,日志发生时间20230921日11点12分12秒,拼接成日志文件名(kmsg-20230921111212.log),并创建。最后将200kB 内核死机日志kmsg缓存在内存中的日志写入到该文件中,至此整个流程结束,如图4所示,具体实现步骤如下:

判断是否成功读取内核死机日志kmsg;

若读取成功,则创建内核死机日志kmsg对应的日志转储kthread;

休眠500ms,等待操作系统的文件系统挂载日志目录;

判断日志目录是否被成功挂载;

若挂载,则在日志目录中创建文件,文件名基于内核死机日志kmsg的日志类型以及发生时间拼接而成;

将缓存在内存中的日志写入日志文件名对应的文件中;

结束日志转储kthread。

进一步的,在本申请实施例中,内核线程能够解析上次内核发生死机的事件,并等待系统完成启动后,将内核死机日志按照发生的日期写入系统日志目录中。

综上,本申请实施例实现了一种基于swap交换分区的linux操作系统死机日志转储技术,本技术提出一种适用于linux桌面操作系统的日志转储方案,该方案补充了桌面硬件环境无法适用的基于mtd、ram的pstore日志转储解决方案。该方案也区别于通过死机后直接将日志文件写入根文件系统的方案。它设计实现通过利用操作系统的交换分区临时存储内核死机日志,设置标志信息。等第二次重启时检索SWAP交换分区的标志位以及转储日志的存储信息和数据,并在文件系统挂载成功后转储日志到系统日志目录中去,完成整个日志转储工作。

以上仅是本申请的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

相关技术
  • 一种基于个体和群体多视角兴趣建模的音乐推荐方法
  • 一种基于个体行为和群体兴趣的兴趣地点推荐方法及装置
技术分类

06120116546736