首页 > 编程知识 正文

权力分享机制,知识分享机制

时间:2023-05-03 17:03:01 阅读:156948 作者:2657

什么是kdumpkdump? Kdump是用于在系统崩溃、死锁或死机时转储内存执行参数的工具和服务,用于捕获kernel crash崩溃时生成的crash dump 当第一内核正在运行时,系统内部会为第二内核保留空间。 这个预约空间的大小可以自己设定。 在第一kernelcrash时,进入第二kernel,在第二kernel中运行用户状态程序makedumpfile,剪切并压缩第一kernel的内存镜像,最后将第一kernel的vmcore保留在磁盘中

vmcore分析vmcore分析是分析机器停机原因的非常重要的手段。 分析vmcore目前主要采用crash分析。 安装crash后,必须安装相应的vmlinx文件以调试相应的vmcore。

一般来说,您可以通过安装kernel-debug info-common-$ (uname-r )的相应软件包来完成相应文件的安装。 但是,您需要安装两个软件包: kernel-debuginfo-common和kernel-debuginfo,kernel-debuginfo依赖于kernel-debuginfo-common

但是,除了安装上面的软件包外,还有一种方法可以自己编译源代码以获取vmlinux。

kdump的主要流程如下。

本节从系统的流程开始说明kdump的整体流程。

在系统引导阶段,系统引导时将调用名为start_kernel的函数。 此函数是启动kernel的入口。 在系统引导阶段,此时调用reverse_crashkernel函数为crash kernle保留内存。 这里,保留存储器被根据cmdline给出的参数保留。 在cmdline中通过crashkernel=Y@X进行预约。

crashkernel=Y@X : Y是保留存储器的大小; x是偏移量。 机器内存小于8G时,一般不保留; 机器内存大于8G小于16G时,预留125M; 如果机器内存大于16G,则512 m kud MP服务的启动阶段是kdump服务的启动阶段,此时系统已经启动,systemd正在撤回各项服务。 此时,systemd将启动kudmp服务。 【kdump脚本有具体的过程】

启动kdump服务时,crash kernel镜像和initramfs将加载到保留内存中,具体取决于您的配置。

当然,在对kdump.conf文件进行更改后,必须重新启动kdump服务才能使更改生效。 那么为什么需要重新启动呢? 首先,我们发现我们的normal kernel和crash kernel是隔离的,所有信息都需要通过elfcore header。 )和vmcore等信息传递的。 那么,修改配置后,我们就不太记得touch -m /担心的刺猬/kdump.conf (这里的具体路径了。 )您可以通过touch配置文件更改kdump配置文件的修改时间,然后通过命令: systemctl restart kdump将kdump服务重新启动到源代码。 kdump通过确定配置文件的修改时间来确定是否已修改。 在此处,touch配置文件,kdump在重新启动时重新打包,并将新软件包加载到保留内存中。 如果系统在系统崩溃阶段崩溃,系统将调用panic函数,在此处完成跳转到crash kernel的操作。

以下代码是源代码kernel/panic.c文件中panic函数的一部分

其实真正的跳跃函数在__crash_kexec中,所以我们来看看名为__crash_kexec的函数的乾坤:

在这个函数中,主要谈论machine_kexec :

进入此函数后,将在x86的计算机下执行名为relocate_kernel的函数。 此函数执行. s文件,然后完成跳转到crash kernel的任务。 但是,如果这一系列操作发生错误,跳到crash kernel并发生错误,请在panic函数中执行emergency_restart直接重新启动normal kernle。

触发panic的方法通常在触发panic时有一种简单的方法。 那是下一个命令。

echo c /proc/sysrq-trigger命令将c写入sysrq-trigger。 那么,为什么在这个proc节点中写入c会导致故障呢?

在sysrq-trigger中,当您将echo c放入其中时,此节点首先确定您输入的字符是什么,然后确定该字符是什么。 如果此字符是c,则会执行panic的处理器(handler ),并在该处理器上调用panic ()函数。 这样,你就明白了为什么这会成为瘫痪的契机了吧。 )

/proc/kcore、/proc/vmcore /proc/kcore和/proc/vmcore都是系统内存的镜像。 他们有什么区别呢?

这里,/proc/kcore出现在normal kernel中,不存在于crash kernel中; 在crash kernel中只存在/proc/vmcore。

在系统启动时,确定commandline中是否有参数elfcorehdr=。 在启动阶段,将调用函数__init_vmcore函数,该函数确定此次启动的内核是否为crash kernel,确定方法是立即确定是否存在elfcorehdr,以及此elfcorehder 如果检查通过,此时将调用名为proc_create创建/proc/vmcore的节点。 否则将不会创建。

进入crash kernel后,vmcore转储将使用生成副本文件对vmcore进行裁剪压缩。

生成文件有三种压缩方法: lzo、snappy和zlib。根据展开修剪和压缩/proc/vmcore时,流程会写入名为vmcore-incomplete的文件中。

所有操作完成后,将调用命令。

调用mv vmcore-incomplete vmcore和reboot重新启动到normal kernel

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。