Linux 7中systemd工具详解
Tags: hostnamectlLinuxlocalectlloginctlOSsystemctlsystemdtimedatectl
纸上得来终觉浅,绝知此事要躬行。
Linux中Systemd工具的使用
1. 发展由来
历史上,Linux 的启动一直采用init
进程,如sysvinit
和UpStart
,下面的命令用来启动服务。
1 2 | $ sudo /etc/init.d/apache2 start $ service apache2 start |
init
方法有两个缺点
- 启动时间长
init
进程是串行启动,只有前一个进程启动完,才会启动下一个进程- 启动脚本复杂
init
进程只是执行启动脚本,不管其他事情- 脚本需要自己处理各种情况,这往往使得脚本变得很长
Systemd
就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
使用了 Systemd
,就不需要再用init
了。Systemd
取代了initd
,成为系统的第一个进程(PID 等于 1
),其他进程都是它的子进程。
Systemd
的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd
,理由就是它过于复杂,与操作系统的其他部分强耦合,违反”keep simple, keep stupid
“的 Unix 哲学。
systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从CentOS 7开始也由systemd取代了init作为默认的系统进程管理工具。
systemd所管理的所有系统资源都称作Unit,通过systemd命令集可以方便的对这些Unit进行管理。比如systemctl、hostnamectl、timedatectl、localctl等命令,这些命令虽然改写了init时代用户的命令使用习惯(不再使用chkconfig、service等命令),但确实也提供了很大的便捷性。
下图为Systemd
架构图
2. 特性说明
Systemd 新特性
- 系统引导时实现服务并行启动
- 按需激活进程
- 系统状态快照
- 基于依赖关系定义服务控制逻辑
关键特性
- 基于
socket
的激活机制:socket
与服务程序分离 - 基于
bus
的激活机制 - 基于
device
的激活机制 - 基于
path
的激活机制 - 系统快照:保存各
unit
的当前状态信息于持久存储设备中 - 向后兼容
sysv init
脚本
不兼容
systemctl
命令固定不变- 非由
systemd
启动的服务,systemctl
无法与之通信
systemd 特点
- 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15…)
- CentOS7 支持开机并行启动服务,显著提高开机启动效率
- CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。
- CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本。
- CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程。
3. 系统管理
Systemd
并不是一个命令,而是一组命令,涉及到系统管理的方方面面。
3.1 systemctl 命令
systemctl
是 Systemd
的主命令,用于管理系统。
1 2 3 4 5 6 7 8 9 10 | systemctl [command] [unit](配置的应用名称) command可选项 · start:启动指定的unit systemctl start nginx · stop:关闭指定的unit systemctl stop nginx · restart:重启指定unit systemctl restart nginx · reload:重载指定unit systemctl reload nginx · enable:系统开机时自动启动指定unit,前提是配置文件中有相关配置 systemctl enable nginx · disable:开机时不自动运行指定unit systemctl disable nginx · status:查看指定unit当前运行状态 systemctl status nginx |
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 重启系统 $ sudo systemctl reboot # 关闭系统,切断电源 $ sudo systemctl poweroff # CPU停止工作 $ sudo systemctl halt # 暂停、挂起系统 $ sudo systemctl suspend # 让系统进入冬眠状态、快照 $ sudo systemctl hibernate # 让系统进入交互式休眠状态、快照并挂起 $ sudo systemctl hybrid-sleep # 启动进入救援状态(单用户状态) $ sudo systemctl rescue |
3.3 hostnamectl 命令
hostnamectl
命令用于查看当前主机的信息。
1 2 3 4 5 | # 显示当前主机的信息 $ hostnamectl # 设置主机名 $ sudo hostnamectl set-hostname rhel7 |
3.4 localectl 命令
localectl
命令用于查看本地化设置。
1 2 3 4 5 6 | # 查看本地化设置 $ localectl # 设置本地化参数。 $ sudo localectl set-locale LANG=en_GB.utf8 $ sudo localectl set-keymap en_GB |