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