问题描述
我成为 Ubuntu 用户已经有一段时间了,在工作中我们有许多 Ubuntu VM 服务器,所有这些服务器都运行 Ubuntu 14.04 LTS
来部署我们的 Web 应用程序、数据库和其他工具。
我目前正在研究 Ubuntu 16.04 LTS
,台式机和服务器,以便能够在不久的将来升级我们的生产服务器而不会造成问题。
从 Ubuntu 15.04 开始, init
和 upstart
已经被 Systemd
取代,所以我也在学习 Systemd。
我注意到我的运行 Ubuntu 16.04 桌面版的开发计算机将 graphical.target
作为默认的 systemd 目标,这是合乎逻辑的。
但后来我注意到运行 Ubuntu 16.04 服务器版的测试服务器也使用 graphical.target
作为默认的 systemd 目标。
$ systemctl get-default
graphical.target
所以我很困惑。服务器没有任何图形层,那么默认目标是 graphical.target
怎么办?
编辑#0
就像 Rinzwind 在评论中建议的那样,我查看了目标以查看它是否处于活动状态……
答案是肯定的:
admin@server1604:~$ systemctl get-default
graphical.target
admin@server1604:~$ systemctl status graphical.target
● graphical.target - Graphical Interface
Loaded: loaded (/lib/systemd/system/graphical.target; static; vendor preset: enabled)
Active: active since jeu. 2016-10-13 16:03:18 CEST; 46min ago
Docs: man:systemd.special(7)
oct. 13 16:03:18 fdea systemd[1]: Reached target Graphical Interface.
所以我有点困惑。
编辑#1
Mark Stosberg 的回答指出,display-manager.service
是 graphical.target
在其自己的 16.04 服务器上的依赖关系树的一部分,他补充说,其机器上没有安装或运行任何显示管理器。我也看过了,确实,在我的服务器上,存在这种依赖关系:
admin@server1604:~$ systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─apache2.service
● ├─apport.service
● ├─display-manager.service
...
这个目标在左侧有一个红色圆圈,其他大多数依赖项都有一个绿色圆圈。
而这一次的结果是一致的:
admin@server16.04:~$ systemctl status display-manager.service
● display-manager.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
但还有一件奇怪的事情:在我的桌面版上, display-manager.service
不是 graphical.target
的依赖项:
me@desktop16.04:~ $ systemctl list-dependencies graphical.target | grep display
me@desktop16.04:~ $
但我什至找到了替代方案,因为我运行 Ubuntu-Gnome
并用 lightdm
替换了默认窗口管理器:
me@desktop16.04:~ $ systemctl list-dependencies graphical.target | grep lightdm
● ├─lightdm.service
最佳答案
尽管有目标的名称,但 Ubuntu Server 16.04 上没有运行任何图形。如果您愿意,可以运行此命令来检查并将其与您的桌面发行版进行比较:
systemctl list-dependencies graphical.target
在我的 Ubuntu 16.04 服务器上,我看到目标依赖于 “display-manager.service”,但没有安装或运行显示管理器。
我希望 Ubuntu 服务器以这种方式设置以实现某种一致性,尽管我同意这令人困惑。
次佳答案
从 redhat manual :
\\n
For example, the graphical.target unit, which is used to start a graphical session, starts system services such as the GNOME Display Manager (gdm.service) or Accounts Service (accounts-daemon.service) and also activates the multi-user.target unit. Similarly, the multi-user.target unit starts other essential system services such as NetworkManager (NetworkManager.service) or D-Bus (dbus.service) and activates another target unit named basic.target.
\\n
所以设置它并没有错,因为在没有设置处理显示服务的服务时它不会激活显示管理器。
对于服务器,您可以将其设置为 multi-user.target
但不是必需的。 \n看起来如果你这样做,你最终会进入运行级别 4,而如果你不这样做,你最终会进入运行级别 5。
Runlevel Target Units Description
0 runlevel0.target, poweroff.target Shut down and power off the system.
1 runlevel1.target, rescue.target Set up a rescue shell.
2 runlevel2.target, multi-user.target Set up a non-graphical multi-user system.
3 runlevel3.target, multi-user.target Set up a non-graphical multi-user system.
4 runlevel4.target, multi-user.target Set up a non-graphical multi-user system.
5 runlevel5.target, graphical.target Set up a graphical multi-user system.
6 runlevel6.target, reboot.target Shut down and reboot the system.
第三种答案
更详细地检查目标 graphical.target
的树依赖的第一级:
admin@server1604:~$ systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─apache2.service
● ├─apport.service
● ├─display-manager.service (disabled)
● ├─grub-common.service
● ├─irqbalance.service
● ├─mdadm.service
● ├─ondemand.service
● ├─sysstat.service
● ├─systemd-update-utmp-runlevel.service (disabled)
● ├─ureadahead.service (disabled)
● └─multi-user.target
将其与 multi-user.target
的第一级进行比较:
admin@server16.04:~$ systemctl list-dependencies multi-user.target
multi-user.target
● ├─apache2.service
● ├─apport.service
● ├─atd.service
● ├─cron.service
● ├─dbus.service
● ├─grub-common.service
● ├─irqbalance.service
● ├─lxcfs.service
● ├─lxd-containers.service
● ├─mdadm.service
● ├─networking.service
● ├─ondemand.service
● ├─open-vm-tools.service
...
我注意到,如果我们删除 graphical.target
树( display-manager.service
、 systemd-update-utmp-runlevel.service
、 ureadahead.service
)中禁用的目标,几乎所有剩余的目标:
-
apache2.service
-
apport.service
-
grub-common.service
-
grub-common.service
-
irqbalance.service
-
mdadm.service
-
ondemand.service
-
和
sysstat.service
已经包含在 multi-user.target
的依赖树的第一级中。
虽然,我们应该再次询问这个事实,因为 graphical.target
依赖于 multi-user.target
,所以不需要所有这些东西。听起来够诡异的。
但是在减少之后,它仍然是一项服务,即 accounts-daemon.service
,就像 Rinzwind pointed out in its comment 一样。
所以我们可以假设需要 graphical.target
来加载 accounts-daemon.service
。
然而,在这种情况下,它又很奇怪,因为我认为为此目的创建一个专用目标会更有意义,也许像 accounts.target
或任何正确的术语来描述它。无论如何,Canonical 开发人员可能有他们的理由做出这样的想法。
但我很想知道它的原因。