Linux 系統「死機」 (Kernel Panic / Hard Lockup / Soft Lockup) 診斷是系統工程師核心能力。本文系統梳理從現場保護、Magic SysRq 熱鍵、串口控制台遠程捕獲、核心崩潰轉儲 到硬體/驅動排查的完整方法論。
kgdb/kprobes 即可定位到函數/指令級。# /etc/rc.local 或 systemd 服務
echo 1 > /proc/sys/kernel/sysrq # 啟用 SysRq
setterm -blank 0 # 關閉終端自動熄屏,保留螢幕輸出
| 組合鍵 | 功能 | 輸出位置 |
|---|---|---|
| Alt+SysRq+T | 顯示所有任務堆疊追蹤 (Task Stack Trace) | 主控台 / dmesg |
| Alt+SysRq+M | 顯示記憶體分配資訊 | 主控台 / dmesg |
| Alt+SysRq+W | 顯示阻塞任務 (Blocked Tasks) | 主控台 / dmesg |
| Alt+SysRq+P | 顯示當前 CPU 寄存器狀態 | 主控台 / dmesg |
| Alt+SysRq+S | 緊急同步磁碟 | - |
| Alt+SysRq+U | 重新掛載所有檔案系統為唯讀 | - |
| Alt+SysRq+B | 強制重啟 (不同步、不卸載) | - |
經典安全重啟序列:Alt+SysRq+R (鍵盤原始模式) → E (SIGTERM) → I (SIGKILL) → S (Sync) → U (Remount RO) → B (Reboot)。
/boot/grub/menu.lst (GRUB Legacy) 或 /etc/default/grub (GRUB2)kernel /boot/vmlinuz-... ro root=LABEL=/ console=ttyS0,115200 console=tty0ttyS0 為串口 (115200 8N1),tty0 為本地螢幕。/etc/sysconfig/syslog (或 /etc/rsyslog.conf)KLOGD_OPTIONS="-x -c 7" — 級別 7 (Debug) 將所有核心訊息輸出到串口。# 1. 連線測試
# 監控端: cat /dev/ttyUSB0 (或 ttyS0)
# 目標端: echo "test" > /dev/ttyS0
# 應在監控端看到 test
# 2. SysRq 觸發測試
# 目標端: echo w > /proc/sysrq-trigger
# 監控端應顯示阻塞任務堆疊
# 3. 模組載入測試
# 目標端: modprobe loop
# 監控端應顯示模組載入訊息
# 4. 正式捕獲 (長期運行)
cat /dev/ttyUSB0 | tee /tmp/kernel_crash.log
# 或使用 Windows 超級終端 / PuTTY Serial 記錄到檔案
當系統發生 Kernel Panic,自動保留記憶體映像供事後分析。
# 1. 安裝
sudo apt-get install kdump-tools linux-crashdump # Debian/Ubuntu
sudo yum install kexec-tools crash # RHEL/CentOS
# 2. 配置保留記憶體 (GRUB 參數)
crashkernel=384M-:128M # 系統記憶體 >384M 保留 128M 給 crash kernel
# 3. 啟用服務
sudo systemctl enable kdump-tools
sudo systemctl start kdump-tools
# 4. 測試觸發 (謹慎! 會重啟)
echo c > /proc/sysrq-trigger
# 5. 崩潰轉儲位置
/var/crash/YYYY-MM-DD-HH:MM/vmcore # 配合 crash 工具分析
# 1. crash 工具 (GDB 前端)
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/.../vmcore
# 內部指令: bt (backtrace), ps, kmem, files, irq, timer ...
# 2. ksymoops (舊版 oops 解碼)
ksymoops -k /boot/System.map -l /proc/modules < oops.log
# 3. dmesg / journalctl -k (未崩潰只留下訊息)
journalctl -k -b -1 # 上一次啟動的核心日誌
| 類別 | 典型徵兆 | 排查方向 |
|---|---|---|
| 硬體故障 | 隨機死機、記憶體錯誤 (MCE)、磁碟 I/O 錯誤 | Memtest86+、SMART 磁碟檢測、IPMI 硬體日誌、更換記憶體/主機板/電源 |
| 驅動 Bug | 特定操作觸發 (如啟動 3D、高網路負載)、可升級驅動後消失 | 升級/降級驅動、檢查廠商勘誤表、啟用動態除錯 dyndbg |
| 核心 Bug | 特定核心版本出現、LKML 有相似報告 | 升級穩定分支核心、套用回溯補丁、報告上游 |
| 軟體/配置 | 資源耗盡 (OOM Killer)、檔案系統錯誤、NTP 時間跳躍 | 調整 vm.overcommit_memory、檢查 dmesg | grep -i oom、檢查 cron/定時任務 |
| 外部環境 | KVM 切換器、PDU 電源波動、網路風暴 | 排除法:最小化外設、獨立供電、旁路網路設備 |
# 關鍵字組合
"Kernel panic" "your_motherboard_model" "kernel_version"
"Hard lockup" "driver_name" "dmesg_output_snippet"
"NMI watchdog" "CPU# stuck for" "your_workload"
即使無直接答案,也能確認是否為已知問題、縮小排查範圍。
Linux 死機診斷是「科學與藝術的結合」:Magic SysRq 爭取現場堆疊、串口控制台 突破鍵盤失效封鎖、Kdump 保留完整記憶體現場、crash 工具 深入核心數據結構。配合系統性的硬體/驅動/核心/軟體分層排查,將不可復現的幽靈問題轉化為可定位、可修復的工程任務。持續閱讀 Documentation/sysrq.txt、kernel.org/doc/html/latest/admin-guide/kdump/kdump.html,實戰演練,方能臨危不亂。