我已经成为 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 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-Gnome
用lightdm
替换默认窗口管理器来运行:
[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.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 在其评论中指出。
因此我们可以假设需要graphical.target
加载accounts-daemon.service
。
但是,在这种情况下,这又很奇怪,因为我认为为此目的创建一个专用目标更有意义,也许是类似accounts.target
或任何正确的术语来描述它。无论如何,Canonical 开发人员可能有理由做出这样的想法。
但我仍然很好奇想知道其原因。