# [HowTo] Ouvrir une session graphique au démarrage

## yaubi

Bonjour à tous !

Etant le seul utilisateur de mon portable -- utilisateur physique, j'entends -- et ce portable n'étant pas une bête de course, loin de là, j'ai une sainte horreur des kdm, gdm et autres xdm qui, en plus de ne me servir à rien, consomment de la mémoire et me font perdre du temps. Bref, vous l'aurez compris, ça m'énerve !  :Evil or Very Mad: 

Mon objectif du jour a donc été, hormis de réviser pour mes exams  :Sad: , de trouver un moyen d'ouvrir ma session graphique automatiquement au démarrage, sans devoir me loguer où que ce soit. Oui, je sais, les accros de la sécurité vont bondir, mais c'est pourtant bien confortable.

Ma solution s'inspire largement du service xdm, destiné à lancer le display manager que je haïs tant. Voici, dans un premier temps, les modification à apporter pour bénéficier de cette fonctionnalité.

Dans /etc/inittab, ajouter à la fin :

```
xu:b:once:/etc/X11/startUS.sh
```

Créer le fichier /etc/init.d/xuser contenant :

```
#!/sbin/runscript

# Copyright 1999-2004 Gentoo Technologies, Inc.

# Distributed under the terms of the GNU General Public License, v2 or later

 

# This script is largely inspired from /etc/init.d/xdm

#

# Don't forget to set XUSER to the desired username in /etc/conf.d/xuser

#

# Yoann Aubineau

# yoann@yaubi.com

# 2004.03.10

 

# Start X Font Server before X

depend() {

        use xfs hotplug

}

 

start() {

        USER="$(echo ${XUSER} | awk '{ print tolower($1) }')"

 

        ebegin "Starting X session for ${USER}"

        save_options "user" "${USER}"

 

        /sbin/telinit b &>/dev/null

        eend 0

}

 

stop() {

        local retval=0

        local curvt="$(fgconsole)"

 

        ebegin "Stopping X session"

 

        rm -f ${svcdir}/options/xuser/user

 

        if [ "$(ps -A | grep -e "startx")" ]

        then

                start-stop-daemon --stop \

                        --name "startx"

                retval=$?

        fi

 

        #switch back to original vt

        chvt "${curvt}" &>/dev/null

 

        eend ${retval} "Error stopping ${myservice}."

 

        return ${retval}

}
```

Créer le fichier /etc/X11/startUS.sh contenant :

```
#!/bin/sh

 

source /etc/init.d/functions.sh

source /etc/profile

 

if [ -e ${svcdir}/options/xuser/user ]

then

        retval=0

 

        USER="`cat ${svcdir}/options/xuser/user`"

        export GDK_USE_XFT=1

        /sbin/start-stop-daemon --start --background \

                --exec "/bin/su" -- - ${USER} -l -c "/usr/X11R6/bin/startx &> /dev/null"

 

        retval=$?

 

        #wait; sleep 2

 

        if [ "${retval}" -ne 0 ]

        then

                einfo "ERROR: could not start the X session..."

                killall -9 "startx" &> /dev/null

        fi

fi
```

Remplacer le service xdm par xuser :

```
$ rc-update del xdm

$ rc-update add xuser default
```

Créer le fichier /etc/conf.d/xuser contenant :

```
# Config file for /etc/init.d/xuser

 

XUSER=yoann #type your username here
```

Voici comment tout cela fonctionne :

Lors de la procédure d'initialisation du système, le service xuser est lancé. Le script /etc/init.d/xuser récupère et enregistre le nom de l'utilisateur pour lequel on veut lance une session graphique, puis active le runlevel b et se termine. init reçoit cette activation mais ne la prends pas en compte tant que la procédure d'initialisation en cours n'est pas terminée. Lorsque que c'est finalement le cas, init exécute les actions définies pour le runlevel  b, c'est à dire lance le script /etc/X11/startUS.sh. Celui-ci se charge de lancer startx pour l'utilisateur en ayant soin de préserver les variables d'environnement, dont les locales et le répertoire personnel.

Pourquoi le script /etc/init.d/xuser ne fait-il pas tout, tout seul ? Pourquoi se compliquer la tâche en définissant un runlevel à part ?

Tout simplement parce que les scripts d'initialisation (ceux présents dans /etc/init.d/, dont /etc/init.d/xuser) sont lancés avant que les consoles ne soient chargées. Du coup, si on lance startx dès le début, le serveur X va s'approprier la première console disponible, à savoir vt2. En passant par un nouveau runlevel, on s'assure que les consoles sont bien chargées avant que le serveur ne démarre.

Voilà pour mes 2¢  :Smile: 

Feedback welcome !

Yoann

----------

## Bastux

Je vais tester ça ce soir et te dire si ya des trucs ki cloche.

Mais à première vue je dirais... bon boulot!   :Laughing: 

----------

## Bastux

ça me parait bizarre que tu puisse pas lancer xuser après l'apparition des consoles...

ça dépend surement d'un after ou un truc comme ça.

Perso j'utilise bootsplash et c lui défini le bootsplash des autres consoles, ça veut forcément dire que les consoles arrivent AVANT bootsplash (le service).

En bidouillant ton xuser, tu dois pouvoir éviter le lancement du X avant les consoles.

La partie du inittab c la seule crade, le reste est nickel  :Very Happy: 

----------

## Bastux

C'est très bizarre...

Je viens de lire dans la doc gentoo sur les script d'init qu'effectivemenet init lançait les services PUIS les consoles...

Donc ce que je viens de dire n'a plus de sens.

Par contre moi j'ai une autre question du coup :

Comment les autres services de démarrage font pour se lancer dans le vty7?

----------

## Bastux

Après étude de /etc/inittab et /etc/init.d/xdm j'ai compris  :Very Happy: 

En fait on peut pas faire autrement, X utilise la même chose en faisant un 

```

x:a:once:/etc/X11/startDM.sh

```

à la fin. Il est expliqué au début du fichier pourquoi :

 *Quote:*   

> 
> 
> # Any Display manager (gdm,kdm,xdm) have the following problem:  if
> 
> # it is started before any getty, and no vt is specified, it will
> ...

 

Donc bien vu  :Wink: 

Désolé de m'être énervé avec tous mes posts, mais au moins j'ai appris qq chose today  :Very Happy: 

Bon boulotLast edited by Bastux on Wed Mar 10, 2004 7:36 pm; edited 2 times in total

----------

## yaubi

Le seul service qui utilise un vt est xdm. Il est donc obligé de mettre en oeuvre la technique du runlevel. C'est d'ailleurs de xdm que j'ai tiré la solution à mon problème  :Smile: .

Quant aux autres services, ils ne font qu'afficher un cours message, sans monopoliser de vt, donc il n'y a pas de problème de ce coté là.

[EDIT] Tu as été plus rapide que moi  :Smile:  [/EDIT]

----------

## Bastux

Sinon petit détail. Je ne suis pas sur ke le "einfo" de startUS.sh fonctionne car là tu es dans bash et cette commande n'existe pas avec bash.

A confirmer.

----------

## yaubi

Non, effectivement, ce n'est pas une commande interne de bash, mais une fonction spécifique aux scripts d'initialisation de Gentoo disponible dans le fichier /etc/init.d/functions.sh  :Smile: 

 */etc/X11/startUS.sh wrote:*   

> source /etc/init.d/functions.sh

 

----------

## Bastux

 *yaubi wrote:*   

> Non, effectivement, ce n'est pas une commande interne de bash, mais une fonction spécifique aux scripts d'initialisation de Gentoo disponible dans le fichier /etc/init.d/functions.sh 
> 
>  */etc/X11/startUS.sh wrote:*   source /etc/init.d/functions.sh 

 

Autant pour moi  :Smile: 

J'avais pas vu le source /etc/init.d/functions.sh...

Jvous jure parfois j'arrive à dire des trucs intelligents me jugez pas!!!  :Laughing: 

----------

## foulmetal

Et pourquoi ne pas lancer X directement depuis une session login en console ?

Tout ce qu'il faut faire c'est uniquement ouvrir son ~/.bashrc ou son ~/.zshrc et d'y ajouter les lignes suivantes :

```
$TTY=$(tty)

if [ $TTY = /dev/tty1 -o $TTY = /dev/vc/1 ]; then

   startx

fi
```

Ça va exécuter une session X uniquement à partir de la première console (et forcément ça la réquisitionne).

C'est déjà plus simple à mettre en uvre, c'est beaucoup moins de bidouillage et d'autre part on ne casse pas la sécurité  :Wink: 

----------

## Polo

oui, c'est très possible, mais ce qu'il voulait, c'etait justement de ne pas se logguer....

Et avec startx dans le .bashrc ,  tu doit quand meme te logguer

(après je suis pas dans le tête de yaubi  :Very Happy:  )

----------

## gulivert

Rooo trop bonn ton script, c'est marrant car pas plus tard que samedi j'essayais de faire un script ini pour me loguer et lancer X automatiquement sans utiliser xdm ou autres. Comme koi   :Very Happy: 

Merci je test ce soir, fait plaisir ....   :Wink: 

----------

## gulivert

Hello

Ben je viens de tester tes scripts et j'ai deux soucis avec.

1.- Lorsque l'ordi se lance, j'ai bien le service xuser qui se lance juste avant le service local, puis sa arrive au prompt.

Depuis ce moment là je dois attendre environ 2 minutes avant que X se lance ..... Ben heu   :Crying or Very sad: 

2.- Lorsque X se lance il démarre bien sous une session Fvwm avec le user gulivert, mais le problème, c'est que la session fvwm est la session par default, en clair, sa ne charge pas mon theme fvwm qui se trouve dans /home/gulivert/.fvwm et ça charge le theme tout pourri de Fvwm

Une idée???

Peut être bien que le premier pb et lié au deuxième......

Merci d'avance

----------

## gulivert

ben personne   :Question:   :Question:   :Crying or Very sad: 

----------

## Darkael

 *gulivert wrote:*   

> Hello
> 
> Ben je viens de tester tes scripts et j'ai deux soucis avec.
> 
> 1.- Lorsque l'ordi se lance, j'ai bien le service xuser qui se lance juste avant le service local, puis sa arrive au prompt.
> ...

 

Est-ce que tu as bien rendu exécutable le scriptUS.sh ? Sinon je sais pas... Par contre je crois que j'avais proposé une alternative à cette méthode, plus laide mais qui prenait beaucoup moins de lignes. Elle pourra peut-être marcher pour toi, si t'as le courage de chercher dans le forum...

[EDIT]

Bon, finalement, c'était pas très dur à trouver:

https://forums.gentoo.org/viewtopic.php?p=1530570#1530570

----------

## gulivert

Oui oui j'ai bien rendu les scripts executables... Le sript se lance bien mais du genre 2 minutes apres le boot, et c'est pas ma session fvwm qui se lance mais celle par default, tous ça bien sous le login gulivert pourtant   :Rolling Eyes: 

Je vais essayer ton script, merci

----------

