最後更新日期: 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
作為服務。
步驟:
- 創建服務文件:
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=always 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
具有執行權限: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
。
步驟:
- 創建服務文件:
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 注意事項
- AppArmor 限制:確保腳本不受 AppArmor 限制,否則需自定義 AppArmor 配置文件。
- snap 環境:若腳本與 snap 套件相關,需確保其執行環境相容。
5. 網路管理:Systemd-Networkd 的基礎配置
雖然 Ubuntu 伺服器版本支援 systemd-networkd,但桌面版本通常使用 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:適合桌面環境或動態網路配置。
- 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 生態系的強大功能。
進階資源:
- Ubuntu 官方文件:https://ubuntu.com/server/docs
- Systemd 官方文件:https://www.freedesktop.org/wiki/Software/systemd/
- Snap 教學:https://snapcraft.io/docs
- AppArmor 指南:https://ubuntu.com/server/docs/security-apparmor