How does a gnome session start up?

First, apologies to those who are not using gnome (KDE users as well as those using more offbeat or cutting edge window managers). I run gnome on all my systems, so I will tell you what I actually know about and leave the rest to someone else.

A "session" is everything you do (and everything that is done for you) after you log in to a linux system. A machine can support multiple sessions, and you can be involved in sessions on more than one machine. These days, sessions are pretty much a windowing system concept. At least hardly anyone ever deals with a unix machine in any other way.

Most people run their linux systems in level 5, so they initially deal with GDM which asks for their user name and password and launches a session for them.

startx and xinit

In the old days (and you can still do this), you could run your system in level 3, and then after logging in use the startx command to launch a graphical session. I haven't used this method in years, so take all that follows with a grain of salt. There is also a command called xinit and I have always been in a fog about whether one should use startx or xinit. Aparently xinit is the more bare-bones of the two, and in fact startx is a shell script that will eventually call xinit. The most important thing xinit does is to start the X server, and you have options about display resolution and depth, as well as what clients to run.

The system wide configuration files for xinit are found in /etc/X11/xinit. User specific configuration files are found in .xinitrc (perhaps also .xserverrc)

starting a session from GDM

This whole business happens automatically, and usually that suffices. The point of these notes however is to discuss the details and ways that the automatic default behavior can be customized.

GDM itself starts the X server and then throws up the greeter (along with some kind of background). GDM can also do lots of tricky things that I almost never use on my systems. It can interact with remote systems via the XDMCP protocol, while doing this it can offer you a chooser to select one of many remote systems to login to. It can manage multiple X servers on a local machine. It can even be controlled via its own socket protocol. I will not discuss any of this fancy business here. all I am concerned about is the simple behavior where I have one local X server on display :0.

The /etc/gdm directory contains a number of directories, which in turn contain shell scripts to govern various aspects of what GDM does. The script named Default in each of these applies to my single local server scenario.

A person might be able to monkey with the Init script to run some benign applications without anyone being logged in.

The real focus of what goes on though is the /etc/gdm/Xsession script (which is a link to /etc/X11/xinit/Xsession). This link provides commonality between session startup from startx/xinit and from gdm. It is of central interest, as it sets up the user session. It is run with the credentials of the user being logged in. It has many options and complexities, one of which could be (but is not) to exec the script /etc/gdm/Xclients.

On my system the Xsession script is apparently invoked as:

Xsession gnome-session
So, it simply launches gnome-session. Apparently user specific files like .xsession or .Xclients or .xinitrc are just ignored. The idea of these files used to be that a user could set up a customized session by hacking away on on or the other of them with his favorite text editor.

Apparently this is a change, which has been reported as a bug. See Redhat bugzilla 454657. The fix (circa fc9) is to install a package called xorg-x11-xinit-session, and then dork with a user interface setting, which does sound pretty bogus. A brute force fix would be to hack the /etc/X11/xinit/Xsession file and have it check for the user .Xclients and exec it if it is found. This code is at the end of the Xsession script and to my mind ought to be up in front of the code that now runs gnome-session in every case.

I do the yum install xorg-x11-xinit-session and indeed after this, once I select a user, some menus pop up in the panel at the bottom of the screen (not in the central GDM GUI), and I can select from a "Sessions" menu "User Script" and it now honors the .xsession file for the user. Seems a long way around the tree to me, and I hate using a GUI for settings like this.

Gnome autostart files

This info is circa Fedora 11 -- 11/2009. Apparently part of what gnome-session does is to fuss with these files.

Take a look at the directory ~/.config/autostart. This contains a file for each application that is supposed to launch automatically when a user logs in. It may contain two files per application if the option to have gnome save and restore session the configuration has been set.

The files have names like ds9.desktop to start the application fresh, and a name like ds9-2.desktop to save the application info for a restart. It would seem that the second file is used if it exists.

These are pretty self explanatory ascii files that you can hack with the text editor of your choice, but there is also a GUI to manipulate these files called gnome-session-properties

bash and terminal sessions

If your X session contains a terminal window (and mine always contain at least one, usually several) they will need to run some kind of shell. My shell of choice is bash. Other people have their favorites, and some find it entertaining to promote their choice as the best one possible. Bash needs to set up your environment, and does that by reading various startup files.

The following information is a little old and crusty, I will update it one of these days .....

Bash starts up as a login shell (to be distinguished from a plain old interactive shell or a non-interactive shell).

It looks for (and executes) startup scripts in the following order (provided that they exist):

First /etc/profile

Then the first of the following that it finds:

Note that if you have more than one of these, only the first will be executed. In my case I have .bash_profile and .bashrc and my .bash_profile invokes my .bashrc (for better or worse).

Bash reads and executes ~/.bashrc if and only if it is not a login shell.


Have any comments? Questions? Drop me a line!

Adventures in Computing / tom@mmto.org