SDB:Systemd简介
什么是systemd
systemd 是 Linux 下的一款系统和服务管理器。可以用来管理启动的服务、调整运行级别、管理日志等等。对于一般的初级使用者我们可以简单的把它看作是 SysVinit 和 syslog 的替代品。当然它的功能远不止这些。
更多的介绍可以看官方的主页
systemd的主要工具
- systemctl 命令:查询和控制系统和系统服务管理器的状态
- journalctl 命令: 查询系统的journal(日志)。
- systemd-cgls 命令: 树状递归显示所需要的Linux控制组的内容
- systemadm 命令: 图形化前端的systemd系统与服务管理器,支持修改和控制systemd。
systemd 在openSUSE12.1以后的版本就默认使用了,你无需另外安装,除了 systemadm。你可以使用以下命令很轻松的安装它
sudo zypper install systemd-ui
systemd-cgls也是非常有趣的东西,你运行了它以后可以看到类似下面的输出: ├ user │ └ nirvana │ └ 1 │ ├ 1911 -:0 │ ├ 2327 /bin/sh /usr/bin/startkde │ ├ 2390 dbus-launch --sh-syntax --exit-with-session │ ├ 2391 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session │ ├ 2394 fcitx -d │ ├ 2429 /bin/dbus-daemon --fork --print-pid 7 --print-address 9 --config-file /usr/share... │ ├ 2434 /usr/bin//fcitx-dbus-watcher unix:abstract=/tmp/dbus-Mg47msBm1x,guid=41961d5aa31... │ ├ 2435 /usr/bin/gpg-agent --sh --daemon --write-env-file /home/nirvana/.gnupg/agent.inf... │ ├ 2478 /usr/lib/kde4/libexec/start_kdeinit +kcminit_startup │ ├ 2480 kdeinit4: kdeinit4 Running... │ ├ 2484 kdeinit4: klauncher [kdeinit] --fd=9 │ ├ 2486 kdeinit4: kded4 [kdeinit] │ ├ 2494 kdeinit4: kglobalaccel [kdeinit] │ ├ 2498 /usr/bin/kactivitymanagerd │ ├ 2503 kwrapper4 ksmserver │ ├ 2519 kdeinit4: ksmserver [kdeinit] │ ├ 2574 kwin │ ├ 2582 /usr/bin/knotify4 │ ├ 2586 kdeinit4: plasma-desktop [kdeinit] │ ├ 2590 ksysguardd │ ├ 2593 kdeinit4: krunner [kdeinit] │ ├ 2597 /usr/bin/kuiserver │ ├ 2616 /usr/bin/pulseaudio --start --log-target=syslog │ ├ 2625 /bin/bash /home/nirvana/.kde4/Autostart/rj.sh │ ├ 2626 sudo mentohust │ ├ 2629 mentohust │ ├ 2649 /usr/bin/python /usr/bin/synaptiks │ ├ 2650 /usr/bin/python /home/nirvana/google_appengine/goagent/local/proxy.py │ ├ 2667 /usr/lib/tracker-miner-fs │ ├ 2668 /usr/lib/kde4/libexec/polkit-kde-authentication-agent-1 │ ├ 2669 /usr/lib/tracker-store │ ├ 2678 /usr/lib/gvfs/gvfsd │ ├ 2689 /usr/lib/gvfs//gvfsd-fuse -f /run/user/1000/gvfs lines 1-36/96 42%
systemd的简单实例
服务管理
我们以 smartd 服务作为例子。以下的命令中使用 smartd.service 来替代 smartd 是一样。
开启 smartd
sudo systemctl start smartd
检查 smartd 是否开启
systemctl status smartd
因为刚才我们开启了它,所以你可以看到类似下面的输出
smartd.service - Self Monitoring and Reporting Technology (SMART) Daemon Loaded: loaded (/usr/lib/systemd/system/smartd.service; disabled) Active: active (running) since Tue, 2013-09-03 01:43:11 CST; 1s ago Main PID: 30184 (smartd) CGroup: name=systemd:/system/smartd.service └ 30184 /usr/sbin/smartd -n
关闭 smartd
sudo systemctl stop smartd
这次检查可以看到类似如下输出
smartd.service - Self Monitoring and Reporting Technology (SMART) Daemon Loaded: loaded (/usr/lib/systemd/system/smartd.service; disabled) Active: inactive (dead) since Tue, 2013-09-03 01:45:32 CST; 3s ago Process: 30184 ExecStart=/usr/sbin/smartd -n $smartd_opts (code=exited, status=0/SUCCESS) CGroup: name=systemd:/system/smartd.service
重启 smartd
sudo systemctl restart smartd
当然你还可以是可以使用 service 命令,比如
sudo service smartd stop
在开机时启动 smartd
sudo systemctl enable smartd
这时 shell 会返回一些提示如下:
ln -s '/usr/lib/systemd/system/smartd.service' '/etc/systemd/system/multi-user.target.wants/smartd.service'
没错,开机启动一项服务就是在 /etc/systemd/system 目录下创建一个软链接, 和 init.d 目录是十分相似的。事实上, systemd 是兼容 SysVinit 的, 你可以使用 chkconfig 命令。
sudo chkconfig smartd on
得到的回复同样是:
ln -s '/usr/lib/systemd/system/smartd.service' '/etc/systemd/system/multi-user.target.wants/smartd.service'
这里的 chkconfig 实际上就是调用了 systemd。 但是你也可以想以前一样的使用它: 比如在 init.d 下创建一个启动脚本, 然后通过 chkconfig 还是可以把它添加到 rc5.d 里面(假设这里默认运行级别是5)。 比如现在 init.d 下现在有一个现成的 mysql ,那么运行
sudo chkconfig mysql on
就会在 /etc/init.d/rc5.d 下创建两个个软链接了。
lrwxrwxrwx 1 root root 8 9月 3 02:00 K50mysql -> ../mysql lrwxrwxrwx 1 root root 8 9月 3 02:00 S50mysql -> ../mysql
chkconfig 在还有一种情况下会和 systemd 不同,即
chkconfig --list
得到的输出说明了为什么会不同:
Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration.
after.local 0:off 1:off 2:off 3:off 4:off 5:off 6:off alsasound 0:off 1:off 2:on 3:on 4:off 5:on 6:off atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off autofs 0:off 1:off 2:off 3:off 4:off 5:off 6:off ... ...
在开机时禁用 smartd
sudo systemctl disable smartd
shell返回
rm '/etc/systemd/system/multi-user.target.wants/smartd.service'
运行级别
其实 systemd 已经使用了'target' 概念(多个的 'target' 可以同时激活)替换了之前系统的 runlevel。runlevel 还是可以使用, 但是 systemd 不使用 /etc/inittab 文件,修改/etc/inittab文件不会更改默认运行级别。所以严格来说不再有运行级别了。所谓默认的运行级别指的就是 /etc/systemd/system/default.target 文件,而查看这个文件我们会发现它是一个软链接
default.target -> /usr/lib/systemd/system/runlevel5.target
所以,在修改默认”运行级别“的时候不能再使用修改 inittab 的方法了, 而是使用创建软链接的方法。我们随着这个软链接去 /usr/lib/systemd/system/ 目录下看看会发现以下内容:
lrwxrwxrwx 1 root root 15 9月 2 22:35 runlevel0.target -> poweroff.target lrwxrwxrwx 1 root root 13 9月 2 22:35 runlevel1.target -> rescue.target drwxr-xr-x 2 root root 4096 9月 2 22:35 runlevel1.target.wants lrwxrwxrwx 1 root root 17 9月 2 22:35 runlevel2.target -> multi-user.target drwxr-xr-x 2 root root 4096 9月 2 22:35 runlevel2.target.wants lrwxrwxrwx 1 root root 17 9月 2 22:35 runlevel3.target -> multi-user.target drwxr-xr-x 2 root root 4096 9月 2 22:35 runlevel3.target.wants lrwxrwxrwx 1 root root 17 9月 2 22:35 runlevel4.target -> multi-user.target drwxr-xr-x 2 root root 4096 9月 2 22:35 runlevel4.target.wants lrwxrwxrwx 1 root root 16 9月 2 22:35 runlevel5.target -> graphical.target drwxr-xr-x 2 root root 4096 9月 2 22:35 runlevel5.target.wants lrwxrwxrwx 1 root root 13 9月 2 22:35 runlevel6.target -> reboot.target
虽然你还可以看到 level5 这样的字样,但是实际上是指向 graphical.target 的一个软链接,它相当于以前的 level5。
我们可以通过以下命令来查看默认运行级别
systemctl list-units --type=target
日志
systemd 拥有自己的日志系统,即前面提到了 journalctl 命令,但是 systemd 同样可以兼容 syslog。就是说你还可以像以前一样使用 syslog。而 openSUSE 也没用使用 systemd 自己的日志,我们可以在 /etc/systemd/system 下看到如下内容:
syslog.service -> /usr/lib/systemd/system/rsyslog.service
实际上我们使用的是 rsyslog.service ,查看它的配置文件
sudo cat /etc/rsyslog.conf
里面有非常详细的注释介绍,正如《UNIX/LINUX系统管理手册》的作者所说的,openSUSE 的开发人员是值得称赞的,他们把文档处理的非常好。现在我们暂时略去这些非常有价值你注解,可以看到类似下面的内容:
# # Warnings in one file # *.=warning;*.=err -/var/log/warn *.crit /var/log/warn # # the rest in one file # *.*;mail.none;news.none -/var/log/messages
根据这些内容我们可以很清晰的看到,这的确就是我们默认情况下平时在使用的日志。
参考
更加详细和高级的主题可以参考: