systemd 是 Linux 下一个与 SysV 和 LSB 初始化脚本兼容的系统和服务管理器。systemd 使用 socket 和 D-Bus 来开启服务,提供基于守护进程的按需启动策略,保留了 Linux cgroups 的进程追踪功能,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有前卫的并行性能。systemd 无需经过任何修改便可以替代 sysvinit 。更多信息,请参考视频:http://linuxconfau.blip.tv/file/4696791/ 和 http://www.youtube.com/watch?v=TyMLi8QF6sw
systemd 开启和监督整个系统是基于 unit 的概念。unit 是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit 有一个具有相同名字的配置文件,是守护进程 Avahi 的一个封装单元)。unit 有以下几种类型:
service
:守护进程的启动、停止、重启和重载是此类 unit 中最为明显的几个类型。socket
:此类 unit 封装系统和互联网中的一个 socket 。当下,systemd 支持流式、数据报和连续包的 AF_INET、AF_INET6、AF_UNIX socket 。也支持传统的 FIFOs 传输模式。每一个 socket unit 都有一个相应的服务 unit 。相应的服务在第一个“连接”进入 socket 或 FIFO 时就会启动(例如:nscd.socket 在有新连接后便启动 nscd.service)。device
:此类 unit 封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个设备 unit 出现。udev 的属性设置可以作为配置设备 unit 依赖关系的配置源。mount
:此类 unit 封装系统结构层次中的一个挂载点。automount
:此类 unit 封装系统结构层次中的一个自挂载点。每一个自挂载 unit 对应一个已挂载的挂载 unit (需要在自挂载目录可以存取的情况下尽早挂载)。target
:此类 unit 为其他 unit 进行逻辑分组。它们本身实际上并不做什么,只是引用其他 unit 而已。这样便可以对 unit 做一个统一的控制。(例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别5);bluetooth.target 只有在蓝牙适配器可用的情况下才调用与蓝牙相关的服务,如:bluetooth 守护进程、obex 守护进程等)snapshot
:与 target unit 相似,快照本身不做什么,唯一的目的就是引用其他 unit 。systemd 拥有丰富的文档。参考 http://0pointer.de/blog/projects/systemd-docs.html
systemd 提供以下特性:
/etc/fstab
也可以作为这些挂载点的一个附加配置源。通过使用 comment=
fstab 选项你甚至可以标记 /etc/fstab
条目使其成为由 systemd 控制的自挂载点。另外:
.desktop
文件相近的语法:很多软件架构中都有这个简单的语法的分析器。它也可以借用已有的国际化的服务描述工具,语法都是相似的,没有必要再学习新的语法。(...更多高级特性)
/etc/rc.d
。这些初始化脚本仅仅是作为一个附加的配置源,以减少 sysytemd 服务固有的路径数目。/etc/fstab
配置文件:这只是另一个配置源。通过使用 comment=
fstab 选项标记 /etc/fstab
条目,使 systemd 可以控制自挂载点。[email protected]
文件,而不是为六个 getty 都准备一个配置文件。接口部分甚至可以被直接继承,也就是说,可以简单的调用 [email protected] 服务配置 [email protected] ,使得字符串 eth0 的值可以直接通过通配符匹配得到。/dev/initctl
。这个兼容性实际上是为了执行 FIFO-activated 服务。(只是简单地把原先的请求转换成为 D-Bus 请求)事实上,这也意味着旧的 Upstart 和 sysvinit 中的 shutdown
、poweroff
和其他相似命令可以在 systemd 中继续使用。utmp
和 wtmp
兼容。(在一定程度上远不只是为了全面,想想今天的 utmp
和 wtmp
让人是多么的敬而远之吧)更多详细信息,请参看开发者博客 A short list of other feathers 。
systemctl
:用作内省和控制 systemd 系统和服务管理器的状态。systemd-cgls
:以树形递归显示选中的 Linux 控制组结构层次。systemadm
:一个 systemd 系统和服务管理器的图形化前端。是 systemd-gtk 软件包的一部分。这还只是前期版本,尚需完善。除非你是一个开发者,否则请不要使用它。更多详细内容请参看手册页。
在系统启动时 systemd 默认激活 default.target ,它的工作就是按照依赖关系来激活服务和调用其他 unit 。
为了重载需要激活的 unit ,systemd 通过 systemd.unit=
命令行选项解析其自己的 kernel 命令行参数。这可以用来临时启动系统到一个不同的启动 unit 。传统的 run-levels 被下面的取代:
systemd.unit=rescue.target
是一个设置基本系统和救援 shell 的特殊 target unit (与运行级1相似);systemd.unit=emergency.target
与传递保留参数的 init=/bin/sh
给系统使系统从该状态启动相似;systemd.unit=multi-user.target
设置一个非图形化的多用户系统;systemd.unit=graphical.target
设置一个图形化的登录界面。
关于特殊的 systemd 启动 unit 的详细内容,请参看 systemd.special
手册页。
在 Fedora 14 的特性中,systemd 是作为一个技术预览。在 Fedora 15 中替代 Upstart 作为默认管理器。
大量(但不是全部)核心服务(在 /lib/systemd/system
中有的,可以通过 http://fedoraproject.org/wiki/User:Johannbg/QA/Systemd/compatability 检查它们的状态)已经转换到了 systemd 中。预计在 Fedora 16 时完成所有转换工作。详情请参考http://fedoraproject.org/wiki/Features/SysVtoSystemd 。systemd 完全兼容原始系统的初始化脚本。
systemctl
是最主要的工具。它融合 service
和 chkconfig
的功能于一体。你可以使用它永久性或只在当前会话中启用/禁用服务。
下面命令用于列出正在运行的服务或其他:
systemctl
更多详细信息请参考手册页(man systemctl)。systemd-cgls
以树形列出正在运行的进程。它可以递归显示给定控制组内容。详情请参阅 systemd-cgls
手册页。
运行一个服务:
systemctl start foo.service
关闭一个服务:
systemctl stop foo.service
重启一个服务:
systemctl restart foo.service
显示一个服务(无论运行与否)的状态:
systemctl status foo.service
在开机时启用一个服务:
systemctl enable foo.service
在开机时禁用一个服务:
systemctl disable foo.service
检查一个服务是否是开机启用:
systemctl is-enabled foo.service; echo $?
0 表示已开机启用,1 表示没有开机启用。在 Fedora 17 中,除了返回值外,相应的 "enable" 或 "disable" 也会显示到标准输出。
更多详情请参看 systemctl
手册。
systemd 使用比 sysvinit 的运行级更为自由的 target 概念作为替代。
第 3 运行级用 multi-user.target 替代。第 5 运行级用 graphical.target 替代。runlevel3.target 和 runlevel5.target 分别是指向 multi-user.target 和 graphical.target 的符号链接。
你可以使用下面的命令切换到“运行级 3 ”:
systemctl isolate multi-user.target (or) systemctl isolate runlevel3.target
你也可以使用下面的命令切换到“运行级 5 ”:
systemctl isolate graphical.target (or) systemctl isolate runlevel5.target
systemd 使用链接来指向默认的运行级别。在创建新的链接前,你可以通过下面命令删除存在的链接:
rm /etc/systemd/system/default.target
默认切换到运行级 3 :
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
默认切换到运行级 5 :
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
systemd 不使用/etc/inittab
文件。
runlevel
命令在 systemd 下仍然可以工作。你可以继续使用它,尽管 systemd 使用 'target' 概念(多个的 'target' 可以同时激活)替换了之前系统的 runlevel 。等价的 systemd 命令是
systemctl list-units --type=target
你可以使用
poweroff
更多可行的命令是: halt -p
、 init 0
、 shutdown -P now
需要注意的是,在之前的 Fedora 发布版中 halt
与 poweroff
的效果一样。但是 systemd 区别对待这两项,因而,没有参数的 halt
做的就是像它说的那样(停止)——仅仅停止系统而不关机。
service
命令兼容 systemd 吗? 兼容。service
经过修改可以在处理 systemd 服务时调用 systemctl
实现。因而下面的命令所做的事情相同
service NetworkManager stop
(or)
systemctl stop NetworkManager.service
chkconfig
命令兼容 systemd 吗? 兼容,如果是开启/关闭服务,兼容性保证两种方式都可以运行。不过 chkconfig
经过修改使得在处理 systemd 服务时调用 systemctl
工具。同样,在处理传统 sysv 初始化文件时 systemd
自动调用 chkconfig
。
因此,下面的命令做的事情是一样的
chkconfig NetworkManager off
(or)
systemctl disable NetworkManager.service
chkconfig --list
不会列出 systemd 服务,只列出 Sys V 服务。chkconfig
的输出结果里附带了对此的说明信息。
system-config-services
与 systemd 兼容吗?Feodra 15 的 system-config-services 版本也可以处理 systemd 的服务文件。如果你遇到问题,直接报告一个 bug 。
添加一个新的 getty :
只需要在 getty.target.wants/
目录下新建一个链接到 getty 的示例即可:
ln -sf /lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected] systemctl daemon-reload systemctl start [email protected]
删除一个 getty :
直接删掉 getty.target.wants/
目录下你不想要的哪个 getty 链接即可:
rm /etc/systemd/system/getty.target.wants/[email protected] /etc/systemd/system/getty.target.wants/[email protected] systemctl daemon-reload systemctl stop [email protected] [email protected]
systemd 不使用 /etc/inittab
文件。
首先创建一个新的类似于 [email protected] 的服务:
# cp /lib/systemd/system/[email protected] \ /etc/systemd/system/[email protected] # ln -s /etc/systemd/system/[email protected] \ /etc/systemd/system/getty.target.wants/[email protected]
然后编辑 ExecStart、Restart 和 Alias 的值,如:
... ExecStart=-/sbin/mingetty --autologin USERNAME %I Restart=no ... Alias=getty.target.wants/[email protected]
最后重新加载守护进程,运行服务:
systemctl daemon-reload systemctl start [email protected]
需要注意的是,如果你退出了 tty8 的会话,你需要等到下次重新启动才能使用,除非你给 Restart 的值是 'always' ,这样你可以使用systemctl
手动开启(但是出于安全考虑,强烈建议你不要那么做)。
unit 文件在 /etc/systemd/system
下的优先级要高于 /lib/systemd/system
下的。按照个人的需求从后者移动到前者并进行自定义修改。
如果一行以 .include
开始,后接文件名,那么该文件在此时被解析为特殊文件。请确保包含的文件在指令前有适当的章节头信息。
如果可能的话,你应当使用 .include
声明 unit 文件而不是在 /lib/systemd/system
下复制整个 unit 文件到 /etc/systemd/system
目录下。这样你才可以在将来升级软件包时正确地升级未改变的指令。
在使用 .include
和指令时需要小心,因为它可以有多次定义(像 EnvironmentFile=
一样)。由于我们只能添加新指令而不能删除已定义的指令,此时,我们就必须从 /lib/systemd/system
复制整个文件到 /etc/systemd/system
中去。
假设我们有一个 lighttpd 服务,我们现在想降低它的 niceness 值。我们需要做的就只是添加 Nice=-5
到 lighttpd.service 文件中。我们可以通过复制整个文件 /lib/systemd/system/lighttpd.service
到 /etc/systemd/system/lighttpd.service
或者在/etc/systemd/system/lighttpd.service
中创建如下文件做到
.include /lib/systemd/system/lighttpd.service [Service] Nice=-5
不要忘记在编辑一个 unit 文件后使用 systemdctl daemon-reload
重载 systemd 守护进程。
参看 How_to_debug_Systemd_problems
systemd 有内置的预读功能(默认升级时未启用),它可以提高开机速度,但具体提升幅度视个人硬件而定。 要使用它,使用命令:
systemctl enable systemd-readahead-collect.service systemctl enable systemd-readahead-replay.service
/usr
分区的警告详情请参考: http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken 和 http://cgit.freedesktop.org/systemd/tree/README
man
手册 systemd 有丰富的文档,其中也包括一些 man
手册页。其在线版地址是: http://www.freedesktop.org/software/systemd/man/