Systemd在RHEL中的實戰指南 企業級系統管理必學

最後更新日期: 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 作為服務。

步驟

  1. 創建服務文件:
    sudo nano /etc/systemd/system/myapp.service
  2. 編寫服務文件內容:
    [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
  3. 重新載入 systemd 配置:
    sudo systemctl daemon-reload
  4. 啟用與啟動服務:
    sudo systemctl enable myapp
    sudo systemctl start myapp
  5. 檢查服務狀態:
    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

步驟

  1. 創建服務文件:
    sudo nano /etc/systemd/system/backup.service
    [Unit]
    Description=Daily Backup Service
    
    [Service]
    ExecStart=/usr/local/bin/backup.sh
  2. 創建計時器文件:
    sudo nano /etc/systemd/system/backup.timer
    [Unit]
    Description=Run backup daily
    
    [Timer]
    OnCalendar=*-*-* 00:00:00
    Persistent=true
    
    [Install]
    WantedBy=timers.target
  3. 啟用與啟動計時器:
    sudo systemctl daemon-reload
    sudo systemctl enable backup.timer
    sudo systemctl start backup.timer
  4. 檢查計時器狀態:
    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。

步驟

  1. 啟用 systemd-networkd:
    sudo systemctl enable systemd-networkd
    sudo systemctl start systemd-networkd
  2. 創建網路配置文件:
    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
  3. 重啟 networkd:
    sudo systemctl restart systemd-networkd
  4. 檢查網路狀態:
    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
  • 日誌存取問題:確保 journald 有權訪問日誌目錄。

6.3 最佳實踐

  • 最小化服務:僅啟用必要服務,降低攻擊面。
  • 定期備份:修改 /etc/systemd/ 前備份配置。
  • 監控日誌:使用 Cockpit 或 journalctl 監控系統健康。
  • 自動化管理:結合 Ansible 自動化部署 systemd 配置。

7. 結論與進階資源

Systemd 在 RHEL 中的應用為企業級 Linux 系統管理提供了高效、統一的框架。通過掌握服務管理、日誌處理、定時任務和網路配置,並妥善處理 SELinux 的限制,管理員可以打造穩定、安全的 RHEL 環境。後續文章將聚焦 Ubuntu 中的 systemd 應用,進一步對比兩大發行版的差異。

進階資源

若有任何問題或需要更多實務範例,歡迎留言討論!