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