Linux初始化管理-systemd

在前几天发布的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”。

image003image005

对于日志的支持上,不同于传统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) 改变至多用户运行级别。
推荐阅读:
之前写过一篇东西:Ubuntu
猛击这里下载 [gallery
种种原因,站长已经很久没有关注
日志分析是一个成熟的应用中必不

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据