1. 常用基本命令
列出所有正在运行服务
systemctl list-units --type=service
systemctl list-units --type=service --all 可以列出已经loaded但已经不活动的服务
列出所有target
systemctl list-units --type=target
列出所有socket
systemctl list-units --type=socket
列出所有单元文件
systemctl list-unit-files
列出一个unit的依赖
systemctl list-dependencies xx.service
缺省target的设置和获取
获取
systemctl get-default
设置
systemctl set-default graphical.target
服务的start/stop操作
systemctl start xx.service ---> service xx.service start
systemctl stop xx.service
systemctl restart xx.service
2. /etc/systemd 与/lib/systemd的关系
比如在/etc/systemd/system 目录下有multi-user.target.wants,在/lib/systemd/system目录下也有一个multi-user.target.wants
$ pwd
/etc/systemd/system/multi-user.target.wants
$ ls -l
lrwxrwxrwx 1 wr8 wr8 47 2? 26 16:36 remote-fs.target -> ../../../../lib/systemd/system/remote-fs.target
lrwxrwxrwx 1 wr8 wr8 55 2? 26 16:36 systemd-networkd.service -> ../../../../lib/systemd/system/systemd-networkd.service
...
$pwd
/lib/systemd/system/multi-user.target.wants
$ ls -l
total 0
lrwxrwxrwx 1 wr8 wr8 15 2? 26 16:36 dbus.service -> ../dbus.service
lrwxrwxrwx 1 wr8 wr8 15 2? 26 16:36 getty.target -> ../getty.target
lrwxrwxrwx 1 wr8 wr8 33 2? 26 16:36 systemd-ask-password-wall.path -> ../systemd-ask-password-wall.path
lrwxrwxrwx 1 wr8 wr8 25 2? 26 16:36 systemd-logind.service -> ../systemd-logind.service
lrwxrwxrwx 1 wr8 wr8 39 2? 26 16:36 systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
lrwxrwxrwx 1 wr8 wr8 32 2? 26 16:36 systemd-user-sessions.service -> ../systemd-user-sessions.service
这两个目录是什么关系?
对于multi-user.target来说,需要把/lib/systemd/system/multi-user.target.wants
下面的service和/etc/systemd/system/multi-user.target.wants下面的service都执行了。
这两个目录是叠加的关系。
如果想disable那些位于/etc/systemd/system/multi-user.target.wants下面的服务,只需要执行
systemctl disable xx.service即可,执行的结果是删除xx.service
在/etc/systemd/system/multi-user.target.wants下面的软连接。
disable之后,如果想enable这个服务,需要执行systemctl enable xx.service
如果想disable那些位于/lib/systemd/system/multi-user.target.wants下面的服务,需要执行
systemctl mask yy.service即可,执行的结果是在/etc/systemd/system目录下面创建一个软连接,
yy.service -----> /dev/null
mask之后,如果想重新生成这个服务,需要执行systemctl unmask yy.service
3. target之间的依赖关系
他们之间的依赖关系大致如下:
graphical.target->
multi-user.target->
basic.target->
sysinit.target->
local-fs.target
看一下这些target的定义:
graphical.target
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
multi-user.target
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
basic.target
[Unit]
Description=Basic System
Documentation=man:systemd.special(7)
Requires=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sysinit.target sockets.target paths.target slices.target
# We support /var, /tmp, /var/tmp, being on NFS, but we don't pull in
# remote-fs.target by default, hence explicitly pull /var in here.
RequiresMountsFor=/var /tmp /var/tmp
sysinit.target
[Unit]
Description=System Initialization
Documentation=man:systemd.special(7)
Conflicts=emergency.service emergency.target
Wants=local-fs.target swap.target
After=local-fs.target swap.target emergency.service emergency.target
local-fs.target
[Unit]
Description=Local File Systems
Documentation=man:systemd.special(7)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs-pre.target
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
我们注意到"basic.target" wants "sockets.target"
看一看sockets.target.wants就知道那些socket是需要的了,如果不想启动某个socket,在sockets.target.wants直接删除软连接就可以了。
当然也可以执行systemctl mask zz.socket
wr8@pek-gwang2-d2:~/workspace/am335x_no_dbg/export/dist/lib/systemd/system$ ls -l sockets.target.wants/
total 0
lrwxrwxrwx 1 wr8 wr8 14 2? 26 16:36 dbus.socket -> ../dbus.socket
lrwxrwxrwx 1 wr8 wr8 16 2? 26 16:36 syslog.socket -> ../syslog.socket
lrwxrwxrwx 1 wr8 wr8 25 2? 26 16:36 systemd-initctl.socket -> ../systemd-initctl.socket
lrwxrwxrwx 1 wr8 wr8 32 2? 26 16:36 systemd-journald-audit.socket -> ../systemd-journald-audit.socket
lrwxrwxrwx 1 wr8 wr8 34 2? 26 16:36 systemd-journald-dev-log.socket -> ../systemd-journald-dev-log.socket
lrwxrwxrwx 1 wr8 wr8 26 2? 26 16:36 systemd-journald.socket -> ../systemd-journald.socket
lrwxrwxrwx 1 wr8 wr8 31 2? 26 16:36 systemd-udevd-control.socket -> ../systemd-udevd-control.socket
lrwxrwxrwx 1 wr8 wr8 30 2? 26 16:36 systemd-udevd-kernel.socket -> ../systemd-udevd-kernel.socket
4. 性能分析
systemd-analyze time 用于显示内核和普通用户空间启动时所花的时间。
systemd-analyze blame 会列出所有正在运行的单元,按从初始化开始到当前所花的时间排序,通过这种方式你就知道哪些服务在引导过程中要花较长时间来启动。
systemd-analyze verify 显示在所有系统单元中是否有语法错误。
systemd-analyze plot 可以用来把整个引导过程写入一个SVG格式文件里。整个引导过程非常长不方便阅读,所以通过这个命令我们可以把输出写入一个文件,之后再查看和分析。下面这个命令就是做这个。
如果发现主机上没有这些命令,那就需要安装systemd-analyze.rpm。
5. 不想使用systemd怎么办?
wrlinux7/8默认使用systemd作为/sbin/init
如果不想使用systemd, 在配置工程时,请使用 --with-init=sysvinit 选项。
比如:
${WindRiver}/wrlinux-8/wrlinux/configure --enable-reconfig
--enable-board=ti-am335x --enable-kernel=preempt-rt
--enable-rootfs=glibc-small+debug --enable-build=production
--with-layer=${SOMEWHERE}/ti-am335x-snd --with-init=sysvinit
如果想显式指明使用systemd, 在配置工程时,需使用 --with-init=systemd 选项。