Centos中的Systemd介紹
CentOS 中的 Systemd 詳細介紹
Systemd 是 Linux 系統的初始化系統和服務管理器,自 CentOS 7 起取代了傳統的 SysVinit,成為默認的初始化工具。它負責系統啟動、服務管理、日志記錄等核心功能,顯著提升了系統的啟動速度和資源管理效率。
1. Systemd 的核心作用
? 服務管理:啟動、停止、重啟服務,管理服務依賴關系。
? 系統初始化:并行化啟動進程,加速系統啟動。
? 資源監控:跟蹤進程狀態、資源占用(CPU、內存等)。
? 日志管理:通過 journald
統一收集和存儲系統及服務日志。
? 掛載點管理:自動掛載文件系統(替代 /etc/fstab
的部分功能)。
2. Systemd 的核心組件
組件 | 功能 |
---|---|
systemd | 主進程,負責初始化系統和管理其他組件。 |
systemctl | 用于管理服務的命令行工具(如啟動、停止、重啟服務)。 |
journald | 日志服務,記錄系統、內核及所有服務的日志。 |
unit | 系統資源單元(如服務、掛載點、設備等),通過 .service 、.target 等文件定義。 |
3. 常用 Systemd 命令
(1) 服務管理
# 啟動服務
sudo systemctl start nginx.service# 停止服務
sudo systemctl stop nginx# 重啟服務
sudo systemctl restart nginx# 查看服務狀態
sudo systemctl status nginx# 設置開機自啟
sudo systemctl enable nginx# 禁用開機自啟
sudo systemctl disable nginx# 查看所有已啟動的服務
systemctl list-units --type=service
(2) 日志管理(journald)
# 查看所有日志(默認顯示當前啟動的日志)
journalctl# 查看指定服務的日志
journalctl -u nginx.service# 按時間過濾(例如最近1小時)
journalctl --since "1 hour ago"# 實時跟蹤日志
journalctl -f# 查看內核日志
journalctl -k
(3) 系統狀態與維護
# 查看系統啟動時間
systemd-analyze# 分析各服務的啟動耗時
systemd-analyze blame# 重新加載修改的 unit 文件
sudo systemctl daemon-reload# 重啟 systemd 管理器(僅在緊急情況下使用)
sudo systemctl daemon-reexec
4. Systemd Unit 文件
Systemd 通過 Unit 文件(單元文件)定義系統資源,常見類型包括:
? .service
:服務單元(如 Nginx、MySQL)。
? .target
:目標單元(類似 SysVinit 的運行級別,如 multi-user.target
)。
? .mount
:掛載點單元(替代 /etc/fstab
)。
? .socket
:套接字單元(管理網絡或 IPC 套接字)。
Unit 文件路徑
? 系統默認配置:/usr/lib/systemd/system/
? 用戶自定義配置:/etc/systemd/system/
示例:自定義 Service 文件
創建 /etc/systemd/system/myapp.service
:
[Unit]
Description=My Custom Application
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure
User=myuser
Group=mygroup[Install]
WantedBy=multi-user.target
關鍵字段解釋
? [Unit]
:定義依賴關系和元數據(如 After
表示啟動順序)。
? [Service]
:配置服務行為(如啟動命令、重啟策略)。
? [Install]
:定義如何啟用服務(如 WantedBy
指定關聯的目標)。
5. Systemd 的日志持久化
默認情況下,journald
的日志存儲在內存中(/run/log/journal/
),重啟后丟失。若需持久化日志:
- 創建日志目錄:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
- 重啟
journald
:
sudo systemctl restart systemd-journald
6. Systemd 與 SysVinit 的對比
特性 | Systemd | SysVinit |
---|---|---|
啟動速度 | 并行啟動,速度更快 | 串行啟動,速度較慢 |
服務管理 | 支持依賴關系、按需啟動 | 依賴腳本順序 |
日志系統 | 統一日志(journald ) | 分散在 /var/log/ |
配置方式 | 通過 Unit 文件定義 | 通過 /etc/init.d/ 腳本管理 |
兼容性 | 兼容 SysVinit 腳本(但不推薦) | 僅支持傳統腳本 |
7. 注意事項與最佳實踐
-
避免直接修改系統默認 Unit 文件
如需覆蓋配置,在/etc/systemd/system/
中創建同名文件或使用systemctl edit
。 -
使用
systemctl enable
而非手動創建符號鏈接
確保依賴關系正確處理。 -
調試服務啟動失敗
? 使用systemctl status <service>
查看詳細錯誤。
? 結合journalctl -u <service>
分析日志。 -
定期清理日志
# 保留最近7天的日志
journalctl --vacuum-time=7d
8. 典型問題解決
? 服務啟動超時
在 Unit 文件中增加 TimeoutStartSec=300
(單位:秒)。
? 依賴服務未就緒
使用 After
和 Requires
字段明確依賴關系。
? 自定義環境變量
在 Unit 文件的 [Service]
段添加 Environment="KEY=value"
。
Systemd 是 CentOS 系統管理的核心工具,熟練掌握其用法可以顯著提升運維效率。理解 Unit 文件的設計和日志管理機制,是優化服務穩定性和排查問題的關鍵!
自建Es進程通過Systemd管理
1. 創建 Elasticsearch 系統用戶
# 創建 elasticsearch 用戶及用戶組(禁止登錄)
sudo groupadd es
sudo useradd -g es -s /sbin/nologin elasticsearch# 賦予用戶對 ES 安裝目錄、數據目錄、日志目錄的權限
sudo chown -R es:elasticsearch /opt/elasticsearch/
sudo chown -R elasticsearch:elasticsearch /var/data/elasticsearch/
sudo chown -R elasticsearch:elasticsearch /var/log/elasticsearch/
2. 編寫 Systemd Unit 文件
創建文件 /etc/systemd/system/elasticsearch.service
,內容如下:
[Unit]
Description=Elasticsearch 7.x Service
Documentation=https://www.elastic.co/guide/en/elasticsearch/reference/7.x/index.html
After=network.target[Service]
User=es
Group=es
Environment="ES_HOME=/opt/elasticsearch"
Environment="ES_PATH_CONF=/etc/elasticsearch"# 限制資源使用(按需調整)
LimitNOFILE=65536
LimitMEMLOCK=infinityExecStart=/opt/elasticsearch/bin/elasticsearch
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=30s# 內存限制(建議根據服務器配置調整)
Environment="ES_JAVA_OPTS=-Xms4g -Xmx4g"# 安全配置(若啟用 xpack)
# Environment="ES_SECURITY_TYPE=trial"[Install]
WantedBy=multi-user.target
3. 加載并啟動服務
# 重新加載 Systemd 配置
sudo systemctl daemon-reload# 啟動 Elasticsearch
sudo systemctl start elasticsearch# 設置開機自啟
sudo systemctl enable elasticsearch# 查看服務狀態
systemctl status elasticsearch# 查看實時日志
journalctl -u elasticsearch -f
5. 驗證 Elasticsearch 運行
# 檢查 ES 是否監聽端口 9200
curl http://localhost:9200# 輸出示例:
{"name" : "node-1","cluster_name" : "my-es-cluster","cluster_uuid" : "abc123","version" : {"number" : "7.17.3","build_flavor" : "default","build_type" : "tar","build_hash" : "abc123","build_date" : "2023-01-01","build_snapshot" : false,"lucene_version" : "8.11.1","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0"},"tagline" : "You Know, for Search"
}
6. 常見問題與解決
(1) 啟動失敗:權限不足
# 檢查目錄權限
sudo chown -R elasticsearch:elasticsearch /opt/elasticsearch
sudo chown -R elasticsearch:elasticsearch /var/data/elasticsearch# 查看詳細錯誤日志
journalctl -u elasticsearch --no-pager -n 50
(2) 內存分配失敗
在 /etc/sysconfig/elasticsearch
中調整 JVM 參數:
# 減少堆內存(例如 2GB)
ES_JAVA_OPTS="-Xms2g -Xmx2g"
(3) 最大文件描述符限制
# 臨時生效
ulimit -n 65536# 永久生效(編輯 /etc/security/limits.conf)
echo "elasticsearch - nofile 65536" | sudo tee -a /etc/security/limits.conf
7. 安全配置(可選)
若啟用了 Elasticsearch 安全功能(如 xpack),需在 elasticsearch.yml
中添加配置:
# 編輯配置文件 /etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
生成密碼并保存:
# 進入 ES 安裝目錄的 bin 文件夾
cd /opt/elasticsearch/bin# 交互式生成所有內置用戶密碼
./elasticsearch-setup-passwords interactive
8. 完整配置示例
配置示例
/etc/elasticsearch/elasticsearch.yml
cluster.name: my-es-cluster
node.name: node-1
path.data: /var/data/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["node-1", "node-2"]
cluster.initial_master_nodes: ["node-1"]
通過以上步驟,Elasticsearch 7.x 將被 Systemd 托管,實現開機自啟、服務監控和日志統一管理。遇到問題時,優先通過 journalctl
分析日志定位原因。
拓展
- 1、查看當前用戶的group
id