I have developed a patch which I believe fixes the problem. https://paste.ubuntu.com/p/QRw4XTkXkV/
** Description changed: [Impact] * update-rc.d, in sysv-rc-2.88dsf-41ubuntu6.3 is broken in trusty. - * update-rc.d incorrectly modifies symlinks when enabling or disabling - services which are started on the "S" runlevel. + * update-rc.d incorrectly modifies symlinks when enabling or disabling + services which are started on the "S" runlevel. - * This can lead to services being changed from S runlevel from where they - would be started on boot, to "0" runlevel, and are run on halt, which is - incorrect. + * This can lead to services being changed from S runlevel from where they + would be started on boot, to "0" runlevel, and are run on halt, which is + incorrect. * The bug is caused by trying to use the runlevel to index into an integer - array of runlevels. When the runlevel in question is "S", an error is - printed + array of runlevels. When the runlevel in question is "S", an error is + printed - Argument "S" isn't numeric in array element at /usr/sbin/update-rc.d line - 232. + Argument "S" isn't numeric in array element at /usr/sbin/update-rc.d line + 232. Perl then sets the index to default to 0, which changes the runlevel. - * The fix is to check if the runlevel is "S", and if it is, set the index to - 99 which conforms with other expected usages for the "S" runlevel in the - script. See the "startstop" and "makelinks" subroutines. + * The fix is to check if the runlevel is "S", and if it is, set the index to + 99 which conforms with other expected usages for the "S" runlevel in the + script. See the "startstop" and "makelinks" subroutines. [Test Case] - * You can reproduce this with any service that is started on the "S" - runlevel. We will use open-iscsi for an example. + * You can reproduce this with any service that is started on the "S" + runlevel. We will use open-iscsi for an example. 1) Install open-iscsi $ sudo apt install open-iscsi 2) Check to see symlinks for init.d scripts are set to defaults: root@trusty-openiscsi:/etc# ls -l /etc/rc[0123456S].d/*iscsi* /etc/rc0.d/K80umountiscsi.sh -> ../init.d/umountiscsi.sh /etc/rc0.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc1.d/K80umountiscsi.sh -> ../init.d/umountiscsi.sh /etc/rc1.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc6.d/K80umountiscsi.sh -> ../init.d/umountiscsi.sh /etc/rc6.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rcS.d/S45open-iscsi -> ../init.d/open-iscsi 3) Use update-rc.d to enable open-iscsi service root@trusty-openiscsi:/etc# update-rc.d open-iscsi enable update-rc.d: warning: start runlevel arguments (none) do not match open-iscsi Default-Start values (S) update-rc.d: warning: stop runlevel arguments (none) do not match open-iscsi Default-Stop values (0 1 6) Argument "S" isn't numeric in array element at /usr/sbin/update-rc.d line 232. Enabling system startup links for /etc/init.d/open-iscsi ... Removing any system startup links for /etc/init.d/open-iscsi ... /etc/rc0.d/K81open-iscsi /etc/rc1.d/K81open-iscsi /etc/rc6.d/K81open-iscsi /etc/rcS.d/S45open-iscsi Adding system startup for /etc/init.d/open-iscsi ... /etc/rc0.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc1.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc6.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc0.d/S45open-iscsi -> ../init.d/open-iscsi - * The problem is the "/etc/rcS.d/S45open-iscsi" symlink is incorrectly - changed to "/etc/rc0.d/S45open-iscsi". + * The problem is the "/etc/rcS.d/S45open-iscsi" symlink is incorrectly + changed to "/etc/rc0.d/S45open-iscsi". - * Instead, the correct behaviour is to keep the symlink in /etc/rcS.d/ - intact: + * Instead, the correct behaviour is to keep the symlink in /etc/rcS.d/ + intact: root@trusty-openiscsi:/etc# update-rc.d open-iscsi enable update-rc.d: warning: start runlevel arguments (none) do not match open-iscsi Default-Start values (S) update-rc.d: warning: stop runlevel arguments (none) do not match open-iscsi Default-Stop values (0 1 6) Enabling system startup links for /etc/init.d/open-iscsi ... Removing any system startup links for /etc/init.d/open-iscsi ... /etc/rc0.d/K81open-iscsi /etc/rc1.d/K81open-iscsi /etc/rc6.d/K81open-iscsi /etc/rcS.d/S45open-iscsi Adding system startup for /etc/init.d/open-iscsi ... /etc/rc0.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc1.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rc6.d/K81open-iscsi -> ../init.d/open-iscsi /etc/rcS.d/S45open-iscsi -> ../init.d/open-iscsi [Regression Potential] - * There is only one file modified, which is the update-rc.d perl script. - Worst case scenario is that users cannot enable or disable their services, - or a symlink is changed such that a service is started / stopped on an - incorrect runlevel. + * There is only one file modified, which is the update-rc.d perl script. + Worst case scenario is that users cannot enable or disable their services, + or a symlink is changed such that a service is started / stopped on an + incorrect runlevel. - * If a regression happens, any damage should be easily spotted by a - sysadmin and can be manually repaired by making manual symlinks with - "ln -s". + * If a regression happens, any damage should be easily spotted by a + sysadmin and can be manually repaired by making manual symlinks with + "ln -s". + + * I have built and tested the change in a PPA, which you can find here: + https://launchpad.net/~mruffell/+archive/ubuntu/sysvinit-testing + + * My only cause for concern is that if a regression does happen, it may + impact packages that run "update-rc.d <service> [en|dis]able" in a + postinstall module, although I haven't managed to find an example that + does this, since most use the "defaults" command instead. [Other Info] - * trusty is the last Ubuntu release to use sysvinit, and this bug is not - present in newer versions since they use systemd, and the code in question - is removed from update-rc.d. + * trusty is the last Ubuntu release to use sysvinit, and this bug is not + present in newer versions since they use systemd, and the code in question + is removed from update-rc.d. - * The bug exists in debian squeeze, which is now unsupported, and the code - in question is not in any newer versions. + * The bug exists in debian squeeze, which is now unsupported, and the code + in question is not in any newer versions. - * The bug was introduced in 2009-06-29 and somehow evaded anyone noticing - it. + * The bug was introduced in 2009-06-29 and somehow evaded anyone noticing + it. -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1827172 Title: update-rc.d: enabling or disabling S runlevel services incorrectly modifies runlevel To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/sysvinit/+bug/1827172/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs