| ================================================================ |
| Documentation for Kdump - The kexec-based Crash Dumping Solution |
| ================================================================ |
| |
| This document includes overview, setup and installation, and analysis |
| information. |
| |
| Overview |
| ======== |
| |
| Kdump uses kexec to quickly boot to a dump-capture kernel whenever a |
| dump of the system kernel's memory needs to be taken (for example, when |
| the system panics). The system kernel's memory image is preserved across |
| the reboot and is accessible to the dump-capture kernel. |
| |
| You can use common Linux commands, such as cp and scp, to copy the |
| memory image to a dump file on the local disk, or across the network to |
| a remote system. |
| |
| Kdump and kexec are currently supported on the x86, x86_64, and ppc64 |
| architectures. |
| |
| When the system kernel boots, it reserves a small section of memory for |
| the dump-capture kernel. This ensures that ongoing Direct Memory Access |
| (DMA) from the system kernel does not corrupt the dump-capture kernel. |
| The kexec -p command loads the dump-capture kernel into this reserved |
| memory. |
| |
| On x86 machines, the first 640 KB of physical memory is needed to boot, |
| regardless of where the kernel loads. Therefore, kexec backs up this |
| region just before rebooting into the dump-capture kernel. |
| |
| All of the necessary information about the system kernel's core image is |
| encoded in the ELF format, and stored in a reserved area of memory |
| before a crash. The physical address of the start of the ELF header is |
| passed to the dump-capture kernel through the elfcorehdr= boot |
| parameter. |
| |
| With the dump-capture kernel, you can access the memory image, or "old |
| memory," in two ways: |
| |
| - Through a /dev/oldmem device interface. A capture utility can read the |
| device file and write out the memory in raw format. This is a raw dump |
| of memory. Analysis and capture tools must be intelligent enough to |
| determine where to look for the right information. |
| |
| - Through /proc/vmcore. This exports the dump as an ELF-format file that |
| you can write out using file copy commands such as cp or scp. Further, |
| you can use analysis tools such as the GNU Debugger (GDB) and the Crash |
| tool to debug the dump file. This method ensures that the dump pages are |
| correctly ordered. |
| |
| |
| Setup and Installation |
| ====================== |
| |
| Install kexec-tools and the Kdump patch |
| --------------------------------------- |
| |
| 1) Login as the root user. |
| |
| 2) Download the kexec-tools user-space package from the following URL: |
| |
| http://www.xmission.com/~ebiederm/files/kexec/kexec-tools-1.101.tar.gz |
| |
| 3) Unpack the tarball with the tar command, as follows: |
| |
| tar xvpzf kexec-tools-1.101.tar.gz |
| |
| 4) Download the latest consolidated Kdump patch from the following URL: |
| |
| http://lse.sourceforge.net/kdump/ |
| |
| (This location is being used until all the user-space Kdump patches |
| are integrated with the kexec-tools package.) |
| |
| 5) Change to the kexec-tools-1.101 directory, as follows: |
| |
| cd kexec-tools-1.101 |
| |
| 6) Apply the consolidated patch to the kexec-tools-1.101 source tree |
| with the patch command, as follows. (Modify the path to the downloaded |
| patch as necessary.) |
| |
| patch -p1 < /path-to-kdump-patch/kexec-tools-1.101-kdump.patch |
| |
| 7) Configure the package, as follows: |
| |
| ./configure |
| |
| 8) Compile the package, as follows: |
| |
| make |
| |
| 9) Install the package, as follows: |
| |
| make install |
| |
| |
| Download and build the system and dump-capture kernels |
| ------------------------------------------------------ |
| |
| Download the mainline (vanilla) kernel source code (2.6.13-rc1 or newer) |
| from http://www.kernel.org. Two kernels must be built: a system kernel |
| and a dump-capture kernel. Use the following steps to configure these |
| kernels with the necessary kexec and Kdump features: |
| |
| System kernel |
| ------------- |
| |
| 1) Enable "kexec system call" in "Processor type and features." |
| |
| CONFIG_KEXEC=y |
| |
| 2) Enable "sysfs file system support" in "Filesystem" -> "Pseudo |
| filesystems." This is usually enabled by default. |
| |
| CONFIG_SYSFS=y |
| |
| Note that "sysfs file system support" might not appear in the "Pseudo |
| filesystems" menu if "Configure standard kernel features (for small |
| systems)" is not enabled in "General Setup." In this case, check the |
| .config file itself to ensure that sysfs is turned on, as follows: |
| |
| grep 'CONFIG_SYSFS' .config |
| |
| 3) Enable "Compile the kernel with debug info" in "Kernel hacking." |
| |
| CONFIG_DEBUG_INFO=Y |
| |
| This causes the kernel to be built with debug symbols. The dump |
| analysis tools require a vmlinux with debug symbols in order to read |
| and analyze a dump file. |
| |
| 4) Make and install the kernel and its modules. Update the boot loader |
| (such as grub, yaboot, or lilo) configuration files as necessary. |
| |
| 5) Boot the system kernel with the boot parameter "crashkernel=Y@X", |
| where Y specifies how much memory to reserve for the dump-capture kernel |
| and X specifies the beginning of this reserved memory. For example, |
| "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory |
| starting at physical address 0x01000000 for the dump-capture kernel. |
| |
| On x86 and x86_64, use "crashkernel=64M@16M". |
| |
| On ppc64, use "crashkernel=128M@32M". |
| |
| |
| The dump-capture kernel |
| ----------------------- |
| |
| 1) Under "General setup," append "-kdump" to the current string in |
| "Local version." |
| |
| 2) On x86, enable high memory support under "Processor type and |
| features": |
| |
| CONFIG_HIGHMEM64G=y |
| or |
| CONFIG_HIGHMEM4G |
| |
| 3) On x86 and x86_64, disable symmetric multi-processing support |
| under "Processor type and features": |
| |
| CONFIG_SMP=n |
| (If CONFIG_SMP=y, then specify maxcpus=1 on the kernel command line |
| when loading the dump-capture kernel, see section "Load the Dump-capture |
| Kernel".) |
| |
| 4) On ppc64, disable NUMA support and enable EMBEDDED support: |
| |
| CONFIG_NUMA=n |
| CONFIG_EMBEDDED=y |
| CONFIG_EEH=N for the dump-capture kernel |
| |
| 5) Enable "kernel crash dumps" support under "Processor type and |
| features": |
| |
| CONFIG_CRASH_DUMP=y |
| |
| 6) Use a suitable value for "Physical address where the kernel is |
| loaded" (under "Processor type and features"). This only appears when |
| "kernel crash dumps" is enabled. By default this value is 0x1000000 |
| (16MB). It should be the same as X in the "crashkernel=Y@X" boot |
| parameter discussed above. |
| |
| On x86 and x86_64, use "CONFIG_PHYSICAL_START=0x1000000". |
| |
| On ppc64 the value is automatically set at 32MB when |
| CONFIG_CRASH_DUMP is set. |
| |
| 6) Optionally enable "/proc/vmcore support" under "Filesystems" -> |
| "Pseudo filesystems". |
| |
| CONFIG_PROC_VMCORE=y |
| (CONFIG_PROC_VMCORE is set by default when CONFIG_CRASH_DUMP is selected.) |
| |
| 7) Make and install the kernel and its modules. DO NOT add this kernel |
| to the boot loader configuration files. |
| |
| |
| Load the Dump-capture Kernel |
| ============================ |
| |
| After booting to the system kernel, load the dump-capture kernel using |
| the following command: |
| |
| kexec -p <dump-capture-kernel> \ |
| --initrd=<initrd-for-dump-capture-kernel> --args-linux \ |
| --append="root=<root-dev> init 1 irqpoll" |
| |
| |
| Notes on loading the dump-capture kernel: |
| |
| * <dump-capture-kernel> must be a vmlinux image (that is, an |
| uncompressed ELF image). bzImage does not work at this time. |
| |
| * By default, the ELF headers are stored in ELF64 format to support |
| systems with more than 4GB memory. The --elf32-core-headers option can |
| be used to force the generation of ELF32 headers. This is necessary |
| because GDB currently cannot open vmcore files with ELF64 headers on |
| 32-bit systems. ELF32 headers can be used on non-PAE systems (that is, |
| less than 4GB of memory). |
| |
| * The "irqpoll" boot parameter reduces driver initialization failures |
| due to shared interrupts in the dump-capture kernel. |
| |
| * You must specify <root-dev> in the format corresponding to the root |
| device name in the output of mount command. |
| |
| * "init 1" boots the dump-capture kernel into single-user mode without |
| networking. If you want networking, use "init 3." |
| |
| |
| Kernel Panic |
| ============ |
| |
| After successfully loading the dump-capture kernel as previously |
| described, the system will reboot into the dump-capture kernel if a |
| system crash is triggered. Trigger points are located in panic(), |
| die(), die_nmi() and in the sysrq handler (ALT-SysRq-c). |
| |
| The following conditions will execute a crash trigger point: |
| |
| If a hard lockup is detected and "NMI watchdog" is configured, the system |
| will boot into the dump-capture kernel ( die_nmi() ). |
| |
| If die() is called, and it happens to be a thread with pid 0 or 1, or die() |
| is called inside interrupt context or die() is called and panic_on_oops is set, |
| the system will boot into the dump-capture kernel. |
| |
| On powererpc systems when a soft-reset is generated, die() is called by all cpus and the system system will boot into the dump-capture kernel. |
| |
| For testing purposes, you can trigger a crash by using "ALT-SysRq-c", |
| "echo c > /proc/sysrq-trigger or write a module to force the panic. |
| |
| Write Out the Dump File |
| ======================= |
| |
| After the dump-capture kernel is booted, write out the dump file with |
| the following command: |
| |
| cp /proc/vmcore <dump-file> |
| |
| You can also access dumped memory as a /dev/oldmem device for a linear |
| and raw view. To create the device, use the following command: |
| |
| mknod /dev/oldmem c 1 12 |
| |
| Use the dd command with suitable options for count, bs, and skip to |
| access specific portions of the dump. |
| |
| To see the entire memory, use the following command: |
| |
| dd if=/dev/oldmem of=oldmem.001 |
| |
| |
| Analysis |
| ======== |
| |
| Before analyzing the dump image, you should reboot into a stable kernel. |
| |
| You can do limited analysis using GDB on the dump file copied out of |
| /proc/vmcore. Use the debug vmlinux built with -g and run the following |
| command: |
| |
| gdb vmlinux <dump-file> |
| |
| Stack trace for the task on processor 0, register display, and memory |
| display work fine. |
| |
| Note: GDB cannot analyze core files generated in ELF64 format for x86. |
| On systems with a maximum of 4GB of memory, you can generate |
| ELF32-format headers using the --elf32-core-headers kernel option on the |
| dump kernel. |
| |
| You can also use the Crash utility to analyze dump files in Kdump |
| format. Crash is available on Dave Anderson's site at the following URL: |
| |
| http://people.redhat.com/~anderson/ |
| |
| |
| To Do |
| ===== |
| |
| 1) Provide a kernel pages filtering mechanism, so core file size is not |
| extreme on systems with huge memory banks. |
| |
| 2) Relocatable kernel can help in maintaining multiple kernels for |
| crash_dump, and the same kernel as the system kernel can be used to |
| capture the dump. |
| |
| |
| Contact |
| ======= |
| |
| Vivek Goyal (vgoyal@in.ibm.com) |
| Maneesh Soni (maneesh@in.ibm.com) |
| |
| |
| Trademark |
| ========= |
| |
| Linux is a trademark of Linus Torvalds in the United States, other |
| countries, or both. |