固件辅助转储¶
2011 年 7 月
固件辅助转储的目标是能够转储崩溃的系统,并从完全重置的系统执行此操作,并最大限度地缩短系统恢复生产使用之前的总耗时。
固件辅助转储 (FADump) 基础设施旨在替代现有的 phyp 辅助转储。
Fadump 使用与 phyp 辅助转储相同的固件接口和内存保留模型。
与 phyp 转储不同,FADump 通过 /proc/vmcore 以 ELF 格式导出内存转储,其方式与 kdump 相同。 这有助于我们重用 kdump 基础设施进行转储捕获和过滤。
与 phyp 转储不同,用户空间工具在读取 /proc/vmcore 时不需要引用任何 sysfs 接口。
与 phyp 转储不同,FADump 允许用户通过单个操作 echo 1 > /sys/kernel/fadump_release_mem 释放为转储保留的所有内存。
通过内核引导参数启用后,可以通过 /sys/kernel/fadump_registered 接口(请参阅下面的 sysfs 文件部分)启动/停止 FADump,并且可以轻松地与 kdump 服务启动/停止 init 脚本集成。
与 kdump 或其他策略相比,固件辅助转储具有几个强大的实际优势
与 kdump 不同,系统已重置,并加载了内核的全新副本。 特别是,PCI 和 I/O 设备已重新初始化,并且处于干净、一致的状态。
复制出转储后,保存转储的内存立即可供运行的内核使用。 因此,与 kdump 不同,FADump 不需要第二次重启即可使系统恢复到生产配置。
以上只能通过与 Power 固件协调并获得其帮助才能完成。 程序如下
第一个内核在 OS 初始化期间向 Power 固件注册内存段,以便在转储期间保留。 这些已注册的内存段由第一个内核在早期引导期间保留。
当系统崩溃时,Power 固件会将注册的低内存区域(引导内存)从源区域复制到目标区域。 它还将保存硬件 PTE。
- 注意
术语“引导内存”表示在以受限内存引导时内核成功引导所需的低内存块的大小。 默认情况下,引导内存大小将是系统 RAM 的 5% 或 256MB 中的较大者。 或者,用户也可以通过引导参数“crashkernel=”指定引导内存大小,这将覆盖默认计算的大小。 如果默认引导内存大小不足以让第二个内核成功引导,请使用此选项。 有关 crashkernel= 参数的语法,请参阅Kdump 的文档 - 基于 kexec 的崩溃转储解决方案。 如果在 crashkernel= 参数中提供任何偏移量,它将被忽略,因为 FADump 使用预定义的偏移量来保留内存,以便在发生崩溃时保留引导内存转储。
保存低内存(引导内存)区域后,固件将重置 PCI 和其他硬件状态。 它不会清除 RAM。 然后它会像往常一样启动引导加载程序。
新引导的内核将注意到设备树中有一个新节点(pSeries 上的 rtas/ibm,kernel-dump 或 OPAL 平台上的 ibm,opal/dump/mpipl-boot),表明有来自先前引导的崩溃数据可用。 在早期引导期间,操作系统将保留引导内存大小以上的其余内存,从而有效地以受限内存大小引导。 这将确保此内核(也称为第二个内核或捕获内核)不会触及任何转储内存区域。
用户空间工具将读取 /proc/vmcore 以获取内存内容,其中包含 ELF 格式的先前崩溃的内核转储。 用户空间工具可以将此信息复制到磁盘、网络、nas、san、iscsi 等,如需。
用户空间工具完成保存转储后,它将回显“1”到 /sys/kernel/fadump_release_mem 以将保留的内存释放回一般用途,但下次固件辅助转储注册所需的内存除外。
例如。
# echo 1 > /sys/kernel/fadump_release_mem
请注意,固件辅助转储功能仅在 pSeries (PowerVM) 平台上的 POWER6 及更高版本的系统以及 PowerNV (OPAL) 平台上的 OP940 或更高版本的固件版本的 POWER9 及更高版本的系统上可用。 请注意,当 PowerNV 平台上支持 FADump 时,OPAL 固件会导出 ibm,opal/dump 节点。
在基于 OPAL 的机器上,系统首先引导到间歇内核(称为 petitboot 内核),然后再引导到捕获内核。 此内核将具有最少的内核和/或用户空间支持来处理崩溃数据。 此类内核需要保留先前崩溃的内核的内存,以便后续捕获内核引导来处理此崩溃数据。 必须在此类内核上启用内核配置选项 CONFIG_PRESERVE_FA_DUMP,以确保保留崩溃数据以便稍后处理。
- -- 在基于 OPAL 的机器 (PowerNV) 上,如果内核是用
CONFIG_OPAL_CORE=y 构建的,则崩溃时的 OPAL 内存也会导出为 /sys/firmware/opal/mpipl/core 文件。 此 procfs 文件有助于使用 GDB 调试 OPAL 崩溃。 用于导出此 procfs 文件的内核内存可以通过回显“1”到 /sys/firmware/opal/mpipl/release_core 节点来释放。
- 例如。
# echo 1 > /sys/firmware/opal/mpipl/release_core
- -- Fadump 中对其他内核参数的支持
Fadump 具有一项功能,允许将其他内核参数传递给 fadump 内核。 此功能主要用于禁用 fadump 内核不需要的内核功能,并减少其在收集转储时的内存占用。
将其他内核参数添加到 Fadump 的命令:例如 # echo “nr_cpus=16” > /sys/kernel/fadump/bootargs_append
上述命令足以将其他参数添加到 fadump。 不需要显式服务重启。
检索其他 Fadump 参数的命令:例如 # cat /sys/kernel/fadump/bootargs_append
- 注意:只有在 HASH MMU 的 fadump 的其他内核参数
如果 RMA 大小大于 768 MB,则支持。 如果 RMA 大小小于 768 MB,则内核不会导出 /sys/kernel/fadump/bootargs_append sysfs 节点。
实现细节:¶
在引导期间,会检查固件是否在该特定机器上支持此功能。 如果支持,则我们检查是否有一个活动的转储正在等待我们。 如果是,则在早期引导期间保留 RAM 的除引导内存大小之外的所有内容(请参阅图 2)。 从运行的用户区脚本(例如 kdump 脚本)完成收集转储后,此区域将被释放。 如果有转储数据,则会创建 /sys/kernel/fadump_release_mem 文件,并保留保留的内存。
如果没有等待的转储数据,则通常仅在大于引导内存大小的偏移量处保留用于保存 CPU 状态、HPTE 区域、引导内存转储和 FADump 标头所需的内存(请参阅图 1)。 此区域不被释放:此区域将永久保留,以便在发生崩溃时,它可以充当引导内存内容以及 CPU 状态和 HPTE 区域副本的容器。
由于此保留内存区域仅在系统崩溃后使用,因此阻止生产内核使用此大量内存块毫无意义。 因此,如果为内核配置了 CMA,则该实现使用 Linux 内核的连续内存分配器 (CMA) 进行内存保留。 使用 CMA 保留,此内存将可供应用程序使用,同时内核被阻止使用它。 这样,FADump 仍然能够捕获所有内核内存和大多数用户空间内存,除了 CMA 区域中存在的用户页面。
o Memory Reservation during first kernel
Low memory Top of memory
0 boot memory size |<------ Reserved dump area ----->| |
| | | Permanent Reservation | |
V V | | V
+-----------+-----/ /---+---+----+-----------+-------+----+-----+
| | |///|////| DUMP | HDR |////| |
+-----------+-----/ /---+---+----+-----------+-------+----+-----+
| ^ ^ ^ ^ ^
| | | | | |
\ CPU HPTE / | |
-------------------------------- | |
Boot memory content gets transferred | |
to reserved area by firmware at the | |
time of crash. | |
FADump Header |
(meta area) |
|
|
Metadata: This area holds a metadata structure whose
address is registered with f/w and retrieved in the
second kernel after crash, on platforms that support
tags (OPAL). Having such structure with info needed
to process the crashdump eases dump capture process.
Fig. 1
o Memory Reservation during second kernel after crash
Low memory Top of memory
0 boot memory size |
| |<------------ Crash preserved area ------------>|
V V |<--- Reserved dump area --->| |
+----+---+--+-----/ /---+---+----+-------+-----+-----+-------+
| |ELF| | |///|////| DUMP | HDR |/////| |
+----+---+--+-----/ /---+---+----+-------+-----+-----+-------+
| | | | | |
----- ------------------------------ ---------------
\ | |
\ | |
\ | |
\ | ----------------------------
\ | /
\ | /
\ | /
/proc/vmcore
+---+
|///| -> Regions (CPU, HPTE & Metadata) marked like this in the above
+---+ figures are not always present. For example, OPAL platform
does not have CPU & HPTE regions while Metadata region is
not supported on pSeries currently.
+---+
|ELF| -> elfcorehdr, it is created in second kernel after crash.
+---+
Note: Memory from 0 to the boot memory size is used by second kernel
Fig. 2
目前,转储将通过用户干预从 /proc/vmcore 复制到一个新文件。 通过 /proc/vmcore 提供的转储数据将采用 ELF 格式。 因此,现有的 kdump 基础设施(kdump 脚本)保存转储可以正常工作,只需稍作修改。 主要发行版版本上的 KDump 脚本已经过修改,可以在使用 FADump(而不是 KDump)作为转储机制时无缝工作(无需用户干预保存转储)。
用于检查转储的工具将与用于 kdump 的工具相同。
如何启用固件辅助转储 (FADump):¶
设置配置选项 CONFIG_FA_DUMP=y 并构建内核。
使用“fadump=on”内核 cmdline 选项引导到 Linux 内核。 默认情况下,FADump 保留内存将初始化为 CMA 区域。 或者,用户可以使用“fadump=nocma”引导 linux 内核,以防止 FADump 使用 CMA。
或者,用户还可以设置“crashkernel=”内核 cmdline 以指定要为引导内存转储保留保留的内存大小。
- 注意
“fadump_reserve_mem=”参数已被弃用。 请改用“crashkernel=”指定要为引导内存转储保留保留的内存大小。
如果固件辅助转储无法保留内存,则如果内核 cmdline 上设置了“crashkernel=”选项,它将回退到现有的 kdump 机制。
如果用户想要捕获所有用户空间内存并且可以接受保留内存不可用于生产系统,则可以使用“fadump=nocma”内核参数回退到旧行为。
Sysfs/debugfs 文件:¶
固件辅助转储功能使用 sysfs 文件系统来保存控制文件,并使用 debugfs 文件来显示内存保留区域。
以下是内核 sysfs 下的文件列表
- /sys/kernel/fadump_enabled
用于显示 FADump 状态。
0 = FADump 已禁用
1 = FADump 已启用
kdump init 脚本可以使用此接口来识别内核中是否启用了 FADump,并相应地采取操作。
- /sys/kernel/fadump_registered
用于显示 FADump 注册状态以及控制(启动/停止)FADump 注册。
0 = FADump 未注册。
1 = FADump 已注册并准备好处理系统崩溃。
要注册 FADump,请回显 1 > /sys/kernel/fadump_registered,并回显 0 > /sys/kernel/fadump_registered 以取消注册并停止 FADump。 取消注册 FADump 后,将不会处理系统崩溃,也不会捕获 vmcore。 此接口可以轻松地与 kdump 服务启动/停止集成。
/sys/kernel/fadump/mem_reserved
用于显示 FADump 为保存崩溃转储保留的内存。
- /sys/kernel/fadump_release_mem
仅当 FADump 在第二个内核期间处于活动状态时,此文件才可用。 用于释放为保存崩溃转储而保留的内存区域。 要释放保留的内存,请将 1 回显到它
echo 1 > /sys/kernel/fadump_release_mem回显 1 后,/sys/kernel/debug/powerpc/fadump_region 文件的内容将更改以反映新的内存保留。
可以轻松增强现有的用户空间工具(kdump 基础设施)以使用此接口来释放为转储保留的内存,并继续操作而无需第二次重启。
- 注意:/sys/kernel/fadump_release_opalcore sysfs 已移动到
/sys/firmware/opal/mpipl/release_core
/sys/firmware/opal/mpipl/release_core
仅当 FADump 在捕获内核期间处于活动状态时,此文件才在基于 OPAL 的机器上可用。 用于释放内核用于导出 /sys/firmware/opal/mpipl/core 文件的内存。 要释放此内存,请将“1”回显到它
echo 1 > /sys/firmware/opal/mpipl/release_core
注意:以下 FADump sysfs 文件已被弃用。
已弃用 |
替代方案 |
/sys/kernel/fadump_enabled |
/sys/kernel/fadump/enabled |
/sys/kernel/fadump_registered |
/sys/kernel/fadump/registered |
/sys/kernel/fadump_release_mem |
/sys/kernel/fadump/release_mem |
以下是 powerpc debugfs 下的文件列表:(假设 debugfs 安装在 /sys/kernel/debug 目录中。)
- /sys/kernel/debug/powerpc/fadump_region
如果启用了 FADump,则此文件显示保留的内存区域,否则此文件为空。 输出格式为
<region>: [<start>-<end>] <reserved-size> bytes, Dumped: <dump-size>并且内核 DUMP 区域为
DUMP: Src: <src-addr>, Dest: <dest-addr>, Size: <size>, Dumped: # bytes
例如。 在第一个内核期间注册 FADump 时的内容
# cat /sys/kernel/debug/powerpc/fadump_region CPU : [0x0000006ffb0000-0x0000006fff001f] 0x40020 bytes, Dumped: 0x0 HPTE: [0x0000006fff0020-0x0000006fff101f] 0x1000 bytes, Dumped: 0x0 DUMP: [0x0000006fff1020-0x0000007fff101f] 0x10000000 bytes, Dumped: 0x0在第二个内核期间 FADump 处于活动状态时的内容
# cat /sys/kernel/debug/powerpc/fadump_region CPU : [0x0000006ffb0000-0x0000006fff001f] 0x40020 bytes, Dumped: 0x40020 HPTE: [0x0000006fff0020-0x0000006fff101f] 0x1000 bytes, Dumped: 0x1000 DUMP: [0x0000006fff1020-0x0000007fff101f] 0x10000000 bytes, Dumped: 0x10000000 : [0x00000010000000-0x0000006ffaffff] 0x5ffb0000 bytes, Dumped: 0x5ffb0000
- 注意
有关如何安装 debugfs 文件系统,请参阅DebugFS。
TODO:¶
需要提出更好的方法来找出更准确的引导内存大小,这是内核在以受限内存引导时成功引导所需的。
作者:Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
本文档基于 Linas Vepstas 和 Manish Ahuja 为 phyp 辅助转储编写的原始文档。
©内核开发社区。 | 由 Sphinx 5.3.0 & Alabaster 0.7.16 提供支持 | 页面源