arm64 上的 crashkernel 内存预留¶
作者:Baoquan He <bhe@redhat.com>
Kdump 机制用于捕获损坏的内核 vmcore,以便随后对其进行分析。为了做到这一点,需要预先预留的内存来预加载 kdump 内核,并在发生损坏时启动该内核。
为 kdump 预留的内存经过调整,能够尽可能容纳 kdump 内核和 vmcore 收集所需的用户空间程序。
内核参数¶
通过以下内核参数,可以在第一个内核启动的早期阶段相应地预留内存,以便找到连续的大块内存。如果 crashkernel 是从高内存区域预留的,则需要考虑低内存预留。
crashkernel=大小
crashkernel=大小,high crashkernel=大小,low
低内存和高内存¶
对于 kdump 预留,低内存是指特定限制下的内存区域,通常由 kdump 内核运行所需的 DMA 设备的可访问地址位决定。可以忽略那些与 vmcore 转储无关的设备。在 arm64 上,低内存上限是不固定的:在 RPi4 平台上是 1G,但在大多数其他系统上是 4G。在禁用 CONFIG_ZONE_(DMA|DMA32) 构建的特殊内核上,整个系统 RAM 都是低内存。在上述低内存之外,系统 RAM 的其余部分被认为是高内存。
实现¶
1) crashkernel=大小@偏移量¶
crashkernel 内存必须在用户指定的区域预留,如果已被占用则失败。
2) crashkernel=大小¶
crashkernel 内存区域将根据搜索顺序在任何可用位置预留
首先,内核在低内存区域搜索指定大小的可用区域。
如果搜索低内存失败,内核会回退到在高内存区域搜索指定大小的可用区域。如果在高内存中预留成功,则会在低内存中完成默认大小的预留。目前,默认大小为 128M,足以满足 kdump 内核的低内存需求。
注意:crashkernel=大小 是 crashkernel 内核预留的推荐选项。用户无需了解特定平台的系统内存布局。
3) crashkernel=大小,high crashkernel=大小,low¶
crashkernel=大小,(high|low) 是 crashkernel=大小 的重要补充。它们允许用户分别指定需要从高内存和低内存分配多少内存。在许多系统上,低内存非常宝贵,因此应尽可能减少从此区域预留 crashkernel。
要为 crashkernel=大小,high 预留内存,首先尝试从高内存区域进行搜索。如果预留成功,则随后会完成低内存预留。
如果从高内存预留失败,内核会回退到使用 crashkernel=,high 中指定的大小搜索低内存。如果成功,则无需进一步预留低内存。
注意事项
如果未指定 crashkernel=,low,则会自动完成默认的低内存预留。
如果指定了 crashkernel=0,low,则意味着有意省略了低内存预留。