package/systemd: fix "Timed out waiting for device /dev/console."
authorXavier Ruppen <xruppen@gmail.com>
Mon, 4 Mar 2019 19:25:47 +0000 (20:25 +0100)
committerPeter Korsgaard <peter@korsgaard.com>
Mon, 4 Mar 2019 21:33:02 +0000 (22:33 +0100)
Buildroot built with systemd fails to open a login prompt on the
serial port when /dev/console is specified as BR2_TARGET_GENERIC_GETTY_PORT
(which is its default value):

systemd[1]: dev-console.device: Job dev-console.device/start timed out.
systemd[1]: Timed out waiting for device /dev/console.
systemd[1]: Dependency failed for Serial Getty on console.
systemd[1]: serial-getty@console.service: Job serial-getty@console.service/start failed with result 'dependency'.
systemd[1]: dev-console.device: Job dev-console.device/start failed with result 'timeout'.
systemd[1]: Reached target Login Prompts.
systemd[1]: Reached target Multi-User System.

According to this issue on Github [1], serial-getty@.service should
not be instantiated on /dev/console, console-getty@.service should
be used instead. This stems from the fact that there should be no
dependency on /dev/console.

[1] https://github.com/systemd/systemd/issues/10914

Signed-off-by: Xavier Ruppen <xruppen@gmail.com>
Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
[Peter: drop SERVICE variable as suggested by Yann]
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
package/systemd/systemd.mk

index 7a46a50ed34dd8a6a26f96fc5d619c3ab53fec84..6f0e451b5b9921567f62a1138f2fed36b217bbc9 100644 (file)
@@ -397,19 +397,26 @@ endef
 
 ifneq ($(call qstrip,$(BR2_TARGET_GENERIC_GETTY_PORT)),)
 # systemd needs getty.service for VTs and serial-getty.service for serial ttys
+# note that console-getty.service should be used on /dev/console as it should not have dependencies
 # also patch the file to use the correct baud-rate, the default baudrate is 115200 so look for that
 define SYSTEMD_INSTALL_SERVICE_TTY
-       if echo $(BR2_TARGET_GENERIC_GETTY_PORT) | egrep -q 'tty[0-9]*$$'; \
+       if [ $(BR2_TARGET_GENERIC_GETTY_PORT) = "console" ]; \
        then \
-               SERVICE="getty"; \
+               TARGET="console-getty.service"; \
+               LINK_NAME="console-getty.service"; \
+       elif echo $(BR2_TARGET_GENERIC_GETTY_PORT) | egrep -q 'tty[0-9]*$$'; \
+       then \
+               TARGET="getty@.service"; \
+               LINK_NAME="getty@$(call qstrip,$(BR2_TARGET_GENERIC_GETTY_PORT)).service"; \
        else \
-               SERVICE="serial-getty"; \
+               TARGET="serial-getty@.service"; \
+               LINK_NAME="serial-getty@$(call qstrip,$(BR2_TARGET_GENERIC_GETTY_PORT)).service"; \
        fi; \
-       ln -fs ../../../../lib/systemd/system/$${SERVICE}@.service \
-               $(TARGET_DIR)/etc/systemd/system/getty.target.wants/$${SERVICE}@$(BR2_TARGET_GENERIC_GETTY_PORT).service; \
+       ln -fs ../../../../lib/systemd/system/$${TARGET} \
+               $(TARGET_DIR)/etc/systemd/system/getty.target.wants/$${LINK_NAME}; \
        if [ $(call qstrip,$(BR2_TARGET_GENERIC_GETTY_BAUDRATE)) -gt 0 ] ; \
        then \
-               $(SED) 's,115200,$(BR2_TARGET_GENERIC_GETTY_BAUDRATE),' $(TARGET_DIR)/lib/systemd/system/$${SERVICE}@.service; \
+               $(SED) 's,115200,$(BR2_TARGET_GENERIC_GETTY_BAUDRATE),' $(TARGET_DIR)/lib/systemd/system/$${TARGET}; \
        fi
 endef
 endif