目标(target)

运行级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和运行级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 运行级别的目标,仍可以使用旧的 telinit 运行级别 命令切换。

获取当前目标

不要使用 runlevel 命令了:

  1. $ systemctl list-units --type=target

创建自定义目标

sysvinit 中有明确定义的运行级别(如:0、1、3、5、6)与 systemd 中特定的 目标 存在一一对应的关系。然而,对于用户自定义运行级别(2、4)却没有。如需要同样功能,建议你以原有运行级别所对应的 systemd 目标为基础,新建一个/etc/systemd/system/<目标名>.target(可参考/usr/lib/systemd/system/graphical.target), 然后创建目录/etc/systemd/system/<目标名>.wants,并向其中加入需启用的服务链接(指向/ur/lib/systemd/system/)。

"SysV 运行级别" 与 "systemd 目标" 对照表

SysV 运行级别Systemd 目标注释
0runlevel0.target, poweroff.target中断系统(halt)
1, s, singlerunlevel1.target, rescue.target单用户模式
2, 4runlevel2.target, runlevel4.target, multi-user.target用户自定义运行级别,通常识别为级别3。
3runlevel3.target, multi-user.target多用户,无图形界面。用户可以通过终端或网络登录。
5runlevel5.target, graphical.target多用户,图形界面。继承级别3的服务,并启动图形界面服务。
6runlevel6.target, reboot.target重启
emergencyemergency.target急救模式(Emergency shell)

切换当前运行目标

systemd中,运行目标通过“目标单元”访问。通过如下命令切换:

  1. # systemctl isolate graphical.target

该命令仅更改当前运行目标,对下次启动无影响。这等价于sysvinit中的 telinit 3telinit 5 命令。

更改开机默认启动目标

开机启动的目标是 default.target,默认链接到 graphical.target (大致相当于原来的运行级别5)。

systemctl 检查当前的默认启动目标:

  1. # systemctl get-default

systemctl 修改default.target以变更开机默认启动目标:

  1. $ systemctl set-default multi-user.target
  1. Removed /etc/systemd/system/default.target.
  2. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target.

另一方法是向bootloader添加内核参数):

  • systemd.unit=multi-user.target (大致相当于运行级别3)
  • systemd.unit=rescue.target (大致相当于运行级别1)

默认目标顺序

Systemd 根据下面顺序选择 default.target

  • 上面的内核参数
  • /etc/systemd/system/default.target 软链接
  • /usr/lib/systemd/system/default.target 软链接