韌體輔助轉儲

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):

  1. 設定配置選項 CONFIG_FA_DUMP=y 並構建核心。

  2. 使用“fadump=on”核心 cmdline 選項引導到 Linux 核心。 預設情況下,FADump 保留記憶體將初始化為 CMA 區域。 或者,使用者可以使用“fadump=nocma”引導 linux 核心,以防止 FADump 使用 CMA。

  3. 或者,使用者還可以設定“crashkernel=”核心 cmdline 以指定要為引導記憶體轉儲保留保留的記憶體大小。

注意
  1. “fadump_reserve_mem=”引數已被棄用。 請改用“crashkernel=”指定要為引導記憶體轉儲保留保留的記憶體大小。

  2. 如果韌體輔助轉儲無法保留記憶體,則如果核心 cmdline 上設定了“crashkernel=”選項,它將回退到現有的 kdump 機制。

  3. 如果使用者想要捕獲所有使用者空間記憶體並且可以接受保留記憶體不可用於生產系統,則可以使用“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 提供支援 | 頁面源