From Fedora Project Wiki

Better Startup Experience (Graphical Boot Sequence)

Summary

The startup experience needs to be flicker-free, seamless and shiny. To do this we are getting rid of RHGB and writing a new program, Plymouth, that starts earlier (even before / is mounted!), doesn't require an X server, and gets rid of a lot of the noise during startup.

Plymouth will requires DRM kernel modesetting drivers to get pretty graphics, but will have a text mode fallback for systems without driver support.

Owner

  • Name: RayStrode, KristianHoegsberg, JonMcCann, PeterJones, DavidAirlie et al

Current status

  • Targeted release: Fedora 10
  • Last updated: 2008-07-03
  • Percentage of completion: 50%

F9 has kernel modesetting for Intel hardware. Ray has been working on a prototype rhgb replacement called Plymouth. It was put on hold while kernel modesetting was maturing, and has been revived after F9. Modesetting is again in flux, though, in rawhide, since there are two memory managers in play. These are the long anticipated TTM memory manager from tungsten graphics, and the newer GEM memory manager from Eric Anholt at Intel that supercedes TTM. Kristian is trying to get GEM into rawhide soon.

The current plymouth sources can be found here: http://gitweb.freedesktop.org/?p=plymouth;a=summary . There are plymouth packages in rawhide already, modesetting drivers, aren't, so most people won't be able to see graphical boot up yet. Having said that, we enable the text plugin by default now. Anyone using rawhide will see it, although it's sort of ugly and flickery.

The new startup sequence (including quiet kernel, quiet grub, plymouth, smooth transition to the login screen) has been demonstrated at the Red Hat Summit and was shown informally to various people at FUDcon.

Scope

Requires changes to grub, mkinitrd, initscripts, gdm, X, possibly other packages. rhgb will be replaced by Plymouth. The extent of this project is getting a graphical boot sequence that is polished and professional looking.

Boot up could be made faster, too, but that issue is orthogonal and should be tracked separately .

Test Plan

  • Verify that boot without rhgb in the kernel cmdline gives a traditional text mode boot sequence
  • Verify that failure to set a mode in initrd falls back to a clean and simple text mode boot sequence
  • Verify that the graphical boot sequence contains only a single mode switch from blank text mode to graphical mode, and that there is a smooth transition from the startup animation to the login screen
  • Verify that entering encryption passwords works both in the graphical case and in the fallback case
  • Verify that specifying a mode in the kernel commandline works
  • Verify that failure messages from service startup can inspected after boot
  • Verify that dropping to a shell on critical errors works

Dependencies

This feature depends on plymouth getting into F10. It also depends on a ton of other things...

Details

For a smooth and shiny experience, we want

  • the mode should be changed early from text mode to the most optimal graphics mode available
  • the mode should not be changed more than once
  • there should be no other uncontrolled transitions
  • there should be no text messages, unless the user presses Escape to see them
  • there should be good, smooth transitions

The fallback if mode-setting fails or is unavailable is text mode.

Timeline of the current bootup

bios text
grub graphical
grub info 4>text
kernel boot
initrd drivers
init
rhgb graphical
text login text
gdm 3>graphical
gnome startup
user session

Plan for improving this

  • do away with mode switch for grub menu by default (ie, don't show the image unless "needed")
    • Kristian currently has a patch for this. You press and hold ctrl (or any key) during boot up and the menu appears. It's in rawhide now, but the default configuration isn't making use of it.
  • make kernel, nash and init obey the quiet option
    • There are patches for these, though the kernel keeps sneaking messages in.
  • switch to graphical mode in the initrd, draw an animation and keep it running until gdm starts up
    • We have an animation but need there are some changes we need to make to the X server and GDM to keep the transitions smooth
  • rhgb goes away
    • rhgb is already gone
  • make the X server started by gdm take over the existing vt, mode and framebuffer content
    • krh has a patch which adds a -nr ("no root") option which makes the root window keep the framebuffer contents that were around when X started
  • improve the transitions animation -> gdm -> session
  • firstboot runs on the gdm X server

This lets us start with a blank screen in text mode, then a single switch to graphics mode, then an animation, then the login screen fades in.

bios 3>text
grub
kernel boot
initrd drivers 5>graphical
init
gdm
gnome startup
user session

One complication is support for encrypted disks. This may require us to ask for a password in the initrd, before we have X or toolkits. The proposal for acceptable input-handling (at least as far as keyboard layouts are concerned) is to write an xkb-to-console-converter.

Tasks

  • Make grub not display a splash image unless the user holds down ctrl to get to a menu. Grub will have a near zero timeout, but users will be able to hold the key down at the bios before grub shows up.
  • Make grub not report which choice was selected if the user didn't pick a choice #239760
  • Make drm drivers/mode-setting happen in the upstream kernel (see http://www.ussg.iu.edu/hypermail/linux/kernel/0705.2/0893.html)
  • Put drm drivers in the initrd
  • If rhgb is in the kernel commandline, switch mode in initrd, use drmfb on vt7
  • Put animation drawing app in the initrd, keep initrd mounted until that app exits
  • For selecting the mode, make s-c-d set a kernel commandline like rhgb:mode=1600x1200 or similiar
  • Open question: what about multihead ? answer for now: all heads painted in background color except one chosen randomly with animation
  • Display animation all the way from initrd until gdm comes up, keep initrd mounted until it exits
  • Redirect init output early on to a pseudo-terminal
  • Have something that buffers the output, can buffer it on the initrd
  • If something happens that drops us to a shell (filesystem errors), hook up a framebuffer console with the pseudo-terminal
  • If there are warnings in the saved bootup messages, show a "Show boot messages" button on the login screen and/or in the notification area
  • Need to start X on the existing vt, not set mode (unless we are still in text mode), preserve existing framebuffer content
  • Coordinate session startup. fade in ? might be able to do something nice if we have compositing

TODO

  • krh to get GEM in rawhide. GEM is a key component to getting shared graphics between X and plymouth.
  • plymouth needs to be ported to use libdrm api for modesetting. It currently uses standard kernel ioctls on /dev/fb for getting a front buffer to render to. By using libdrm we'll be able to set the mode intellibly in multihead environments, place X's mouse cursor off center before X is even started, etc. This api is still in flux, though.
  • plymouth's password entry needs to be smarter about boundries. You can currently type past the edge of the entry
  • we need to update rc.sysinit to call plymouth hide-splash before jumping to a sulogin. Right now plymouth keeps going on top of the sulogin, so the user never knows what's happening.
  • We need to update mkinitrd to use plymouth ask-for-password --command="cryptsetup luksOpen ..." instead of doing plymouth --ask-for-password > password.txt; cryptsetup luksOpen ... password.txt. The new --command interface allows plymouth to call cryptsetup in a loop if the user mistypes password.
  • We need to make plymouth support font rendering after root fs is mounted, so auxillary encrypted block devices can have a prompt string.
  • We need to add a -hidecursor (ajax already has a patch from someone) and -nr (don't clear frontbuffer) options to X to make the transition from plymouth to X smoother.
  • We need to update GDM to use those option.
  • We need to update GDM to not set it's background, and instead just use what was shown during plymouth
  • We need to make plymouth always run, even if rhgb isn't on the command line, so we still get boot logging and nash's daemonize command doesn't get confused.
  • Turn on silent grub mode
  • Need to run art by fedora-art-list for opinions and potential changes
  • Need to figure out what to do on shutdown. This probably means having a plymouth client command to activate the daemon and show splash
  • Need to figure out what to do on wake up from hibernate. We can probably show a still image, but no animation.
  • Right now we get events about boot from the legacy init scripts. Might be nice to get events in a more upstart friendly way.
  • Might be good to detect a failure during boot up and show it to the user at the login screen via a notification area icon.

Contingency Plan

If things don't work out as expected, we can bring back rhgb from the dead.

Documentation

Release Notes

Comments

Q: LuyaTshimbalanga: What happened to early-login project?

  • Ray Strode: early-login was ditched a while ago, though, Jon Nettleton recently started something similiar. See fedora-desktop-list

Q: MartinJürgens: The shutdown experience should also be nice and shiny. Would be nice if this spec would include that.

  • Ray Strode: potentially, although I'd like shutdown to just be 'kill all processes that have open files' and cut power

Q: MikePetullo: There is an effort to bring encrypted root filesystems to Fedora. One of the weaknesses of our work so far is that we can't provide an internationalized encryption key prompt very early in the boot process (i.e., in the initrd). Could this better startup feature allow us to do this?

  • Ray Strode: Given that encrypted block devices are slated for F9, i think we have to bring this into account. I talked to Jeremy Katz about this last week some. The answer to the i18n problem, may be to use icons instead of text. We could potentially have text, but it means bringing in my libraries, potentially translations, etc