From 0acd1b4f35034572fea9a00ca074a1d9c1f72856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 28 Jan 2026 16:37:18 +0100 Subject: [PATCH] units: restore runlevel[0-6].target aliases This partially reverts commit e58ba80a40fb6e96543d56774a5bc5aa9cdadbf3. Those aliases were removed as part of the removal of sysvinit compat, but the removal was immediately reported as a regression by users. In particular, users can have one of those set as the default target, or use those names in Wants= or Requires= dependencies. At least in Fedora, the removal was immediately reverted. When looking at our "portability and stability promise", I noticed that those units are explicitly listed in the promise. Let's restore them upstream. They are conditionalized under a new -Dcompat-sysv-interfaces=bool option, so that downstreams like Arch that wasnt to strictly avoid legacy interfaces can easily disable them. They are dropped from the docs, like we do for all deprecated interfaces. --- docs/PORTABILITY_AND_STABILITY.md | 3 +-- meson.build | 2 ++ meson_options.txt | 2 ++ units/meson.build | 21 ++++++++++++++++----- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/docs/PORTABILITY_AND_STABILITY.md b/docs/PORTABILITY_AND_STABILITY.md index 7de60066e4..da545f7c01 100644 --- a/docs/PORTABILITY_AND_STABILITY.md +++ b/docs/PORTABILITY_AND_STABILITY.md @@ -71,8 +71,7 @@ Note that the promise of stability applies only after an interface has been part `emergency.target`, `poweroff.target`, `reboot.target`, - `halt.target`, - `runlevel[1-5].target`. + `halt.target`. We try to always preserve backward compatibility in programmatic interfaces and intentional breakage is never introduced. diff --git a/meson.build b/meson.build index e091631ca8..67c495155d 100644 --- a/meson.build +++ b/meson.build @@ -1597,6 +1597,7 @@ foreach tuple : [ ['backlight'], ['binfmt'], ['compat-mutable-uid-boundaries'], + ['compat-sysv-interfaces'], ['coredump'], ['efi'], ['environment-d'], @@ -3185,6 +3186,7 @@ foreach tuple : [ ['html pages', want_html], ['man page indices', want_man and have_lxml], ['compat-mutable-uid-boundaries'], + ['compat-sysv-interfaces'], ['utmp'], ['ldconfig'], ['adm group', get_option('adm-group')], diff --git a/meson_options.txt b/meson_options.txt index 93c264488c..4d13d2866d 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -52,6 +52,8 @@ option('initrd', type : 'boolean', description : 'install services for use when running systemd in initrd') option('compat-mutable-uid-boundaries', type : 'boolean', value : false, description : 'look at uid boundaries in /etc/login.defs for compatibility') +option('compat-sysv-interfaces', type : 'boolean', value : true, + description : 'keep legacy SysV interfaces for compatibility') option('quotaon-path', type : 'string', description : 'path to quotaon') option('quotacheck-path', type : 'string', description : 'path to quotacheck') diff --git a/units/meson.build b/units/meson.build index d64edec884..113a935c90 100644 --- a/units/meson.build +++ b/units/meson.build @@ -1,5 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later +runlevels = conf.get('ENABLE_COMPAT_SYSV_INTERFACES') == 1 + units = [ { 'file' : 'basic.target' }, { 'file' : 'blockdev@.target' }, @@ -46,7 +48,7 @@ units = [ { 'file' : 'getty@.service.in' }, { 'file' : 'graphical.target', - 'symlinks' : ['default.target'], + 'symlinks' : ['default.target'] + (runlevels ? ['runlevel5.target'] : []), }, { 'file' : 'halt.target' }, { @@ -139,7 +141,10 @@ units = [ 'conditions' : ['ENABLE_MACHINED'], }, { 'file' : 'modprobe@.service' }, - { 'file' : 'multi-user.target' }, + { + 'file' : 'multi-user.target', + 'symlinks' : runlevels ? ['runlevel2.target', 'runlevel3.target', 'runlevel4.target'] : [], + }, { 'file' : 'systemd-mute-console.socket', 'symlinks' : ['sockets.target.wants/'] @@ -152,7 +157,10 @@ units = [ { 'file' : 'nss-lookup.target' }, { 'file' : 'nss-user-lookup.target' }, { 'file' : 'paths.target' }, - { 'file' : 'poweroff.target' }, + { + 'file' : 'poweroff.target', + 'symlinks' : runlevels ? ['runlevel0.target'] : [], + }, { 'file' : 'printer.target' }, { 'file' : 'proc-sys-fs-binfmt_misc.automount', @@ -173,7 +181,7 @@ units = [ }, { 'file' : 'reboot.target', - 'symlinks' : ['ctrl-alt-del.target'], + 'symlinks' : ['ctrl-alt-del.target'] + (runlevels ? ['runlevel6.target'] : []), }, { 'file' : 'remote-cryptsetup.target', @@ -193,7 +201,10 @@ units = [ 'symlinks' : ['initrd-root-device.target.wants/'], }, { 'file' : 'rescue.service.in' }, - { 'file' : 'rescue.target' }, + { + 'file' : 'rescue.target', + 'symlinks' : runlevels ? ['runlevel1.target'] : [], + }, { 'file' : 'rpcbind.target' }, { 'file' : 'serial-getty@.service.in' }, { 'file' : 'shutdown.target' },