当前位置: 首页>>技术教程>>正文


boot – 为什么 Ubuntu 服务器将 graphics.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 服务器版的测试服务器也使用 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.servicegraphical.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.servicesystemd-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 pointed out in its comment 一样。

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

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

但我很想知道它的原因。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13159.html,未经允许,请勿转载。