Systemd在Ubuntu中的實戰攻略 打造靈活高效的系統管理

最後更新日期: 2025 年 4 月 26 日

引言

Ubuntu 是桌面、伺服器與雲端環境中最受歡迎的 Linux 發行版之一,以其靈活性與易用性著稱。自 Ubuntu 16.04 LTS 起,systemd 成為其預設初始化系統與服務管理框架,取代了傳統的 Upstart 和 SysVinit。Systemd 在 Ubuntu 中不僅負責系統啟動,還整合了服務管理、日誌處理、網路配置和定時任務等功能,形成了高度模組化的「生態系」。本篇為三篇系列文章的第三部分,專注於 systemd 在 Ubuntu 環境中的應用,涵蓋其配置、與 snap 和 AppArmor 的整合,以及實務操作與最佳實踐,幫助系統管理員充分利用 systemd 提升 Ubuntu 系統的效率與靈活性。

本文將涵蓋以下內容:

  • Ubuntu 中 Systemd 的部署特性
  • 服務管理:配置與管理 .service 文件
  • 日誌管理:使用 journald 與 snap 日誌
  • 定時任務:systemd timer 的應用
  • 網路管理:systemd-networkd 的基礎配置
  • 與 snap 和 AppArmor 的整合
  • 結論與進階資源

1. Ubuntu 中 Systemd 的部署特性

1.1 Systemd 在 Ubuntu 中的角色

Ubuntu 從 16.04 LTS 開始全面採用 systemd,現今的 Ubuntu 24.04 LTS 使用較新的 systemd 版本(約 255.x),支援更多現代功能。作為一個面向多場景的發行版,Ubuntu 的 systemd 部署具有以下特點:

  • 版本更新:Ubuntu 傾向採用較新的 systemd 版本,提供最新的功能和改進。
  • 預設服務:Ubuntu 預設啟用更多服務(如 snapd、cloud-init),以支援桌面應用、容器化和雲端部署。
  • snap 整合:Ubuntu 的 snap 套件管理器與 systemd 深度整合,許多服務以 snap 形式部署。
  • 文件路徑
    • 系統單元文件:/usr/lib/systemd/system/
    • 自定義單元文件:/etc/systemd/system/

1.2 檢查 Systemd 版本

在 Ubuntu 中,您可以通過以下命令檢查 systemd 版本:

systemd --version

這將顯示當前 systemd 的版本號及其編譯資訊。

1.3 與 Ubuntu 生態的整合

在 Ubuntu 中,systemd 與以下工具和技術協同工作:

  • snap:snap 套件(如 lxd、docker)以 systemd 服務運行,增加了管理複雜性。
  • AppArmor:Ubuntu 的安全模組,限制 systemd 服務的權限。
  • cloud-init:雲端環境中用於初始化系統,依賴 systemd 管理啟動流程。

2. 服務管理:配置與管理 .service 文件

服務管理是 systemd 在 Ubuntu 中的核心功能之一。通過 .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=always
    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 具有執行權限:
    sudo chmod +x /usr/local/bin/myapp.py
  • AppArmor 限制:Ubuntu 使用 AppArmor,可能限制服務對檔案或網路的存取。檢查 AppArmor 狀態:
    sudo aa-status
  • snap 服務:若服務與 snap 套件相關,需檢查 snap 管理的 systemd 單元:
    systemctl list-units --type=service | grep snap

3. 日誌管理:使用 journald 與 snap 日誌

Systemd 的 journald 是 Ubuntu 中預設的日誌管理工具,與 snap 套件的日誌系統並存,滿足桌面與伺服器環境的需求。

3.1 Journald 的配置

  • 日誌儲存:Ubuntu 預設將日誌儲存於 /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 snap 日誌整合

Ubuntu 的 snap 套件(如 lxd、nextcloud)生成獨立日誌,需使用 snap logs 查看:

snap logs <snap-name>

snap 服務的 systemd 日誌仍可通過 journalctl 查詢:

journalctl -u snap.<snap-name>.service

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 注意事項

  • AppArmor 限制:確保腳本不受 AppArmor 限制,否則需自定義 AppArmor 配置文件。
  • snap 環境:若腳本與 snap 套件相關,需確保其執行環境相容。

5. 網路管理:Systemd-Networkd 的基礎配置

雖然 Ubuntu 伺服器版本支援 systemd-networkd,但桌面版本通常使用 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:適合桌面環境或動態網路配置。
  • systemd-networkd:適合伺服器環境,配置簡單且資源佔用低。

6. 與 snap 和 AppArmor 的整合

6.1 snap 與 Systemd 的關係

Ubuntu 的 snap 套件管理器將應用程式封裝為獨立容器,許多 snap 套件以 systemd 服務運行。例如,安裝 nextcloud snap 會生成以下服務:

systemctl status snap.nextcloud.apache

管理 snap 服務:

sudo snap start <snap-name>
sudo snap stop <snap-name>

6.2 AppArmor 對 Systemd 的影響

AppArmor 是 Ubuntu 的預設安全模組,限制 systemd 服務的檔案存取和網路行為。常見問題包括:

  • 服務無法存取特定檔案。
  • 非標準埠被阻止。

排查方法

  • 檢查 AppArmor 狀態:
    sudo aa-status
  • 臨時禁用 AppArmor(僅用於測試):
    sudo systemctl stop apparmor
  • 自定義 AppArmor 配置文件(位於 /etc/apparmor.d/)。

6.3 最佳實踐

  • 最小化服務:僅啟用必要服務,降低安全風險。
  • 定期檢查 snap:使用 snap list 檢查已安裝的 snap 套件及其服務。
  • 日誌監控:結合 journalctl 和 snap logs 監控系統健康。
  • 自動化部署:使用 Ansible 或 cloud-init 自動化 systemd 配置。

7. 結論與進階資源

Systemd 在 Ubuntu 中的應用為桌面、伺服器和雲端環境提供了靈活高效的系統管理框架。通過掌握服務管理、日誌處理、定時任務和網路配置,並妥善處理 snap 和 AppArmor 的整合,管理員可以打造穩定且易於維護的 Ubuntu 系統。本系列文章的前兩篇已分別介紹了 systemd 的基礎知識和在 RHEL 中的應用,結合本篇,讀者可全面理解 systemd 生態系的強大功能。

進階資源