为什么 Ubuntu 服务器将 graphics.target 作为默认 systemd 目标?

Rém*_* B. 26 server boot systemd

我已经成为 Ubuntu 用户有一段时间了,在工作中我们有许多 Ubuntu VM服务器,所有这些服务器都运行Ubuntu 14.04 LTS以部署我们的 Web 应用程序、数据库和其他工具。

我目前正在学习Ubuntu 16.04 LTS台式机和服务器,以便能够在不久的将来升级我们的生产服务器而不会造成问题。

对于Ubuntu 15.04,initupstart通过已被替换Systemd,所以我学习Systemd了。

我注意到我的运行 Ubuntu 16.04 桌面版的开发计算机graphical.target作为默认的 systemd 目标,这是合乎逻辑的。

但后来我注意到运行 Ubuntu 16.04 服务器版的测试服务器也graphical.target用作默认的 systemd 目标。

$ systemctl get-default
graphical.target
Run Code Online (Sandbox Code Playgroud)

所以我很困惑。服务器没有任何图形层,那么默认目标是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.
Run Code Online (Sandbox Code Playgroud)

所以我有点困惑。

编辑 #1

Mark Stosberg 的回答指出,这display-manager.servicegraphical.target它自己的 16.04 服务器上的依赖关系树的一部分,他补充说,它的机器上没有安装或运行显示管理器。我也看了看,确实,在我的服务器上,这种依赖是存在的:

admin@server1604:~$ systemctl list-dependencies graphical.target 
graphical.target
? ??accounts-daemon.service
? ??apache2.service
? ??apport.service
? ??display-manager.service

...
Run Code Online (Sandbox Code Playgroud)

这个目标在左边有一个红色圆圈,大多数其他依赖项都有一个绿色圆圈。

而这一次的结果是一致的:

admin@server16.04:~$ systemctl status display-manager.service 
? display-manager.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
Run Code Online (Sandbox Code Playgroud)

但这是另一件奇怪的事情:在我的桌面版中,display-manager.service不是以下项的依赖项graphical.target

me@desktop16.04:~ $ systemctl list-dependencies graphical.target | grep display
me@desktop16.04:~ $ 
Run Code Online (Sandbox Code Playgroud)

但我什至找到了替代方案,因为我运行Ubuntu-Gnomelightdm替换了默认窗口管理器:

me@desktop16.04:~ $ systemctl list-dependencies graphical.target | grep lightdm
? ??lightdm.service
Run Code Online (Sandbox Code Playgroud)

Mar*_*erg 11

尽管目标名称如此,但在 Ubuntu Server 16.04 上没有任何图形运行。如果您愿意,可以运行此命令来检查它并与您的桌面发行版进行比较:

systemctl list-dependencies graphical.target 
Run Code Online (Sandbox Code Playgroud)

在我的 Ubuntu 16.04 服务器上,我看到目标依赖于“display-manager.service”,但没有安装或运行显示管理器。

我希望 Ubuntu 服务器以这种方式设置以实现某种一致性,尽管我同意这令人困惑。


Rin*_*ind 9

红帽手册

例如,用于启动图形会话的 graphics.target 单元会启动系统服务,例如 GNOME 显示管理器 (gdm.service) 或帐户服务 (accounts-daemon.service) 并激活多用户。目标单位。类似地,multi-user.target 单元启动其他基本系统服务,例如 NetworkManager(NetworkManager.service)或 D-Bus(dbus.service),并激活另一个名为 basic.target 的目标单元。

所以设置它并没有错,因为当处理显示服务的服务没有设置时,它不会激活显示管理器。

对于服务器,您可以将其设置为multi-user.target但不是必需的。看起来如果你这样做,你最终会在运行级别 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. 
Run Code Online (Sandbox Code Playgroud)


Rém*_* B. 1

更详细地检查目标树依赖关系的第一级graphical.target

\n\n
admin@server1604:~$ systemctl list-dependencies graphical.target \ngraphical.target\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80accounts-daemon.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80apache2.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80apport.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80display-manager.service              (disabled)\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80grub-common.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80irqbalance.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80mdadm.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80ondemand.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80sysstat.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80systemd-update-utmp-runlevel.service (disabled)\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80ureadahead.service                   (disabled)\n\xe2\x97\x8f \xe2\x94\x94\xe2\x94\x80multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其与第一级进行比较multi-user.target

\n\n
admin@server16.04:~$ systemctl list-dependencies multi-user.target\nmulti-user.target\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80apache2.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80apport.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80atd.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80cron.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80dbus.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80grub-common.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80irqbalance.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80lxcfs.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80lxd-containers.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80mdadm.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80networking.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80ondemand.service\n\xe2\x97\x8f \xe2\x94\x9c\xe2\x94\x80open-vm-tools.service\n\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

我注意到,如果我们删除树中禁用的目标graphical.targetdisplay-manager.servicesystemd-update-utmp-runlevel.serviceureadahead.service),几乎所有剩余的目标:

\n\n
    \n
  • apache2.service
  • \n
  • apport.service
  • \n
  • grub-common.service
  • \n
  • grub-common.service
  • \n
  • irqbalance.service
  • \n
  • mdadm.service
  • \n
  • ondemand.service
  • \n
  • sysstat.service
  • \n
\n\n

已经包含在 的依赖树的第一级中multi-user.target

\n\n

虽然,我们应该再次询问这个事实,因为取决于graphical.targetmulti-user.target没有必要所有这些东西。听起来够奇怪的。

\n\n

但在这次减少之后,它仍然是一项服务,accounts-daemon.service就像Rinzwind 在其评论中指出的那样。

\n\n

所以我们可以假设graphical.target需要加载accounts-daemon.service.

\n\n

然而,在这种情况下,它又很奇怪,因为我认为为此目的创建一个专用目标更有意义,也许类似accounts.target或任何正确的术语来描述它。无论如何,Canonical 开发人员可能有他们的理由做出这样的想法。

\n\n

但我仍然好奇地想知道其原因。

\n