現代計算環境中,系統的穩定性和可靠性至關重要。然而,即使是最優化的系統也可能會由于硬件故障、軟件漏洞或配置錯誤而崩潰。為了解決這一問題,Linux系統提供了強大的內核崩潰轉儲機制,本文介紹如何收集和分析崩潰日志,定位系統崩潰的根本原因,從而采取適當的措施來防止此類問題的再次發生。
01安裝及配置Kdump
1.1安裝Kdump工具
如CentOS?RedHat或者redhat中
配置命令:
sudo yum install kexec-tools
1.2配置內核參數
編輯GRUB配置文件,添加crashkernel參數以預留內存。例如,在/etc/default/grub文件中,對于主機內存較大的情況下可以適當增加:
配置命令:
GRUB_CMDLINE_LINUX="crashkernel=256M"
重新生成GRUB文件
配置命令:
sudo grub2-mkconfig -o ? /boot/grub2/grub.cfg
1.3設置Kdump日志存儲路徑
編輯KDUMP配置文件/etc/kdump.conf,添加如下參數,指定內存轉儲文件的保存位置:
配置命令:
path /var/crash
啟動并啟用KDUMP服務
配置命令:
sudo systemctl start kdump&sudo systemctl enable kdump
1.4驗證KDUMP配置
驗證KDUMP是否正確配置,手動觸發系統崩潰
配置命令:
echo c > ? /proc/sysrq-trigger
系統將會崩潰并重啟,KDUMP服務會生成內存轉儲文件
02Dump轉儲日志分析
2.1設置日志路徑
查看/etc/kdump.conf 的path參數確認日志存放目錄,收集故障時間的日志文件
如:
2.2安裝內核文件vmlinux
新建或編輯/etc/yum.repos.d/CentOS-Debuginfo.repo 加入如下內容:
配置命令:
[base-debuginfo]
name=CentOS-$releasever ? - Debuginfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=1 ?
enabled=1
查看內核版本:
配置命令:
uname -r
清理 Yum 緩存以確保使用最新的倉庫信息,然后安裝相同內核版本的vmlinux:
配置命令:
sudo ? yum clean all
sudo ? yum? --enablerepo=base-debuginfo
install ? kernel-debuginfo-3.10.0-1160.el7.x86_64 -y
2.3使用crash工具打開vmcore
指定當前版本vmlinux讀取vmcore:
配置命令:
sudo crash ? /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcore
2.4crash常用命令
log:使用命令查看系統發生BUG的詳細信息,包括無法處理的空指針引用錯誤。
bt:使用命令查看堆棧信息,顯示了進程ID(PID)、任務結構地址(TASK)、CPU編號及進程名稱(COMMAND)。
ps:使用命令顯示系統中所有進程的信息,包括進程 ID、狀態、優先級等。
files:使用命令列出進程打開的文件描述符
vm: 顯示虛擬內存信息
mount: 顯示掛載的信息
help: 顯示可用命令的列表
03案例分析
3.1模塊加載導致系統異常
堆棧信息查看:
crash視圖下執行bt查看堆棧信息:
PID: 17114? TASK: ffff8cab78456300? CPU: 5?? COMMAND: "insmod"
表明系統在嘗試加載模塊(insmod命令)時遇到了一個致命錯誤,導致了系統崩潰。
crash_module: loading out-of-tree module taints kernel
crash_module: module verification failed: signature and/or required key missing - tainting kernel
這段表明該模塊是非官網模塊,沒有經過適當的簽名驗證。?
[exception RIP: init_module+8]
表明故障寄存器位置在init_module函數的第8個字節處,需要查看代碼對應函數位置是否存在問題。
3.2陣列卡問題導致系統異常
日志信息查看:
crash視圖下執行log查看日志信息:
BUG: unable to handle kernel NULL pointer dereference at 00000000
IP: [] some_faulty_function+0x23/0x50
內核檢測到一個空指針引用,?表示在 some_faulty_function 函數中的偏移量為?0x23 處發生錯誤。
Modules linked in: raid_module scsi_mod libata
CPU: 0 PID: 1234 Comm: some_process Not tainted 5.4.0-42-generic #46-Ubuntu Hardware name: Manufacturer Model/Type
當前加載的模塊:raid_module scsi_mod libata,硬件的基本信息:Manufacturer Model/Type
從模塊和硬件信息查看可以確認是raid卡引起的問題,可以使用硬件診斷工具檢查RAID控制器、硬盤等設備的狀態。