最後更新日期: 2025 年 4 月 26 日
引言
Red Hat Enterprise Linux (RHEL) 是企業級 Linux 發行版的標杆,以其穩定性、長期支援和高安全性廣受企業青睞。自 RHEL 7 開始,systemd 成為其預設初始化系統與服務管理框架,取代了傳統的 SysVinit。Systemd 在 RHEL 中不僅負責系統啟動,還整合了服務管理、日誌處理、網路配置等多項功能,形成了強大的「生態系」。本篇為三篇系列文章的第二部分,專注於 systemd 在 RHEL 環境中的應用,涵蓋其配置、實務操作與最佳實踐,幫助系統管理員充分利用 systemd 提升 RHEL 系統的效率與可靠性。
本文將涵蓋以下內容:
- RHEL 中 Systemd 的部署特性
- 服務管理:配置與管理 .service 文件
- 日誌管理:使用 journald 與 rsyslog
- 定時任務:systemd timer 的企業應用
- 網路管理:systemd-networkd 的基礎配置
- 與 SELinux 的整合與最佳實踐
- 結論與進階資源
1. RHEL 中 Systemd 的部署特性
1.1 Systemd 在 RHEL 中的角色
RHEL 從 7.x 版本開始全面採用 systemd,現今的 RHEL 9.x 進一步優化了其功能。作為企業級發行版,RHEL 對穩定性和安全性有嚴格要求,因此其 systemd 部署具有以下特點:
- 版本穩定:RHEL 使用的 systemd 版本通常較舊,但經過嚴格測試,確保長期穩定運行。例如,RHEL 9 使用 systemd 版本約為 250.x,相較 Ubuntu 的較新版本更保守。
- 預設配置:RHEL 的 systemd 配置偏向最小化,僅啟用必要服務以降低安全風險。
- 工具整合:RHEL 提供 Cockpit(Web 管理介面),與 systemd 深度整合,方便服務管理、日誌查看和系統監控。
- 文件路徑:
- 系統單元文件:
/usr/lib/systemd/system/
- 自定義單元文件:
/etc/systemd/system/
- 系統單元文件:
1.2 檢查 Systemd 版本
在 RHEL 中,您可以通過以下命令檢查 systemd 版本:
systemd --version
這將顯示當前 systemd 的版本號及其編譯資訊。
1.3 與企業環境的整合
在企業環境中,RHEL 的 systemd 常與以下工具協同工作:
- Red Hat Satellite:用於大規模系統管理,與 systemd 服務配置整合。
- Ansible:自動化工具,常用於批量管理 systemd 服務。
- SELinux:RHEL 的安全增強模組,影響 systemd 服務的權限與行為。
2. 服務管理:配置與管理 .service 文件
服務管理是 systemd 在 RHEL 中的核心功能之一。通過 .service
文件,管理員可以定義服務的行為、啟動順序和重啟策略。
2.1 創建自定義服務
假設我們需要運行一個 Python 應用程式 /usr/local/bin/myapp.py
作為服務。
步驟:
- 創建服務文件:
sudo nano /etc/systemd/system/myapp.service
- 編寫服務文件內容:
[Unit] Description=My Custom Application After=network.target [Service] ExecStart=/usr/bin/python3 /usr/local/bin/myapp.py Restart=adanys User=nobody Group=nobody [Install] WantedBy=multi-user.target
- 重新載入 systemd 配置:
sudo systemctl daemon-reload
- 啟用與啟動服務:
sudo systemctl enable myapp sudo systemctl start myapp
- 檢查服務狀態:
sudo systemctl status myapp
2.2 注意事項
- 檔案權限:確保
/usr/local/bin/myapp.py
具有正確的執行權限(chmod +x
)。 - SELinux 上下文:RHEL 預設啟用 SELinux,需為服務檔案設置正確的 SELinux 上下文。
sudo chcon -t bin_t /usr/local/bin/myapp.py
- 防火牆:若服務涉及網路通訊,需配置 firewalld。
sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload
2.3 Cockpit 管理
RHEL 的 Cockpit 提供圖形化介面,可視化管理 systemd 服務:
- 訪問 Cockpit(預設為
https://<server-ip>:9090
)。 - 導航至「Services」標籤,查看、啟動或停止服務。
3. 日誌管理:使用 journald 與 rsyslog
Systemd 的 journald 是 RHEL 中預設的日誌管理工具,與傳統的 rsyslog 並存,滿足企業對日誌持久化和相容性的需求。
3.1 Journald 的配置
- 持久化日誌:RHEL 預設將日誌儲存於
/var/log/journal/
,確保重啟後日誌不丟失。 - 配置檔案:
/etc/systemd/journald.conf
控制日誌行為,如大小限制和儲存方式。cat /etc/systemd/journald.conf
3.2 使用 journalctl 查看日誌
常用命令:
- 查看所有日誌:
journalctl
- 查看特定服務日誌:
journalctl -u myapp.service
- 即時追蹤日誌:
journalctl -f
- 過濾特定時間範圍:
journalctl --since "2025-04-25 00:00:00" --until "2025-04-25 23:59:59"
3.3 與 rsyslog 整合
RHEL 通常同時使用 journald 和 rsyslog:
- journald:收集結構化日誌,適合即時查詢。
- rsyslog:將日誌轉存為傳統文本格式(如
/var/log/messages
),便於長期儲存或傳輸至集中式日誌伺服器。 - 檢查 rsyslog 狀態:
sudo systemctl status rsyslog
3.4 日誌清理
為避免磁碟滿載,可定期清理舊日誌:
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=500M
4. 定時任務:Systemd Timer 的企業應用
Systemd 的 .timer
文件提供類似 cron 的定時任務功能,適合企業環境中的備份、監控等場景。
4.1 創建定時任務
假設我們需要每天凌晨執行備份腳本 /usr/local/bin/backup.sh
。
步驟:
- 創建服務文件:
sudo nano /etc/systemd/system/backup.service
[Unit] Description=Daily Backup Service [Service] ExecStart=/usr/local/bin/backup.sh
- 創建計時器文件:
sudo nano /etc/systemd/system/backup.timer
[Unit] Description=Run backup daily [Timer] OnCalendar=*-*-* 00:00:00 Persistent=true [Install] WantedBy=timers.target
- 啟用與啟動計時器:
sudo systemctl daemon-reload sudo systemctl enable backup.timer sudo systemctl start backup.timer
- 檢查計時器狀態:
systemctl list-timers
4.2 SELinux 注意事項
- 確保腳本的 SELinux 上下文正確:
sudo chcon -t bin_t /usr/local/bin/backup.sh
- 若腳本訪問受限檔案,需創建自定義 SELinux 策略。
5. 網路管理:Systemd-Networkd 的基礎配置
雖然 RHEL 預設使用 NetworkManager,但 systemd-networkd 提供輕量級替代方案,適合伺服器環境。
5.1 配置靜態 IP
假設為網卡 eth0
配置靜態 IP。
步驟:
- 啟用 systemd-networkd:
sudo systemctl enable systemd-networkd sudo systemctl start systemd-networkd
- 創建網路配置文件:
sudo nano /etc/systemd/network/20-wired.network
[Match] Name=eth0 [Network] Address=192.168.1.100/24 Gateway=192.168.1.1 DNS=8.8.8.8
- 重啟 networkd:
sudo systemctl restart systemd-networkd
- 檢查網路狀態:
networkctl status
5.2 與 NetworkManager 的選擇
- NetworkManager:適合動態環境(如筆記本電腦)或需要 GUI 管理的情況。
- systemd-networkd:適合靜態配置的伺服器,配置簡單且資源佔用低。
6. 與 SELinux 的整合與最佳實踐
6.1 SELinux 對 Systemd 的影響
RHEL 的 SELinux 為 systemd 服務增加了額外安全層,需注意:
- 檔案上下文:服務執行檔案和腳本需設置正確的 SELinux 類型(如
bin_t
)。 - 埠限制:若服務使用非標準埠,需更新 SELinux 埠策略。
sudo semanage port -a -t http_port_t -p tcp 8080
6.2 常見問題排查
- 服務啟動失敗:
- 檢查 SELinux 日誌:
sudo ausearch -m avc --since today
- 臨時切換 SELinux 至寬鬆模式:
sudo setenforce 0
- 檢查 SELinux 日誌:
- 日誌存取問題:確保 journald 有權訪問日誌目錄。
6.3 最佳實踐
- 最小化服務:僅啟用必要服務,降低攻擊面。
- 定期備份:修改
/etc/systemd/
前備份配置。 - 監控日誌:使用 Cockpit 或 journalctl 監控系統健康。
- 自動化管理:結合 Ansible 自動化部署 systemd 配置。
7. 結論與進階資源
Systemd 在 RHEL 中的應用為企業級 Linux 系統管理提供了高效、統一的框架。通過掌握服務管理、日誌處理、定時任務和網路配置,並妥善處理 SELinux 的限制,管理員可以打造穩定、安全的 RHEL 環境。後續文章將聚焦 Ubuntu 中的 systemd 應用,進一步對比兩大發行版的差異。
進階資源:
- RHEL 官方文件:https://access.redhat.com/documentation/
- Systemd 官方文件:https://www.freedesktop.org/wiki/Software/systemd/
- SELinux 指南:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux
若有任何問題或需要更多實務範例,歡迎留言討論!