1================================================================ 2Documentation for Kdump - The kexec-based Crash Dumping Solution 3================================================================ 4 5This document includes overview, setup and installation, and analysis 6information. 7 8Overview 9======== 10 11Kdump uses kexec to quickly boot to a dump-capture kernel whenever a 12dump of the system kernel's memory needs to be taken (for example, when 13the system panics). The system kernel's memory image is preserved across 14the reboot and is accessible to the dump-capture kernel. 15 16You can use common commands, such as cp and scp, to copy the 17memory image to a dump file on the local disk, or across the network to 18a remote system. 19 20Kdump and kexec are currently supported on the x86, x86_64, ppc64, ia64, 21s390x, arm and arm64 architectures. 22 23When the system kernel boots, it reserves a small section of memory for 24the dump-capture kernel. This ensures that ongoing Direct Memory Access 25(DMA) from the system kernel does not corrupt the dump-capture kernel. 26The kexec -p command loads the dump-capture kernel into this reserved 27memory. 28 29On x86 machines, the first 640 KB of physical memory is needed to boot, 30regardless of where the kernel loads. Therefore, kexec backs up this 31region just before rebooting into the dump-capture kernel. 32 33Similarly on PPC64 machines first 32KB of physical memory is needed for 34booting regardless of where the kernel is loaded and to support 64K page 35size kexec backs up the first 64KB memory. 36 37For s390x, when kdump is triggered, the crashkernel region is exchanged 38with the region [0, crashkernel region size] and then the kdump kernel 39runs in [0, crashkernel region size]. Therefore no relocatable kernel is 40needed for s390x. 41 42All of the necessary information about the system kernel's core image is 43encoded in the ELF format, and stored in a reserved area of memory 44before a crash. The physical address of the start of the ELF header is 45passed to the dump-capture kernel through the elfcorehdr= boot 46parameter. Optionally the size of the ELF header can also be passed 47when using the elfcorehdr=[size[KMG]@]offset[KMG] syntax. 48 49 50With the dump-capture kernel, you can access the memory image through 51/proc/vmcore. This exports the dump as an ELF-format file that you can 52write out using file copy commands such as cp or scp. Further, you can 53use analysis tools such as the GNU Debugger (GDB) and the Crash tool to 54debug the dump file. This method ensures that the dump pages are correctly 55ordered. 56 57 58Setup and Installation 59====================== 60 61Install kexec-tools 62------------------- 63 641) Login as the root user. 65 662) Download the kexec-tools user-space package from the following URL: 67 68http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz 69 70This is a symlink to the latest version. 71 72The latest kexec-tools git tree is available at: 73 74- git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git 75- http://www.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git 76 77There is also a gitweb interface available at 78http://www.kernel.org/git/?p=utils/kernel/kexec/kexec-tools.git 79 80More information about kexec-tools can be found at 81http://horms.net/projects/kexec/ 82 833) Unpack the tarball with the tar command, as follows:: 84 85 tar xvpzf kexec-tools.tar.gz 86 874) Change to the kexec-tools directory, as follows:: 88 89 cd kexec-tools-VERSION 90 915) Configure the package, as follows:: 92 93 ./configure 94 956) Compile the package, as follows:: 96 97 make 98 997) Install the package, as follows:: 100 101 make install 102 103 104Build the system and dump-capture kernels 105----------------------------------------- 106There are two possible methods of using Kdump. 107 1081) Build a separate custom dump-capture kernel for capturing the 109 kernel core dump. 110 1112) Or use the system kernel binary itself as dump-capture kernel and there is 112 no need to build a separate dump-capture kernel. This is possible 113 only with the architectures which support a relocatable kernel. As 114 of today, i386, x86_64, ppc64, ia64, arm and arm64 architectures support 115 relocatable kernel. 116 117Building a relocatable kernel is advantageous from the point of view that 118one does not have to build a second kernel for capturing the dump. But 119at the same time one might want to build a custom dump capture kernel 120suitable to his needs. 121 122Following are the configuration setting required for system and 123dump-capture kernels for enabling kdump support. 124 125System kernel config options 126---------------------------- 127 1281) Enable "kexec system call" in "Processor type and features.":: 129 130 CONFIG_KEXEC=y 131 1322) Enable "sysfs file system support" in "Filesystem" -> "Pseudo 133 filesystems." This is usually enabled by default:: 134 135 CONFIG_SYSFS=y 136 137 Note that "sysfs file system support" might not appear in the "Pseudo 138 filesystems" menu if "Configure standard kernel features (for small 139 systems)" is not enabled in "General Setup." In this case, check the 140 .config file itself to ensure that sysfs is turned on, as follows:: 141 142 grep 'CONFIG_SYSFS' .config 143 1443) Enable "Compile the kernel with debug info" in "Kernel hacking.":: 145 146 CONFIG_DEBUG_INFO=Y 147 148 This causes the kernel to be built with debug symbols. The dump 149 analysis tools require a vmlinux with debug symbols in order to read 150 and analyze a dump file. 151 152Dump-capture kernel config options (Arch Independent) 153----------------------------------------------------- 154 1551) Enable "kernel crash dumps" support under "Processor type and 156 features":: 157 158 CONFIG_CRASH_DUMP=y 159 1602) Enable "/proc/vmcore support" under "Filesystems" -> "Pseudo filesystems":: 161 162 CONFIG_PROC_VMCORE=y 163 164 (CONFIG_PROC_VMCORE is set by default when CONFIG_CRASH_DUMP is selected.) 165 166Dump-capture kernel config options (Arch Dependent, i386 and x86_64) 167-------------------------------------------------------------------- 168 1691) On i386, enable high memory support under "Processor type and 170 features":: 171 172 CONFIG_HIGHMEM64G=y 173 174 or:: 175 176 CONFIG_HIGHMEM4G 177 1782) On i386 and x86_64, disable symmetric multi-processing support 179 under "Processor type and features":: 180 181 CONFIG_SMP=n 182 183 (If CONFIG_SMP=y, then specify maxcpus=1 on the kernel command line 184 when loading the dump-capture kernel, see section "Load the Dump-capture 185 Kernel".) 186 1873) If one wants to build and use a relocatable kernel, 188 Enable "Build a relocatable kernel" support under "Processor type and 189 features":: 190 191 CONFIG_RELOCATABLE=y 192 1934) Use a suitable value for "Physical address where the kernel is 194 loaded" (under "Processor type and features"). This only appears when 195 "kernel crash dumps" is enabled. A suitable value depends upon 196 whether kernel is relocatable or not. 197 198 If you are using a relocatable kernel use CONFIG_PHYSICAL_START=0x100000 199 This will compile the kernel for physical address 1MB, but given the fact 200 kernel is relocatable, it can be run from any physical address hence 201 kexec boot loader will load it in memory region reserved for dump-capture 202 kernel. 203 204 Otherwise it should be the start of memory region reserved for 205 second kernel using boot parameter "crashkernel=Y@X". Here X is 206 start of memory region reserved for dump-capture kernel. 207 Generally X is 16MB (0x1000000). So you can set 208 CONFIG_PHYSICAL_START=0x1000000 209 2105) Make and install the kernel and its modules. DO NOT add this kernel 211 to the boot loader configuration files. 212 213Dump-capture kernel config options (Arch Dependent, ppc64) 214---------------------------------------------------------- 215 2161) Enable "Build a kdump crash kernel" support under "Kernel" options:: 217 218 CONFIG_CRASH_DUMP=y 219 2202) Enable "Build a relocatable kernel" support:: 221 222 CONFIG_RELOCATABLE=y 223 224 Make and install the kernel and its modules. 225 226Dump-capture kernel config options (Arch Dependent, ia64) 227---------------------------------------------------------- 228 229- No specific options are required to create a dump-capture kernel 230 for ia64, other than those specified in the arch independent section 231 above. This means that it is possible to use the system kernel 232 as a dump-capture kernel if desired. 233 234 The crashkernel region can be automatically placed by the system 235 kernel at run time. This is done by specifying the base address as 0, 236 or omitting it all together:: 237 238 crashkernel=256M@0 239 240 or:: 241 242 crashkernel=256M 243 244 If the start address is specified, note that the start address of the 245 kernel will be aligned to 64Mb, so if the start address is not then 246 any space below the alignment point will be wasted. 247 248Dump-capture kernel config options (Arch Dependent, arm) 249---------------------------------------------------------- 250 251- To use a relocatable kernel, 252 Enable "AUTO_ZRELADDR" support under "Boot" options:: 253 254 AUTO_ZRELADDR=y 255 256Dump-capture kernel config options (Arch Dependent, arm64) 257---------------------------------------------------------- 258 259- Please note that kvm of the dump-capture kernel will not be enabled 260 on non-VHE systems even if it is configured. This is because the CPU 261 will not be reset to EL2 on panic. 262 263Extended crashkernel syntax 264=========================== 265 266While the "crashkernel=size[@offset]" syntax is sufficient for most 267configurations, sometimes it's handy to have the reserved memory dependent 268on the value of System RAM -- that's mostly for distributors that pre-setup 269the kernel command line to avoid a unbootable system after some memory has 270been removed from the machine. 271 272The syntax is:: 273 274 crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset] 275 range=start-[end] 276 277For example:: 278 279 crashkernel=512M-2G:64M,2G-:128M 280 281This would mean: 282 283 1) if the RAM is smaller than 512M, then don't reserve anything 284 (this is the "rescue" case) 285 2) if the RAM size is between 512M and 2G (exclusive), then reserve 64M 286 3) if the RAM size is larger than 2G, then reserve 128M 287 288 289 290Boot into System Kernel 291======================= 292 2931) Update the boot loader (such as grub, yaboot, or lilo) configuration 294 files as necessary. 295 2962) Boot the system kernel with the boot parameter "crashkernel=Y@X", 297 where Y specifies how much memory to reserve for the dump-capture kernel 298 and X specifies the beginning of this reserved memory. For example, 299 "crashkernel=64M@16M" tells the system kernel to reserve 64 MB of memory 300 starting at physical address 0x01000000 (16MB) for the dump-capture kernel. 301 302 On x86 and x86_64, use "crashkernel=64M@16M". 303 304 On ppc64, use "crashkernel=128M@32M". 305 306 On ia64, 256M@256M is a generous value that typically works. 307 The region may be automatically placed on ia64, see the 308 dump-capture kernel config option notes above. 309 If use sparse memory, the size should be rounded to GRANULE boundaries. 310 311 On s390x, typically use "crashkernel=xxM". The value of xx is dependent 312 on the memory consumption of the kdump system. In general this is not 313 dependent on the memory size of the production system. 314 315 On arm, the use of "crashkernel=Y@X" is no longer necessary; the 316 kernel will automatically locate the crash kernel image within the 317 first 512MB of RAM if X is not given. 318 319 On arm64, use "crashkernel=Y[@X]". Note that the start address of 320 the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000). 321 322Load the Dump-capture Kernel 323============================ 324 325After booting to the system kernel, dump-capture kernel needs to be 326loaded. 327 328Based on the architecture and type of image (relocatable or not), one 329can choose to load the uncompressed vmlinux or compressed bzImage/vmlinuz 330of dump-capture kernel. Following is the summary. 331 332For i386 and x86_64: 333 334 - Use vmlinux if kernel is not relocatable. 335 - Use bzImage/vmlinuz if kernel is relocatable. 336 337For ppc64: 338 339 - Use vmlinux 340 341For ia64: 342 343 - Use vmlinux or vmlinuz.gz 344 345For s390x: 346 347 - Use image or bzImage 348 349For arm: 350 351 - Use zImage 352 353For arm64: 354 355 - Use vmlinux or Image 356 357If you are using an uncompressed vmlinux image then use following command 358to load dump-capture kernel:: 359 360 kexec -p <dump-capture-kernel-vmlinux-image> \ 361 --initrd=<initrd-for-dump-capture-kernel> --args-linux \ 362 --append="root=<root-dev> <arch-specific-options>" 363 364If you are using a compressed bzImage/vmlinuz, then use following command 365to load dump-capture kernel:: 366 367 kexec -p <dump-capture-kernel-bzImage> \ 368 --initrd=<initrd-for-dump-capture-kernel> \ 369 --append="root=<root-dev> <arch-specific-options>" 370 371If you are using a compressed zImage, then use following command 372to load dump-capture kernel:: 373 374 kexec --type zImage -p <dump-capture-kernel-bzImage> \ 375 --initrd=<initrd-for-dump-capture-kernel> \ 376 --dtb=<dtb-for-dump-capture-kernel> \ 377 --append="root=<root-dev> <arch-specific-options>" 378 379If you are using an uncompressed Image, then use following command 380to load dump-capture kernel:: 381 382 kexec -p <dump-capture-kernel-Image> \ 383 --initrd=<initrd-for-dump-capture-kernel> \ 384 --append="root=<root-dev> <arch-specific-options>" 385 386Please note, that --args-linux does not need to be specified for ia64. 387It is planned to make this a no-op on that architecture, but for now 388it should be omitted 389 390Following are the arch specific command line options to be used while 391loading dump-capture kernel. 392 393For i386, x86_64 and ia64: 394 395 "1 irqpoll maxcpus=1 reset_devices" 396 397For ppc64: 398 399 "1 maxcpus=1 noirqdistrib reset_devices" 400 401For s390x: 402 403 "1 maxcpus=1 cgroup_disable=memory" 404 405For arm: 406 407 "1 maxcpus=1 reset_devices" 408 409For arm64: 410 411 "1 maxcpus=1 reset_devices" 412 413Notes on loading the dump-capture kernel: 414 415* By default, the ELF headers are stored in ELF64 format to support 416 systems with more than 4GB memory. On i386, kexec automatically checks if 417 the physical RAM size exceeds the 4 GB limit and if not, uses ELF32. 418 So, on non-PAE systems, ELF32 is always used. 419 420 The --elf32-core-headers option can be used to force the generation of ELF32 421 headers. This is necessary because GDB currently cannot open vmcore files 422 with ELF64 headers on 32-bit systems. 423 424* The "irqpoll" boot parameter reduces driver initialization failures 425 due to shared interrupts in the dump-capture kernel. 426 427* You must specify <root-dev> in the format corresponding to the root 428 device name in the output of mount command. 429 430* Boot parameter "1" boots the dump-capture kernel into single-user 431 mode without networking. If you want networking, use "3". 432 433* We generally don't have to bring up a SMP kernel just to capture the 434 dump. Hence generally it is useful either to build a UP dump-capture 435 kernel or specify maxcpus=1 option while loading dump-capture kernel. 436 Note, though maxcpus always works, you had better replace it with 437 nr_cpus to save memory if supported by the current ARCH, such as x86. 438 439* You should enable multi-cpu support in dump-capture kernel if you intend 440 to use multi-thread programs with it, such as parallel dump feature of 441 makedumpfile. Otherwise, the multi-thread program may have a great 442 performance degradation. To enable multi-cpu support, you should bring up an 443 SMP dump-capture kernel and specify maxcpus/nr_cpus, disable_cpu_apicid=[X] 444 options while loading it. 445 446* For s390x there are two kdump modes: If a ELF header is specified with 447 the elfcorehdr= kernel parameter, it is used by the kdump kernel as it 448 is done on all other architectures. If no elfcorehdr= kernel parameter is 449 specified, the s390x kdump kernel dynamically creates the header. The 450 second mode has the advantage that for CPU and memory hotplug, kdump has 451 not to be reloaded with kexec_load(). 452 453* For s390x systems with many attached devices the "cio_ignore" kernel 454 parameter should be used for the kdump kernel in order to prevent allocation 455 of kernel memory for devices that are not relevant for kdump. The same 456 applies to systems that use SCSI/FCP devices. In that case the 457 "allow_lun_scan" zfcp module parameter should be set to zero before 458 setting FCP devices online. 459 460Kernel Panic 461============ 462 463After successfully loading the dump-capture kernel as previously 464described, the system will reboot into the dump-capture kernel if a 465system crash is triggered. Trigger points are located in panic(), 466die(), die_nmi() and in the sysrq handler (ALT-SysRq-c). 467 468The following conditions will execute a crash trigger point: 469 470If a hard lockup is detected and "NMI watchdog" is configured, the system 471will boot into the dump-capture kernel ( die_nmi() ). 472 473If die() is called, and it happens to be a thread with pid 0 or 1, or die() 474is called inside interrupt context or die() is called and panic_on_oops is set, 475the system will boot into the dump-capture kernel. 476 477On powerpc systems when a soft-reset is generated, die() is called by all cpus 478and the system will boot into the dump-capture kernel. 479 480For testing purposes, you can trigger a crash by using "ALT-SysRq-c", 481"echo c > /proc/sysrq-trigger" or write a module to force the panic. 482 483Write Out the Dump File 484======================= 485 486After the dump-capture kernel is booted, write out the dump file with 487the following command:: 488 489 cp /proc/vmcore <dump-file> 490 491 492Analysis 493======== 494 495Before analyzing the dump image, you should reboot into a stable kernel. 496 497You can do limited analysis using GDB on the dump file copied out of 498/proc/vmcore. Use the debug vmlinux built with -g and run the following 499command:: 500 501 gdb vmlinux <dump-file> 502 503Stack trace for the task on processor 0, register display, and memory 504display work fine. 505 506Note: GDB cannot analyze core files generated in ELF64 format for x86. 507On systems with a maximum of 4GB of memory, you can generate 508ELF32-format headers using the --elf32-core-headers kernel option on the 509dump kernel. 510 511You can also use the Crash utility to analyze dump files in Kdump 512format. Crash is available at the following URL: 513 514 https://github.com/crash-utility/crash 515 516Crash document can be found at: 517 https://crash-utility.github.io/ 518 519Trigger Kdump on WARN() 520======================= 521 522The kernel parameter, panic_on_warn, calls panic() in all WARN() paths. This 523will cause a kdump to occur at the panic() call. In cases where a user wants 524to specify this during runtime, /proc/sys/kernel/panic_on_warn can be set to 1 525to achieve the same behaviour. 526 527Trigger Kdump on add_taint() 528============================ 529 530The kernel parameter panic_on_taint facilitates a conditional call to panic() 531from within add_taint() whenever the value set in this bitmask matches with the 532bit flag being set by add_taint(). 533This will cause a kdump to occur at the add_taint()->panic() call. 534 535Contact 536======= 537 538- Vivek Goyal (vgoyal@redhat.com) 539- Maneesh Soni (maneesh@in.ibm.com) 540 541GDB macros 542========== 543 544.. include:: gdbmacros.txt 545 :literal: 546