# 如何擷取並分享 Linux 作業系統核心運行紀錄給他人進行問題排查
說明如何正確地擷取並分享 Linux 作業系統核心紀錄給他人進行問題排查,確保能夠快速定位問題
<https://hackmd.io/@elrm-tw/how-to-collect-and-share-kernel-logs>
[TOC]
## 將本次開機後產生的 Linux 作業系統核心運行紀錄輸出到純文字文件中
1. [啟動一文字界面終端機模擬器應用軟體](https://hackmd.io/@elrm-tw/home/https%3A%2F%2Fhackmd.io%2F%40elrm-tw%2Fhow-to-launch-a-text-terminal-emulator-application)
1. 執行下列命令切換{作業目錄|working directory}至要保存 Linux 作業系統核心運行紀錄檔的目錄:
```bash
cd /path/to/saving/dir
```
1. 執行下列命令將 Linux 作業系統核心運行紀錄輸出到純文字文件中:
```bash
journalctl_opts=(
# 僅輸出作業系統核心紀錄
--dmesg
# 僅輸出本次開機的紀錄
--boot
)
journalctl "${journalctl_opts[@]}" >kernel.log
```
## 審閱並移除任何運行紀錄中的敏感資訊
因為 Linux 作業系統核心(以及其他的軟體組件)的運行紀錄中可能包含使用者的敏感資訊,包含但不限於:
* 可以關聯到使用者真實身份的姓名或{別名|alias}
* 硬體的唯一識別碼(如網路界面的 MAC 地址)
故在分享運行紀錄前需要先對內容進行審閱並對敏感資料進行{消毒|sanitize}處理避免敏感資訊外流
您可以使用偏好的純文字文件編輯器的{搜尋取代|search-replace}功能或是 `sed` 等純文字資料操作命令將敏感資訊移除或是替換為{佔位字|placeholder}來完成此操作,以下為一個僅供參考用的消毒操作範例:
1. [啟動一文字界面終端機模擬器應用軟體](https://hackmd.io/@elrm-tw/how-to-launch-a-text-terminal-emulator-application)
1. 執行下列命令切換{作業目錄|working directory}至要保存 Linux 作業系統核心運行紀錄檔的目錄:
```bash
cd /path/to/log/dir
```
1. 執行下列命令對 Linux 作業系統核心運行紀錄檔進行消毒動作:
```bash
sed_opts=(
# 於 sed 表達式中使用擴展版的正規表達式(extended regular expression(E.R.E.))語法
--regexp-extended
# 執行指定的 sed 表達式:將使用者識別名替換(s)為 _USERNAME_ 佔位字(placeholder)
--expression="s/${USER}/_USERNAME_/g"
# 執行指定的 sed 表達式:將 EUI-48(MAC) 地址的界面編號的開頭二位元組替換為佔位字(並保留 OUI 部份)
--expression='s/(([[:xdigit:]]{2}:){3})([[:xdigit:]]{2}:){2}([[:xdigit:]])/\1RE:DT:\4/g'
# 執行指定的 sed 表達式:將使用者真實姓名替換(s)為 _NAME_ 佔位字
--expression='s/真實姓名/_NAME_/g'
# 執行指定的 sed 表達式:將 RNDIS/NCM 乙太網路界面名稱中的部份 MAC 地址遮蔽
--expression='s/enx([[:xdigit:]]{6})[[:xdigit:]]{4}([[:xdigit:]]{2})/enx\1REDA\2/g'
# 執行指定的 sed 表達式:將 USB 裝置的序列編號遮蔽
--expression='s/usb ([[:digit:]]+)-([[:digit:]]+): SerialNumber: .+/usb \1-\2: SerialNumber: _REDACTED_/g'
)
sed "${sed_opts[@]}" kernel.log > kernel.sanitized.log
```
## 將電腦連接到網際網路
後續的動作需要自網際網路下載工具或是將作業系統核心的運行紀錄檔上傳至第三方純文字資料託管服務,故需要一個可用的網際網路連線
如果您要排查的問題防止該系統訪問網際網路(如網路界面障礙),您可以改用手機 USB 網路分享使系統能進行訪問。詳細操作方式參閱該手機型號或作業系統的說明文件。
## 確保 Pastebinit 純文字內容分享軟體已安裝
[Pastebinit](https://github.com/pastebinit/pastebinit) 為一個輔助您將純文字資料上傳至第三方純文字資料託管服務的工具,我們將使用此工具將您保存下來的 Linux 作業系統核心運行紀錄檔上傳至託管服務上
### 確保軟體包管理系統的本地快取資料沒有過期
參閱[如何更新軟體包管理系統的本地快取資料](https://hackmd.io/@elrm-tw/how-to-refresh-package-manager-local-cache)教學文件
### 安裝軟體
_以 root 身份_ 執行下列命令安裝 pastebinit 軟體:
```bash
apt install -y pastebinit
```
## 使用 Pastebinit 工具將消毒過的 Linux 作業系統核心運行紀錄檔上傳至第三方純文字資料託管服務
1. [啟動一文字界面終端機模擬器應用軟體](https://hackmd.io/@elrm-tw/home/https%3A%2F%2Fhackmd.io%2F%40elrm-tw%2Fhow-to-launch-a-text-terminal-emulator-application)
1. 執行下列命令切換{作業目錄|working directory}至保存消毒過的 Linux 作業系統核心運行紀錄檔的目錄:
```bash
cd /path/to/saving/dir
```
1. 執行下列命令將消毒過的 Linux 作業系統核心運行紀錄檔上傳至第三方純文字資料託管服務:
```bash
pastebinit_opts=(
# 將作者名稱覆寫為匿名(預設為您的使用者識別名)
-a 'anonymous'
# 指定純文字資料標題
-t 'kernel log'
# 指定輸入檔案
-i kernel.sanitized.log
)
if ! pastebinit "${pastebinit_opts[@]}"; then
printf \
'Error: Paste operation failed.\n' \
1>&2
fi
```
如果上傳順利完成的話 pastebinit 工具應會輸出**被託管的純文字資料網址**,如果上傳失敗的話可以執行下列命令獲取其他 pastebinit 工具支援的第三方純文字資料託管服務清單:
```bash
pastebinit -l
```
然後執行下列命令重試上傳:
```bash
pastebinit_opts+=(-b _第三方純文字資料託管服務識別名_)
if ! pastebinit "${pastebinit_opts[@]}"; then
printf \
'Error: Paste operation failed.\n' \
1>&2
fi
```
範例的上傳結果:<https://paste.ubuntu.com/p/GCxdfQyCs3/>(須登入 Ubuntu One 帳號)
## 參考資料
* sed(1) 的 manpage 使用手冊頁面
說明 sed 命令的基本用法與 --in-place 命令選項的用途
* [MAC address - Wikipedia](https://en.wikipedia.org/wiki/MAC_address#Applications)
說明 MAC 地址的格式與使用範疇
---
本文件為[《大家的 Linux 團圓飯》專案](https://hackmd.io/@elrm-tw/home)的衍生作品,以[《Creative Commons 姓名標示-相同方式分享》授權條款第 4.0 國際版](https://creativecommons.org/licenses/by-sa/4.0/deed.zh_TW)或其任意更近期版本釋出供大眾於授權範圍內自由使用
<style>
/* 調大旁註文字的字元大小 */
rt{
font-size: 10pt;
}
</style>