3

I've set up a Plymouth bootsplash inside an initramfs on Raspbian buster. (It's using something similar but not identical to the raspi-config RO overlay.) But I've noticed that there's a considerable delay after the Pi starts to boot before the splash is displayed.

The net result on a Pi3 is that it sits on a black screen for about 4-5 seconds, then shows the splash for about 1 second, then shows a black screen for 0.5 seconds, and finally shows the X desktop. (On a Pi2 it's similar, but the boot takes a little longer.) I'm hoping to streamline this and get it to be more seamless, or at least show up earlier.

(It worked better with Raspbian jessie, with a similar configuration but using upstart. The splash was shown earlier but it also stayed longer, although part of that is because boot took longer too.)

I've checked the plymouth debug logs, and plymouthd does appear to be getting started early enough (via the init-premount/plymouth script), but then it's not actually displaying the splash at that point:

[ply-boot-server.c:352]             print_connection_process_identity:connection is from pid 151 (/bin/plymouth --show-splash) with parent pid 146 (/bin/sh /scripts/init-premount/plymouth)
[ply-boot-server.c:449]                ply_boot_connection_on_request:got show splash request
[main.c:843]      plymouth_should_ignore_show_splash_calls:checking if plymouth should be running
[main.c:945]                                on_show_splash:no displays available to show splash on, waiting...

After this there are some logs relating to remounting the real root FS (naturally, I want the splash shown before this!), and then finally:

[ply-device-manager.c:861]                      create_devices_from_udev:Timeout elapsed, looking for devices from udev
[ply-device-manager.c:315]                  create_devices_for_subsystem:creating objects for drm devices
[ply-device-manager.c:315]                  create_devices_for_subsystem:creating objects for frame buffer devices
[ply-device-manager.c:332]                  create_devices_for_subsystem:found device /sys/devices/platform/soc/soc:fb/graphics/fb0
[ply-device-manager.c:339]                  create_devices_for_subsystem:device is initialized
[ply-device-manager.c:348]                  create_devices_for_subsystem:found node /dev/fb0
[ply-device-manager.c:262]                create_devices_for_udev_device:device subsystem is graphics
[ply-device-manager.c:268]                create_devices_for_udev_device:found frame buffer device /dev/fb0
[ply-device-manager.c:218]                      fb_device_has_drm_device:trying to find associated drm node for fb device (path: platform-soc:fb)
[ply-device-manager.c:241]                      fb_device_has_drm_device:no card entry!
[ply-device-manager.c:729] create_devices_for_terminal_and_renderer_type:creating devices for /dev/fb0 (renderer type: 2) (terminal: /dev/tty1)
[ply-renderer.c:236]                      ply_renderer_open_plugin:trying to open renderer plugin /usr/lib/arm-linux-gnueabihf/plymouth/renderers/frame-buffer.so
[./plugin.c:257]                                create_backend:creating renderer backend for device /dev/fb0
[ply-terminal.c:603]                             ply_terminal_open:trying to open terminal '/dev/tty1'
[ply-terminal.c:396]                 ply_terminal_refresh_geometry:looking up terminal text geometry
[ply-terminal.c:410]                 ply_terminal_refresh_geometry:terminal is now 200x75 text cells
[ply-terminal.c:447]                                 get_active_vt:Remembering that initial vt is 1
[./plugin.c:506]                                  query_device:32 bpp (8, 8, 8, 8) with rowstride 6400
[./plugin.c:273]                               initialize_head:initializing 1600x1200 head
[ply-renderer.c:256]                      ply_renderer_open_plugin:opened renderer plugin /usr/lib/arm-linux-gnueabihf/plymouth/renderers/frame-buffer.so
[main.c:993]                             on_keyboard_added:listening for keystrokes
[main.c:997]                             on_keyboard_added:listening for escape
[main.c:1001]                             on_keyboard_added:listening for backspace
[main.c:1005]                             on_keyboard_added:listening for enter
[ply-device-manager.c:666]            create_pixel_displays_for_renderer:Adding displays for 1 heads
[main.c:1047]                        on_pixel_display_added:pixel display added before splash loaded, so loading splash now
[main.c:873]           plymouth_should_show_default_splash:checking if plymouth should show default splash
[main.c:901]           plymouth_should_show_default_splash:using default splash because kernel command line has option "splash"
[main.c:472]                           show_default_splash:Showing splash screen

And this is finally when the splash actually appears.

The mention of "timeout" seemed suspicious, and I noticed that it was saying that DeviceTimeout was set to 5. So I tried setting this to 0 in /etc/plymouth/plymouthd.conf. Initially, this just displayed this and then stopped:

[ply-device-manager.c:416]                         watch_for_udev_events:watching for udev graphics device add and remove events
[ply-device-manager.c:315]                  create_devices_for_subsystem:creating objects for drm devices

And then eventually (at about the same time as before) it showed this, and the splash finally appeared:

[ply-boot-server.c:352]             print_connection_process_identity:connection is from pid 285 (/bin/plymouth show-splash) with parent pid 1 (/sbin/init splash plymouth:debug)
[ply-boot-server.c:449]                ply_boot_connection_on_request:got show splash request
[main.c:843]      plymouth_should_ignore_show_splash_calls:checking if plymouth should be running
[main.c:945]                                on_show_splash:no displays available to show splash on, waiting...

...

[ply-device-manager.c:380]                                 on_udev_event:got add event for device fb0
[ply-device-manager.c:262]                create_devices_for_udev_device:device subsystem is graphics
[ply-device-manager.c:268]                create_devices_for_udev_device:found frame buffer device /dev/fb0
[ply-device-manager.c:218]                      fb_device_has_drm_device:trying to find associated drm node for fb device (path: platform-soc:fb)
[ply-device-manager.c:241]                      fb_device_has_drm_device:no card entry!
[ply-device-manager.c:729] create_devices_for_terminal_and_renderer_type:creating devices for /dev/fb0 (renderer type: 2) (terminal: /dev/tty1)
[ply-renderer.c:236]                      ply_renderer_open_plugin:trying to open renderer plugin /usr/lib/arm-linux-gnueabihf/plymouth/renderers/frame-buffer.so
[./plugin.c:257]                                create_backend:creating renderer backend for device /dev/fb0
[ply-terminal.c:603]                             ply_terminal_open:trying to open terminal '/dev/tty1'

So some slight differences but still no actual success. (Oddly, this looks like it's getting the show-splash command from init -- presumably plymouth-start.service -- rather than the init-premount script as previously. I have no idea why, nor if that's significant.)

Does anyone know the proper incantation to get plymouth to recognise the display earlier on (I'm using the standard HDMI output)? Or the next step to diagnose this further?

FWIW, I did try breaking into a terminal inside the initramfs just after running plymouth, and confirmed that /dev/fb0 did indeed exist at the time. I'm not sure if there's anything else to check at that point.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.