在前几天发布的Ubuntu1604LTS中,systemd已经取代了传统的upstart,成为了新一代的操作系统初始化管理工具。借此,两大Linux发行版——Redhat(fedora, centos均属于此体系),以及Ubuntu殊途同归的都选择了systemd。
说起“初始化管理工具”,也许大家听着都很陌生,其实凡是配置过service的同学都应该知道有个init命令,一旦kernel加载成功后,系统会自动执行init,而通过对于init的配置,我们就可以定制系统的文件系统、控制台、服务以及其他各类的初始化信息。
Why systemd
Linux的systemd主要是为了克服传统中sysvinit的问题提出的,它主要借鉴了Mac系统中的launchd的方式(Mac开机快是有名的)。它不但支持多个进程并发启动而且保留了sysvinit的接口,支持向下兼容。种种的优化,归根到底都是为了减少启动时间——这在系统越来越复杂的今天确实是个趋势。
其实对于Ubuntu来说,原本的upstart已经可以做到并发启动,但system显得更为激进,将原先sysvinit的“stack”完全变成一个“parallel”。
对于日志的支持上,不同于传统sysvinit需要syslogd服务的支持,你完全可以像关闭系统中的某一个服务一样关闭日志服务,非常不可靠。而systemd自带了日志服务,无法完全关闭,日志采用了二进制格式保存,减少磁盘占用,加快浏览速度,而且具有更为严格的来源安全验证。
再者就是对于cgroup的隔离化支持。不同于sysvinit和upstart通过PID管理服务,systemd通过cgroup管理服务。
How to set systemd
默认的systemd会将所有的配置文件放置在/etc/systemd之下。
litrin@litrin-de-xubuntu:/etc/systemd$ ls bootchart.conf journald.conf logind.conf network resolved.conf system system.conf timesyncd.conf user user.conf
通常情况下,为了方便管理,该目录还支持多重目录嵌套。我们打开其中的一个配置文件。
litrin@litrin-de-xubuntu:/etc/systemd$ cat system/syslog.service [Unit] Description=System Logging Service Requires=syslog.socket Documentation=man:rsyslogd(8) Documentation=http://www.rsyslog.com/doc/ [Service] Type=notify ExecStart=/usr/sbin/rsyslogd -n StandardOutput=null Restart=on-failure [Install] WantedBy=multi-user.target Alias=syslog.service
这里有3个部分的配置:
- [Unit]: 提供了系统的描述,比如名称、文档位置之类的描述信息,主要是为了方便管理。
- [Service]: 这里提供了很简单的配置项就定义了服务的类型,启动命令,以及是否支持重启等等。
- [Install]: 这里是解决了依赖问题 ,尽管systemd讨厌服务之间的依赖,但依赖还是不可避免。WantedBy是该服务依赖的服务关键字,Alias则是自己提供的服务依赖字。正如此例中,必须multi-user.target服务启动之后才能启动syslog.service,而比如服务A WantedBy=syslog.service,则A将会在syslog之后启动。不管怎么说,这个比通过文件名来确认启动顺序的方式不知道先进了多少。
How to use systemd
至于命令,systemd的命令非常统一化,基本上一个systemctl就全搞定了!
Sysvinit 命令 | Systemd 命令 | 备注 |
---|---|---|
service foo start | systemctl start foo.service | 用来启动一个服务 (并不会重启现有的) |
service foo stop | systemctl stop foo.service | 用来停止一个服务 (并不会重启现有的)。 |
service foo restart | systemctl restart foo.service | 用来停止并启动一个服务。 |
service foo reload | systemctl reload foo.service | 当支持时,重新装载配置文件而不中断等待操作。 |
service foo condrestart | systemctl condrestart foo.service | 如果服务正在运行那么重启它。 |
service foo status | systemctl status foo.service | 汇报服务是否正在运行。 |
ls /etc/rc.d/init.d/ | systemctl list-unit-files –type=service | 用来列出可以启动或停止的服务列表。 |
chkconfig foo on | systemctl enable foo.service | 在下次启动时或满足其他触发条件时设置服务为启用 |
chkconfig foo off | systemctl disable foo.service | 在下次启动时或满足其他触发条件时设置服务为禁用 |
chkconfig foo | systemctl is-enabled foo.service | 用来检查一个服务在当前环境下被配置为启用还是禁用。 |
chkconfig –list | systemctl list-unit-files –type=service | 输出在各个运行级别下服务的启用和禁用情况 |
chkconfig foo –list | ls /etc/systemd/system/*.wants/foo.service | 用来列出该服务在哪些运行级别下启用和禁用。 |
chkconfig foo –add | systemctl daemon-reload | 当您创建新服务文件或者变更设置时使用。 |
telinit 3 | systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3) | 改变至多用户运行级别。 |