SDB:Systemd简介

跳转至: 导航, 搜索
本文提供了一些关于 systemd 的简单介绍和基本操作实例,旨在帮助初学者在 openSUSE下 熟悉认识 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-palefire.png

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

根据这些内容我们可以很清晰的看到,这的确就是我们默认情况下平时在使用的日志。

参考

更加详细和高级的主题可以参考:

  1. Category:Systemd
  2. Arch Wiki
  3. fedora Wiki
  4. Chakra Wiki