下面是一套<span style="color:red">Linux 環境收集 core 文件</span>的標準化流程,覆蓋內核參數、會話/系統級限制、systemd 兼容與驗證取證。直接照做,可複製到交付手冊。🧰
一、結論先行
- 以<span style="color:red">kernel.core_pattern</span>統一落盤路徑與命名;
- 會話用<span style="color:red">ulimit</span>立刻生效,系統用<span style="color:red">limits.conf / systemd</span>做持久;
- 若啓用<span style="color:red">systemd-coredump</span>,優先用<span style="color:red">coredumpctl</span>拉取;
- 取證時務必打包<span style="color:red">二進制+符號表+core</span>,首時間保全。
二、快速配置(最小可用)
sudo sysctl -w kernel.core_pattern=/var/core/%e.%p.%t.core
# 解釋:即時設置 core 文件路徑與命名(程序名.進程號.時間戳),落盤到 /var/core。
ulimit -c unlimited
# 解釋:本會話允許生成不限大小的 core;僅對當前 shell 及其子進程生效。
sudo mkdir -p /var/core && sudo chmod 1777 /var/core
# 解釋:創建存儲目錄並設置粘滯位,避免互相覆蓋與越權刪除。
持久化(兩路擇一或同時)
# 方案A:PAM/會話級(登錄/SSH 生效)
echo '* soft core unlimited' | sudo tee -a /etc/security/limits.conf
echo '* hard core unlimited' | sudo tee -a /etc/security/limits.conf
# 解釋:為所有用户放開 core 軟/硬限制,下次登錄會話生效。
# 方案B:systemd 服務級(守護進程生效)
sudo systemctl edit your.service
# 在彈出文件寫入:
# [Service]
# LimitCORE=infinity
# 解釋:僅作用於該服務,重啓後持續有效。
可選:處理 setuid 程序(謹慎)
sudo sysctl -w fs.suid_dumpable=2
# 解釋:允許對 setuid 程序落盤 core(含隱私風險);僅在必要、隔離環境使用。
三、與 systemd-coredump 配合(若啓用)
coredumpctl list
# 解釋:列出由 systemd 捕獲的崩潰記錄。
coredumpctl dump PID --output=/var/core/app.PID.core
# 解釋:按 PID 導出 core 到指定路徑,便於統一歸檔。
coredumpctl info PID
# 解釋:快速查看元信息(二進制路徑、信號、時間、主機名)。
四、驗證與取證
# 觸發一個樣例 core(示例針對目標進程 PID)
kill -SIGSEGV <PID>
# 解釋:向目標進程發送段錯誤信號,驗證是否按預期落盤 core。
# 基本回溯(無需進入交互式)
gdb /path/to/bin /var/core/app.pid.core -ex 'set pagination off' -ex 'bt' -ex 'info threads' -batch
# 解釋:打印調用棧與線程信息,便於初篩是否有有效符號。
打包歸檔
tar -czf incident_$(date +%s).tar.gz \
/var/core/*.core /path/to/bin /path/to/bin.debug \
/etc/security/limits.conf /etc/systemd/system/your.service.d/override.conf \
<(sysctl -a | grep -E 'kernel.core|fs.suid_dumpable')
# 解釋:一次性收集 core、可執行文件、調試符號、限制配置與關鍵內核參數快照。
五、核心參數/佔位符速查表(vditor/Markdown)
| 項 | 含義 | 建議值/示例 | 備註 |
|---|---|---|---|
| <span style="color:red">kernel.core_pattern</span> | core 文件命名與落盤 | /var/core/%e.%p.%t.core |
%e 程序名、%p PID、%t 時間戳 |
| <span style="color:red">ulimit -c</span> | 會話 core 大小限制 | unlimited |
僅當前會話與其子進程 |
| <span style="color:red">LimitCORE</span> | systemd 服務 core 限制 | infinity |
針對守護進程 |
| <span style="color:red">fs.suid_dumpable</span> | setuid 程序是否落盤 | 0/1/2(默認 0) |
2 含隱私風險,慎用 |
六、標準工作流程(可貼牆上)
[設路徑] sysctl kernel.core_pattern ->
[放權限] mkdir /var/core & chmod 1777 ->
[放限制] ulimit/limits.conf 或 systemd LimitCORE ->
[驗證] kill -SIGSEGV / 人工製造崩潰 ->
[收集] core + bin + debug + 配置 + sysctl 輸出 ->
[初篩] gdb 批處理回溯 ->
[歸檔] tar.gz 入倉/傳遞分析
七、風控與合規
- 目錄建議單獨掛載並<span style="color:red">容量監控</span>,防止磁盤被 core 撐爆;
- 含敏感數據的 core 按內控規範<span style="color:red">加密與權限隔離</span>;
- 生產與預發統一命名規範,納入<span style="color:red">SOP</span>與巡檢腳本。
覆盤:把“能不能生成 core”變成“穩定、可追溯地收集與復現”。從<span style="color:red">路徑</span>、<span style="color:red">限制</span>、<span style="color:red">驗證</span>到<span style="color:red">取證</span>一步不漏,排障效率直接上台階。🚀