| ================================================================ | |
| 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 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. |