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

为什么 Ubuntu 服务器将 graphic.target 作为默认的 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 Server 版本的测试服务器也使用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是其自身 16.04 服务器依赖关系树的一部分graphical.target,并且他补充说,其机器上没有安装或运行显示管理器。我也查看了这一点,确实,在我的服务器上存在这种依赖关系:

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

...

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

而这次的结果是一致的:

[email protected]:~$ 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

[email protected]:~ $ systemctl list-dependencies graphical.target | grep display
[email protected]:~ $ 

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

[email protected]:~ $ systemctl list-dependencies graphical.target | grep lightdm
● ├─lightdm.service

答案1

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

systemctl list-dependencies graphical.target 

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

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

答案2

来自红帽手册

例如,用于启动图形会话的 graphic.target 单元会启动系统服务(如 GNOME 显示管理器 (gdm.service) 或帐户服务 (accounts-daemon.service)),还会激活 multi-user.target 单元。类似地,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. 

答案3

更详细地检查目标树依赖关系的第一级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

[email protected]:~$ 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.targetdisplay-manager.service,,),几乎所有剩余的目标:systemd-update-utmp-runlevel.serviceureadahead.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 在其评论中指出

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

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

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

相关内容