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