Display Manager Infrastructure Rework
We'd like to remove the prefdm logic. Instead we propose to use systemd's own symlink management to select a display manager.
At the same time we'd also like to make all display managers bind explicitly to vt1, instead of allocating the first free VT.
- Name: Lennart Poettering, Christoph Wickert
- Email: lennart at poettering dot net, cwickert at fedoraproject dot org
- Targeted release: Fedora 18
- Last updated: 2012-07-07
- Percentage of completion: 33%
We'd like to remove prefdm from the distribution. Instead of shipping a single prefdm.service which tries black magic to find out which DM to start, this information should be stored inside the packages themselves, and each package should ship its own service file which is symlinked to display-manager.service via "systemctl enable" commands.
We simplify the system this way and it is easier to add new display managers later on, as they don't need central registration. Selecting a window manager also becomes more uniform how we support selection of other services. And it also becomes more alike how things are done on other distributions.
We'll also be able to get rid of quite some ugly code in /etc/X11/prefdm. Information about Plymouth compatibility would then be maintained were it belongs, in the display manager packages themselves, and possibly even upstream.
Packages will make use of systemd presets so that spins have an easy way to select the window manager of their choice, simply by shipping a preset file.
We'd also like to explicitly configure all DMs to use VT1. The current mostly automatic approach doesn't work in a fully parallelized boot, simply because /dev/tty1 might appear busy because a status update is printed on it for another service that is starting. To avoid these prolems where /dev/tty1 might spuriously appear busy we should configure all DMs to explicitly bind to VT1.
Benefit to Fedora
Things generally become simple, easier and more modular. We will be more like other distros since we get rid of the Fedora-only prefdm logic, in favour of explicit unit files like they are used by other distros.
We need to make the following changes:
- Update all display manager packages to include a display manager system unit file (e.g. /usr/lib/systemd/system/xyzdm.service), of the following contents:
[Unit] Description=XYZ Display Manager Documentation=man:xyzdm(8) Conflictsfirstname.lastname@example.org After=systemd-user-sessions.service email@example.com plymouth-quit.service # Add the following line only if the DM can do Plymouth internally Conflicts=plymouth-quit.service [Service] ExecStart=/usr/bin/xyzdm -nofork Restart=always IgnoreSIGPIPE=no # Add the following line only if your DM takes a name on the bus BusName=org.freedesktop.XYZDisplayManager [Install] Alias=display-manager.service
- Update all display manager packages to make use of the new systemd packaging macros to install the unit files, see FPC ticket #190: https://fedorahosted.org/fpc/ticket/190 -- also see the guidelines https://fedoraproject.org/wiki/Packaging:Systemd )
- Patch livesys-late.service to include Before=display-manager.service (currently there is an After=livesys-late.service, but this really should live in livesys and hence be reversed).
- Update initscripts to remove the prefdm script.
- Update systemd to remove the prefdm.service unit, and not longer ship the symlink /usr/lib/systemd/system/display-manager.service in the RPM.
- Update fedora-release.rpm to include a default fedora preset file /usr/lib/systemd/system-preset/99-default.preset which includes the following lines (which make gdm the default DM for fedora):
enable gdm.service disable *
- Ask the various spin maintainers to include their own preset files in case they want to override gdm as default WM.
- (Optionally) Patch initscripts to parse /etc/sysconfig/desktop at upgrade time and generate a preset file from it that is stored in /etc/systemd/system-preset/ and ensures that the original display manager choice is kept.
- The display manager configuration files should be changed so that they explicitly bind to VT1 by default. The previous logic of allocating the first unallocated VT leaves the VT random, as due to the parallized bootup VT1 might appear in use at any time simple because a status update is printed at the same time as the dm started. The display manager configuration should hence override any automatism and forcibly bind to vt1.
The following display managers are currently available in Fedora and need to be patched: xorg-x11-xdm, gdm, ldm, lxdm, cdm, kdm, slim.
We will file bugs against all display managers in question as well as the other three packages, each with detailed explanations what to do. If possible and OK'ed we will make the necessary changes to the packages on our own.
We will create a tracker bug to keep track of all created bugs. (DONE: https://bugzilla.redhat.com/show_bug.cgi?id=846137 )
How To Test
The right display manager should come up as normal on the various distributions.
The following command should work to change the default display manager for the next reboot:
systemctl enable --force xyzdm.service
Not much changes. "systemctl enable" can now be used to enable and switch specific DMs.
Needs changes in all 7 display managers we currently have in the distribution, plus in initscripts, fedora-release and systemd.
FPC needs to accept ticket #190: https://fedorahosted.org/fpc/ticket/190
FESCO needs to accept feature https://fedoraproject.org/wiki/Features/PackagePresets
If things don't work out we readd the old prefdm bits to initscripts and systemd, and change the preset files in fedora-release to not enable any DM unit files. That way we don't have to revert any work in the individual DM packages.
http://www.freedesktop.org/wiki/Software/systemd/Preset explains the preset logic.
http://www.freedesktop.org/software/systemd/man/systemd.preset.html explains the preset file format.
Switching display managers is no longer done by editing /etc/sysconfig/desktop. Instead you "systemctl enable --force xyzdm.service" to enable the display manager of your choice, in case you have multiple installed.