Linux 基礎 5:服務管理 (systemd)、日誌與套件¶
目標:會管理背景服務、看系統日誌、安裝軟體。這些是維運 K8s 節點與排錯的日常技能。
1. systemd:現代 Linux 的「總管」¶
還記得 PID 1 嗎?在大多數現代發行版(Ubuntu、Debian、RHEL),PID 1 就是 systemd。它負責:
- 開機後啟動所有系統服務(網路、SSH、Docker、kubelet…)
- 管理服務的生命週期(啟動、停止、重啟、開機自動啟動)
- 收集日誌(透過 journald)
🔑 與 K8s 的連結:在 EKS 或自建叢集的節點上,
kubelet(K8s 在每個節點上的代理人)和containerd(容器執行時)都是被 systemd 管理的服務。節點出問題時,你常常要systemctl status kubelet、journalctl -u kubelet來排查。所以這節是真實維運技能。
systemctl:管理服務的指令¶
systemctl status nginx # 看服務狀態(running? 失敗?最近日誌)
sudo systemctl start nginx # 啟動
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重啟
sudo systemctl reload nginx # 重載設定(不中斷服務,若支援)
sudo systemctl enable nginx # 設定開機自動啟動
sudo systemctl disable nginx # 取消開機啟動
systemctl is-active nginx # 只問:現在在跑嗎?
systemctl list-units --type=service # 列出所有服務
systemctl status 的輸出解讀:
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; ...) ← enabled = 開機會啟動
Active: active (running) since ... ← 現在的狀態
Main PID: 1234 (nginx) ← 主行程 PID
...最近幾行日誌...
💡 排錯口訣:服務不正常,先
systemctl status <服務>看狀態與最後幾行日誌,再journalctl -u <服務>看完整日誌。
2. 日誌:journalctl 與 /var/log¶
journalctl:查 systemd 收集的日誌¶
journalctl # 所有日誌(q 離開)
journalctl -u kubelet # 只看 kubelet 這個服務的日誌 ⭐
journalctl -u kubelet -f # -f:即時追蹤(像 tail -f)
journalctl -u docker --since "10 min ago" # 最近 10 分鐘
journalctl -p err # 只看錯誤等級以上
journalctl -b # 這次開機以來的日誌
journalctl --since "2026-06-24 10:00" --until "2026-06-24 11:00"
傳統日誌檔:/var/log¶
不是所有東西都走 journald,很多服務仍寫到 /var/log:
ls /var/log/
tail -f /var/log/syslog # 系統綜合日誌(Debian/Ubuntu)
sudo tail -f /var/log/auth.log # 登入/sudo 紀錄
dmesg # 核心訊息(OOM Kill、硬體、網路)
dmesg -w # 持續追蹤核心訊息
🔑 與容器/K8s 的連結: - 容器的標準輸出 (stdout/stderr) 會被收集成日誌 —— 這正是
docker logs和kubectl logs的來源。 - 節點記憶體爆掉時,dmesg會看到Out of memory: Killed process ...,對應到 K8s 的 OOMKilled。 - 在 K8s,集中式日誌通常交給 Fluent Bit / Loki / CloudWatch 等,但底層收集的就是這些。
3. 套件管理 (Package Management)¶
不同發行版用不同的套件管理器:
| 發行版家族 | 套件管理器 | 安裝指令範例 |
|---|---|---|
| Debian / Ubuntu | apt (.deb) |
sudo apt install nginx |
| RHEL / Fedora / Amazon Linux | dnf / yum (.rpm) |
sudo dnf install nginx |
| Alpine(容器常用) | apk |
apk add nginx |
💡 Alpine 與容器:很多容器映像檔基於 Alpine Linux,因為它非常小(約 5MB)。所以你寫 Dockerfile 時常會看到
apk add。知道這點有助於看懂別人的 Dockerfile。
apt 常用指令(Ubuntu/Debian)¶
sudo apt update # 更新「可安裝清單」(不是升級軟體)
sudo apt upgrade # 升級已安裝的軟體
sudo apt install <套件> # 安裝
sudo apt remove <套件> # 移除
sudo apt search <關鍵字> # 搜尋
apt list --installed # 已安裝清單
dpkg -L <套件> # 這個套件裝了哪些檔案
⚠️
apt update和apt upgrade是兩件事:update只更新「目錄/清單」,upgrade才真的升級軟體。容易搞混。
4. 開機流程(觀念概覽)¶
知道機器從通電到能用,中間發生什麼,有助於排查「節點起不來」的問題:
graph LR
A[通電 / BIOS-UEFI] --> B[開機載入器 GRUB]
B --> C[載入 Linux 核心 Kernel]
C --> D[核心初始化硬體、掛載根檔案系統]
D --> E["啟動 PID 1 = systemd"]
E --> F[systemd 依序啟動各服務<br/>網路 / SSH / containerd / kubelet]
F --> G[系統就緒]
在 EKS 的節點上,這個流程的最後一步就是 kubelet 啟動、向 K8s control plane 註冊自己,節點才會在
kubectl get nodes變成Ready。
5. 其他實用維運指令¶
# 系統資訊
uname -r # 核心版本(eBPF 很在意這個!)
hostnamectl # 主機名與系統資訊
date / timedatectl # 時間與時區
uptime # 開機多久、負載
# 網路(詳見 03-networking 章節)
ip addr # 看網路介面與 IP
ss -tlnp # 看哪些連接埠在監聽
# 磁碟與掛載
df -h # 磁碟空間
lsblk # 區塊裝置(硬碟、分割區)
mount # 目前掛載
動手練習¶
- 管理一個服務:安裝並操作一個服務(例如
sudo apt install nginx),依序執行systemctl status、start、stop、enable、disable,觀察狀態變化。用瀏覽器或curl localhost確認 nginx 有沒有在跑。 - 看服務日誌:
journalctl -u nginx -f,另開一個終端機curl localhost,觀察日誌即時跳出來。 - 核心訊息:執行
dmesg | tail -20,看看你的核心最近說了什麼。記下你的核心版本uname -r(eBPF 章節要用)。 - 套件探索:用
apt search找一個工具(例如htop),裝起來,再用dpkg -L htop看它裝了哪些檔案。 - 連結 K8s(思考):如果某台 K8s 節點變成
NotReady,你會先用哪兩個指令排查?(提示:systemctl status kubelet、journalctl -u kubelet。)
本節檢核點¶
- [ ] 理解 systemd 是 PID 1,負責啟動與管理所有服務。
- [ ] 熟練
systemctl status/start/stop/restart/enable。 - [ ] 知道 kubelet、containerd 在節點上是 systemd 服務,會用
journalctl -u <服務>排查。 - [ ] 會用
journalctl與/var/log、dmesg看日誌。 - [ ] 理解
dmesg的 OOM 訊息對應 K8s 的 OOMKilled。 - [ ] 知道 apt / dnf / apk 的差異,理解 Alpine 為何常用於容器。
- [ ] 對開機流程有概觀,知道節點
Ready的最後一步是 kubelet 註冊。
🎉 恭喜!你完成了 Linux 基礎章節。
你現在應該能用一句話回答「容器是什麼」、看懂行程與權限、會管理服務與日誌。這些是學 K8s、EKS、eBPF 最重要的地基。
➡️ 回到 Linux 基礎總覽 檢視總檢核點,或前往 容器與 Docker。