Message ID | 20250812211424.76559-1-pkj@axis.com |
---|---|
State | New |
Headers | show |
Series | systemd.bbclass: Make systemd_postinst run as intended | expand |
On Tue, 12 Aug 2025 at 23:14, Peter Kjellerstedt via lists.openembedded.org <peter.kjellerstedt=axis.com@lists.openembedded.org> wrote: > - if [ -z "$D" ]; then > + if [ -z "$D" ] && systemctl >/dev/null 2>/dev/null; then etc. Ugh. Is it possible to *not* do this >dev/null 2>dev/null thing? Discarding output, and especially discarding stderr has been shown time and again to cause headaches when things go wrong (and they do). Alex
On Tue Aug 12, 2025 at 11:14 PM CEST, Peter Kjellerstedt via lists.openembedded.org wrote: > After the switch from using a systemctl written in Python to using the > official version of systemctl from the systemd project, the > systemd_postinst function has effectively not been executed during the > rootfs creation. The reason is that systemctl provided by > systemctl-native fails if run without argument (as systemd_postinst > does): > > Failed to connect to system scope bus via local transport: Operation > not permitted (consider using --machine=<user>@.host --user to connect > to bus of other user) > > This is not seen in the logs since stderr is sent to /dev/null, and the > only way to tell that there is a problem is because systemd services > that are expected to be enabled aren't running. > > The reason this has gone unnoticed is because systemd_handle_machine_id > in rootfs-postcommands.bbclass will call systemctl preset-all, which in > most cases will create the missing links to enable the systemd services. > > This change effectively reverts commit > a52e66762c0c51918b1ba3d4622759637b6e920a (systemd.bbclass: update > command to check systemctl available) and instead only runs systemctl > without arguments (to determine that it can communicate with systemd) > when executed on target. > > Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> > --- Hi Peter, It looks like this is breaking the build in some configurations: ERROR: core-image-sato-1.0-r0 do_rootfs: Postinstall scriptlets of ['bluez5', 'ofono', 'connman', 'xserver-nodm-init', 'avahi-daemon', 'rpcbind', 'run-postinsts'] have failed. If the intention is to defer them to first boot, then please place them into pkg_postinst_ontarget:${PN} (). Deferring to first boot via 'exit 1' is no longer supported. https://autobuilder.yoctoproject.org/valkyrie/#/builders/26/builds/2193 Can you have a look at these errors please? Best regards, Mathieu
On Wed Aug 13, 2025 at 12:10 PM CEST, Mathieu Dubois-Briand wrote: > On Tue Aug 12, 2025 at 11:14 PM CEST, Peter Kjellerstedt via lists.openembedded.org wrote: >> After the switch from using a systemctl written in Python to using the >> official version of systemctl from the systemd project, the >> systemd_postinst function has effectively not been executed during the >> rootfs creation. The reason is that systemctl provided by >> systemctl-native fails if run without argument (as systemd_postinst >> does): >> >> Failed to connect to system scope bus via local transport: Operation >> not permitted (consider using --machine=<user>@.host --user to connect >> to bus of other user) >> >> This is not seen in the logs since stderr is sent to /dev/null, and the >> only way to tell that there is a problem is because systemd services >> that are expected to be enabled aren't running. >> >> The reason this has gone unnoticed is because systemd_handle_machine_id >> in rootfs-postcommands.bbclass will call systemctl preset-all, which in >> most cases will create the missing links to enable the systemd services. >> >> This change effectively reverts commit >> a52e66762c0c51918b1ba3d4622759637b6e920a (systemd.bbclass: update >> command to check systemctl available) and instead only runs systemctl >> without arguments (to determine that it can communicate with systemd) >> when executed on target. >> >> Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> >> --- > > Hi Peter, > > It looks like this is breaking the build in some configurations: > > ERROR: core-image-sato-1.0-r0 do_rootfs: Postinstall scriptlets of ['bluez5', 'ofono', 'connman', 'xserver-nodm-init', 'avahi-daemon', 'rpcbind', 'run-postinsts'] have failed. If the intention is to defer them to first boot, > then please place them into pkg_postinst_ontarget:${PN} (). > Deferring to first boot via 'exit 1' is no longer supported. > > https://autobuilder.yoctoproject.org/valkyrie/#/builders/26/builds/2193 > > Can you have a look at these errors please? > > Best regards, > Mathieu I just saw selftests are also failing for the same reason: 2025-08-13 08:15:22,377 - oe-selftest - INFO - overlayfs.OverlayFSTests.test_not_all_units_installed (subunit.RemotedTestCase) 2025-08-13 08:15:22,388 - oe-selftest - INFO - ... FAIL ... ERROR: core-image-minimal-1.0-r0 do_rootfs: Postinstall scriptlets of ['run-postinsts'] have failed. If the intention is to defer them to first boot, https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/2141 https://autobuilder.yoctoproject.org/valkyrie/#/builders/48/builds/2069
diff --git a/meta/classes-recipe/systemd.bbclass b/meta/classes-recipe/systemd.bbclass index 12c59647be..3d8ca24a68 100644 --- a/meta/classes-recipe/systemd.bbclass +++ b/meta/classes-recipe/systemd.bbclass @@ -29,7 +29,7 @@ python __anonymous() { } systemd_postinst() { -if systemctl >/dev/null 2>/dev/null; then +if type systemctl >/dev/null 2>/dev/null; then OPTS="" if [ -n "$D" ]; then @@ -46,7 +46,7 @@ if systemctl >/dev/null 2>/dev/null; then done fi - if [ -z "$D" ]; then + if [ -z "$D" ] && systemctl >/dev/null 2>/dev/null; then # Reload only system service manager # --global for daemon-reload is not supported: https://github.com/systemd/systemd/issues/19284 systemctl daemon-reload @@ -66,8 +66,8 @@ fi } systemd_prerm() { -if systemctl >/dev/null 2>/dev/null; then - if [ -z "$D" ]; then +if type systemctl >/dev/null 2>/dev/null; then + if [ -z "$D" ] && systemctl >/dev/null 2>/dev/null; then if [ -n "${@systemd_filter_services("${SYSTEMD_SERVICE_ESCAPED}", False, d)}" ]; then systemctl stop ${@systemd_filter_services("${SYSTEMD_SERVICE_ESCAPED}", False, d)} systemctl disable ${@systemd_filter_services("${SYSTEMD_SERVICE_ESCAPED}", False, d)}
After the switch from using a systemctl written in Python to using the official version of systemctl from the systemd project, the systemd_postinst function has effectively not been executed during the rootfs creation. The reason is that systemctl provided by systemctl-native fails if run without argument (as systemd_postinst does): Failed to connect to system scope bus via local transport: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user) This is not seen in the logs since stderr is sent to /dev/null, and the only way to tell that there is a problem is because systemd services that are expected to be enabled aren't running. The reason this has gone unnoticed is because systemd_handle_machine_id in rootfs-postcommands.bbclass will call systemctl preset-all, which in most cases will create the missing links to enable the systemd services. This change effectively reverts commit a52e66762c0c51918b1ba3d4622759637b6e920a (systemd.bbclass: update command to check systemctl available) and instead only runs systemctl without arguments (to determine that it can communicate with systemd) when executed on target. Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> --- meta/classes-recipe/systemd.bbclass | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)