ubuntu下kdump的使用

本文介绍了在Ubuntu系统中如何安装和配置kdump,包括设置crashkernel参数、启动kdump服务,以及获取内核调试信息。通过手动触发dump文件生成,并使用crash工具进行故障分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1, 安装kdump, apt-get install kexec-tools crash

   安装后检查grub文件/boot/grub/grub.cfg,会发生引导内核命令后多了一个参数:crashkernel=384M-:128M
   修改kdump配置文件(/etc/default/kdump-tools): USE_KDUMP=1
   启动kdump, sudo /etc/init.d/kdump-tools start

2. crash工具需要内核调试信息dbgsym才可以工作,先看看有没有/user/lib/debug/boot这个目录,没有的话从这里下载

http://ddebs.ubuntu.com/pool/main/l/linux/

或者:
   cat > /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ precise main restricted universe multiverse
EOF
   sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01
   sudo apt-get update
   sudo apt-get install systemtap
   sudo apt-get install linux-image-$(uname -r)-dbgsym

3. 用echo c > /proc/sysrq-trigger 手动触发dump,生成dump文件默认在/var/crash/目录下。

4. crash /usr/lib/debug/boot/vmlinux-3.13.0-24-generic dump.xxxx

剩下就可以进行分析crash的原因了。


<think>好的,用户现在想了解如何使用kdump进行调试。我之前已经回答过关于ftrace的问题,现在需要转向kdump。首先,我需要回忆kdump的基本概念和它在Linux内核调试中的作用。kdump主要用于在内核崩溃时捕获内存转储,这对于分析崩溃原因非常重要。接下来,我需要考虑用户可能的背景。他们可能是系统管理员或开发人员,遇到内核崩溃的问题,需要利用kdump来获取崩溃时的内存信息。 用户的需求可能包括如何配置kdump、如何触发崩溃转储,以及如何分析生成的vmcore文件。此外,用户可能对相关的工具(如crash工具)不太熟悉,需要详细的使用步骤。我需要确保覆盖这些方面,同时提供实际的操作示例,帮助他们逐步完成配置和分析过程。 我需要检查是否有常见的配置错误或注意事项需要提及,比如内存保留问题,或者不同发行版之间的配置差异。例如,CentOS和Ubuntukdump配置上可能有不同的包管理工具和配置文件路径。此外,还要提醒用户在生产环境中谨慎操作,避免误触发系统崩溃。 另外,用户可能对如何分析vmcore文件感到困惑,所以需要详细说明使用crash工具的基本命令,比如如何加载内核和vmcore,如何查看堆栈跟踪、寄存器状态等。还要考虑是否提到高级分析技巧,比如查找特定符号或跟踪任务状态,但需要保持回答的简洁性,避免信息过载。 最后,我需要确保回答结构清晰,分步骤讲解,每个部分都有示例代码和解释,这样用户能够按照步骤操作。同时,注意事项和常见问题也需要突出显示,帮助用户避免常见陷阱。可能还需要对比kdump与其他调试工具(如ftrace)的不同使用场景,帮助用户理解何时使用kdump更合适。</think>#### 一、kdump 核心机制解析 ```text [崩溃转储原理] │ ├── 主内核(Production Kernel): 运行中的业务系统 └── 备内核(Crash Kernel): 保留内存区域,主内核崩溃时接管系统 ├── 内存转储触发机制 ├── /proc/vmcore 生成 └── 转储文件保存(vmcore) ``` --- #### 二、环境配置步骤 ##### 1. **内核启动参数配置** ```bash # 编辑grub配置文件(以CentOS为例) vi /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=256M" # 更新grub配置 grub2-mkconfig -o /boot/grub2/grub.cfg ``` **参数说明**: - `crashkernel=256M`:保留256MB内存用于崩溃内核 - 推荐值:物理内存≤2GB时保留128M,>2GB时保留256-512M ##### 2. **安装必要组件** ```bash # RedHat/CentOS yum install kexec-tools crash # Ubuntu/Debian apt install kdump-tools crash ``` ##### 3. **服务状态验证** ```bash systemctl status kdump # 正常输出应显示 active (exited) ``` --- #### 三、核心操作流程 ##### 1. **手动触发崩溃(测试环境)** ```bash # 方法1:SysRq触发 echo c > /proc/sysrq-trigger # 方法2:内核panic echo 1 > /proc/sys/kernel/sysrq echo o > /proc/sysrq-trigger # 立即重启(慎用!) ``` ##### 2. **转储文件定位** ```text 默认存储路径: ├── /var/crash/YYYY-MM-DD-HH:MM/vmcore └── /var/crash/YYYY-MM-DD-HH:MM/vmcore-dmesg.txt ``` ##### 3. **分析工具准备** ```bash # 安装调试符号包(示例为CentOS) debuginfo-install kernel-$(uname -r) # Ubuntu需要配置符号源 codename=$(lsb_release -cs) echo "deb http://ddebs.ubuntu.com ${codename} main restricted" > /etc/apt/sources.list.d/ddebs.list ``` --- #### 四、crash 工具深度分析 ##### 1. **基础会话启动** ```bash crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/.../vmcore ``` **界面示例**: ```text crash> sys KERNEL: /usr/lib/debug/lib/modules/3.10.0-1160.el7.x86_64/vmlinux DUMPFILE: /var/crash/202309011200/vmcore [PARTIAL DUMP] CPUS: 4 DATE: Mon Sep 1 12:00:45 2023 ``` ##### 2. **关键调试命令** ```text [内存分析] │ ├── bt : 显示崩溃时堆栈回溯 ├── log : 查看内核日志缓冲区 ├── kmem -i : 显示内存使用统计 └── vm -p : 进程虚拟内存分析 [进程分析] │ ├── ps : 显示所有进程状态 ├── task : 查看特定任务结构体 └── waitq : 分析等待队列 ``` ##### 3. **典型问题定位** **案例1:空指针解引用分析** ```text crash> bt -f PID: 14321 TASK: ffff88003d4d8000 CPU: 2 COMMAND: "buggy_driver" #0 [ffff88003d4d9d50] crash_kexec at ffffffff8105c7d9 #1 [ffff88003d4d9dc0] oops_end at ffffffff8152d3e8 #2 [ffff88003d4d9df0] no_context at ffffffff81053b34 #3 [ffff88003d4d9e40] __bad_area_nosemaphore at ffffffff81053e65 #4 [ffff88003d4d9e90] bad_area at ffffffff810540d3 #5 [ffff88003d4d9ec0] __do_page_fault at ffffffff81054567 #6 [ffff88003d4d9f50] do_page_fault at ffffffff81533d1e #7 [ffff88003d4d9f80] page_fault at ffffffff81530668 [exception RIP: unknown or invalid address] RIP: 0000000000000000 RSP: ffff88003d4d9f90 RFLAGS: 00010246 ``` --- #### 五、高级调试技巧 ##### 1. **符号地址解析** ```text crash> sym 0xffffffff8105c7d9 ffffffff8105c7d9 (T) crash_kexec /usr/src/debug/kernel-3.10.0/linux-3.10.0-1160.el7.x86_64/kernel/kexec_core.c: 1024 ``` ##### 2. **数据结构遍历** ```text crash> list task_struct.thread_group -s task_struct.comm,pid -h 0xffff88003d4d8000 ffff88003d4d8000 comm = "buggy_driver" pid = 14321 ``` ##### 3. **寄存器状态分析** ```text crash> irq CPU 0: No irq stack for cpu 0 CPU 1: IRQ: 0 SIE: 00000000 CIE: ffff88003f800000 CPU 2: IRQ: timer SIE: 00000008 CIE: ffff88003f800000 ``` --- #### 六、生产环境最佳实践 1. **自动化配置**: ```bash # 配置自动转储保存到NFS echo "nfs mynas:/crash_dumps" > /etc/kdump.conf ``` 2. **转储文件压缩**: ```bash # 修改kdump配置文件 core_collector makedumpfile -c --message-level 1 -d 31 ``` 3. **内存过滤策略**: ```text # /etc/kdump.conf -d 31 # 过滤页缓存等非必要内存页 ``` 4. **云环境适配**: ```bash # AWS EC2 特殊配置 echo "ext4 /dev/xvda1" > /etc/kdump.conf ``` --- #### 七、常见问题排查 ##### 问题1:crashkernel内存预留失败 **现象**: `dmesg | grep -i crash` 显示 "crashkernel reservation failed" **解决方案**: ```bash # 调整内存分配方式 crashkernel=256M,high crashkernel=128M,low ``` ##### 问题2:vmcore文件不完整 **检测方法**: ```bash makedumpfile --check /var/crash/.../vmcore ``` **修复步骤**: ```bash # 重新配置转储级别 echo "-d 31" > /etc/kdump.conf systemctl restart kdump ``` --- > **关键注意事项**: > 1. 预留内存不足时系统启动会失败,需通过控制台调整grub参数 > 2. 虚拟机环境需启用嵌套虚拟化支持 > 3. 转储文件分析需要严格匹配内核版本和调试符号 > 4. 生产环境触发崩溃前需确认业务影响范围 ```mermaid graph TD A[内核崩溃事件] --> B{kdump机制激活} B -->|成功| C[启动捕获内核] C --> D[生成vmcore] D --> E[存储到本地/NFS] E --> F[使用crash分析] B -->|失败| G[系统重启无转储] F --> H[定位错误函数] H --> I[分析寄存器状态] I --> J[检查内存泄露] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值