From: Zbigniew Jędrzejewski-Szmek Date: Wed, 28 Jan 2026 15:37:18 +0000 (+0100) Subject: units: restore runlevel[0-6].target aliases X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0acd1b4f35034572fea9a00ca074a1d9c1f72856;p=thirdparty%2Fsystemd.git 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. --- diff --git a/docs/PORTABILITY_AND_STABILITY.md b/docs/PORTABILITY_AND_STABILITY.md index 7de60066e45..da545f7c015 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 e091631ca82..67c495155d1 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 93c264488c0..4d13d2866d2 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 d64edec8844..113a935c90b 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' },