Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/06/2009, à 16:31

Varamil

Séquence de démarrage

Bonjour à tous,

J'utilise de plus en plus linux maintenant, et je m'intéresse à tout ce qui se lance au démarrage de ma machine, afin de faire un peu le ménage.

Après plusieurs recherches sur le net, je suis un peu perdu sur le déroulement d'un démarrage ubuntu. Ma première question est donc, que ce passe-t-il lorsqu'ubuntu se lance ? Quels scripts sont exécutés ? Dans quel ordre ?

D'après mes recherches, pour limiter le nombre de processus lancés au démarrage il faut désactiver les services inutiles. Pour se faire j'ai utiliser BootUp-Manager et le gestionnaire de servies de base d'ubuntu. Cependant je ne retrouve pas tout les processus obtenus par un ps -fe. Comment ont été lancés ces autres processus ?

Ceci me conduis plus précisément à savoir quels sont les fichiers à modifier pour limiter les processus au démarrage.
A ce que j'ai compris pour les services ça se passe dans les dossiers /etc/rc?.d et /etc/ini.d (que modifie bum), mais il semblerait qu'il y ait aussi des choses dans les fichiers de configuration du window-manager (gnome ou openbox pour moi) mais je ne sais pas exactement quels fichiers.

Voilà si quelqu'un pouvait m'aider à y voir plus claire, merci.

Hors ligne

#2 Le 23/06/2009, à 19:58

bertrand0

Re : Séquence de démarrage

Après l'initialisation de la machine, le bios cherche un secteur de boot valide sur ses disques de démarrage, une fois trouvé, il le charge et passe la main au programme qui s'y trouve, à savoir le boot manager.

Le boot manager fait ce qu'il doit, pour s'initialiser complètement et localiser les ressources dont il a besoin... Ça varie selon les boot manager, alors passons à la suite qui est générique.
Le boot manager, typiquement grub, commence par charger en mémoire le contenu de l'archive initrd, puis le contenu de l'image noyau vmlinuz, et enfin passe la main au point d'entrée de cette image.
Le kernel s'initialise, et crée le process kthreadd avec le pid 2, qui sera le process parent de tous les threads du noyau (ceux-ci apparaissent avec ps -fe entre crochets, et ont pour ppid 2). Ces threads sont gérés par le noyau, et sont créées ou tués par le noyau...
Une fois prêt, le noyau lit le contenu de l'archive initrd (une archive cpio, gzippée) et y cherche par défaut le script /init qu'il exécute, avec le numéro PID 1.
Le script init exécute entre autres choses, les scripts qui se trouvent dans le dossier /scripts de l'archive initrd. Dans l'ordre, les sous-dossiers init-top, init-premount, local-top, local-premount, local-bottom, init-bottom. (Quand l'archive initrd est créée, ces dossiers sont peuplés avec le contenu de /etc/initramf-tools/scripts et /usr/share/initramfs-tools/scripts)
Fin de la séquence initiale de démarrage. Il est très déconseillé de toucher à ces scripts à moins de savoir précisément ce que vous faites et d'avoir un problème spécifique à régler...

Ensuite le script init passe la main au programme /sbin/init sur le disque root, qui hérite du numéro PID 1. Le init de Ubuntu est particulier, il est compatible avec le démarrage system-V, mais a ses spécificités : il lit les fichiers du dossiers /etc/event.d qui correspondent chacun à un job, et contiennent des fragments de scripts exécutés conditionnellement.
Celui qui nous intéresse est le job rcS, qui provoque l'exécution du script /etc/init.d/rcS. Ce dernier exécute tous les scripts du dossier /etc/rcS.d dans l'ordre de S00 à S99, et source les scripts .sh. Tous ces scripts démarrent les services indispensables au fonctionnement correct du système (réseau, systèmes de fichiers, udev, ...)
Une fois terminé le job rcS, c'est le job rc-default qui prend la main: il détermine le runlevel à adopter en lisant le contenu du fichier /etc/inittab s'il existe, ou 2 par défaut. Le script passe init dans le runlevel X choisi... Supposons pour la suite que c'est 2.
Au passage au runlevel 2, le job rc2 est activé (X compris entre 1 et 5, car 0 et 6 sont réservés pour halt et reboot), ce qui provoque l'exécution du script /etc/init.d/rc avec l'argument 2.
Ce dernier script exécute alors tous les scripts du dossier /etc/rc2.d : d'abord de K00 à K99 avec l'argument stop, puis de S00 à S99 avec l'argument start, et source les scripts .sh. Tous ces scripts démarrent les services optionnels pour le runlevel 2. Une fois terminé, le système est au repos jusqu'au prochain changement de runlevel...

En résumé, les services sont démarrés par les scripts dans /etc/rcS.d et /etc/rc2.d. Il est déconseillé de toucher à ceux de /etc/rcS.d à moins de savoir précisément ce que vous faites. Par ailleurs, il vaut mieux ne pas toucher au contenu de /etc/event.d car c'est très peu documenté et complètement spécifique à ubuntu.

Le reste s'exécute au démarrage du service gdm (ou kdm, xdm ...). Après avoir lancé le serveur X, gdm exécute les scripts Default dans /etc/gdm, dans les sous-dossiers Init, PostLogin, PreSession.
Puis le script /etc/gdm/Xsession est exécuté. Celui-ci source dans l'ordre alphanumérique tous les scripts du dossier /etc/X11/Xsession.d.
Le dernier de ces scripts 99x11-common-start démarre le gestionnaire de session, typiquement gnome-session ou une commande composée qui aboutit à l'exécutionde gnome-session.
C'est la fin de l'initialisation du serveur X. Il vaut mieux ne pas toucher aux scripts de /etc/X11/Xsession.d pour des raisons évidentes...

La partie finale est le démarrage de la session. Je me limite à une session gnome...
gnome-session démarre les trois services indispensables à une session: le gestionnaire de fenêtre (metacity ou gtk-window-decorator plus éventuellement un gestionnaire de composition comme compiz) , le gestionnaire de fichiers (nautilus), et le gestionnaire de panneaux (gnome-panel). A part cela, gnome-session charge les applications référencées par les fichiers .desktop contenus dans les dossiers /usr/share/gnome/autostart et ~/.config/autostart. L'ordre dans lequel ces applications sont démarrées dépend de la "phase" indiquée dans le fichier .desktop. Certains fichiers .desktop peuvent aussi contenir une condition, liée à une entrée du registre gconf2.
Voilà, c'est la fin du démarrage de la session, et le système est au repos.

À divers moments que je n'ai pas précisés dans la séquence précédente, les scripts suivants sont exécutés:
/etc/profile, /etc/xprofile, ~/.profile, ~/.xprofile, ~/.xsessionrc,  ~/.gnomerc

À l'ouverture d'un terminal, il y a bien sûr les habituels /etc/bashrc , ... ou autres en fonction du shell utilisé.


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne

#3 Le 23/06/2009, à 20:53

Varamil

Re : Séquence de démarrage

Merci de cette réponse très détaillée.
Je vais essayer de tout saisir ^^ et je poserais peut être quelques questions pour des précisions.

Hors ligne

#4 Le 31/07/2009, à 10:24

Varamil

Re : Séquence de démarrage

Je remonte un peu le sujet ^^

Je me demandais, au niveau du runlevel, on peu spécifier au niveau du script /etc/init.d/rc sa valeur par défaut. D'après ce que j'ai compris, le 2 est le mode normal, le 3 est en single-user, le 4 est n'est pas utilisé et est laisser à notre bon soin. D'autre part j'ai vu qu'au niveau du grub, parfois il y a une ligne qui permet de démarrer en mode single-user, donc je suppose sur le runlevel 3.

Je voudrais donc savoir comment spécifier dans le grub sur quel runlevel démarrer, afin de faire une config très particulière sur le mode 4, et pouvoir la lancer quand j'en ai besoin sans avoir à démarrer normalement, changer le script rc et redémarrer.

Merci

Hors ligne

#5 Le 31/07/2009, à 15:14

pierrro

Re : Séquence de démarrage

bertrand0 a écrit :

Après l'initialisation de la machine,

[.../...]

... ou autres en fonction du shell utilisé.

Bonjour,

et où placerais-tu la commande "xhost + local:root" pour qu'une tâche programmée dans le crontab de root puisse afficher des notifications avec zenity quelle que soit la session ouverte? En gros, pour qu'une tâche lancées par root en cron ait accès au display de tous les utilisateurs.

Merci.

Dernière modification par pierrro (Le 31/07/2009, à 15:14)


Lu|Xu|Ubuntu depuis la 7.04, Feisty Fawn

Hors ligne

#6 Le 31/07/2009, à 16:52

bertrand0

Re : Séquence de démarrage

@pierro
Si il faut afficher même sur l'écran de login, je le placerai dans /etc/gdm/Init/Default
Mais si tu ne veux afficher que sur un écran avec un utilisateur loggé, il vaut mieux placer la commande dans /etc/gdm/PostSession/Default ou bien /etc/gdm/PreSession/Default

Si tu veux limiter cette action à un display particulier (par exemple :0), il faut créer un script nommé ":0" au lieu de Default, dans le dossier approprié.

@Varamil
Le runlevel par défaut est choisi par le job spécifié dans /etc/event.d/rc-default. On peut y lire ceci:
1) il cherche le mot-clé "single" ou bien "-s" ou bien "S" sur la ligne de commande du noyau (spécifiée dans grub) et s'il le trouve, démarre en mode mono-utilisateur (runlevel S)
2) il lit le fichier /etc/inittab, et s'il le trouve, cherche la ligne "id:?:initdefault" et s'il la trouve, démarre dans le runlevel ?
3) sinon il démarre dans le runlevel 2

Donc, si tu veux pouvoir démarrer dans un autre runlevel à la demande de la ligne de commande du noyau, il te faut modifier le fichier /etc/event.d/rc-default
Par exemple, tu peux rajouter la ligne:

...
if grep -q -w -- "-s\|single\|S" /proc/cmdline; then
   telinit S
elif grep -q -w -- "modeperso" /proc/cmdline; then
   telinit 4        
elif [ -r /etc/inittab ]; then
...

ATTENTION: Aie un DVD de démarrage sous la main pour pouvoir démarrer si tu fais une fausse manipulation, car la moindre erreur de syntaxe rendra le système non bootable. Et pense à sauvegarder le fichier avant de le modifier.


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne

#7 Le 31/07/2009, à 17:14

pierrro

Re : Séquence de démarrage

bertrand0 a écrit :

@pierro
Si il faut afficher même sur l'écran de login, je le placerai dans /etc/gdm/Init/Default
Mais si tu ne veux afficher que sur un écran avec un utilisateur loggé, il vaut mieux placer la commande dans /etc/gdm/PostSession/Default ou bien /etc/gdm/PreSession/Default

Si tu veux limiter cette action à un display particulier (par exemple :0), il faut créer un script nommé ":0" au lieu de Default, dans le dossier approprié.

Merci pour cette réponse rapide.
En fait, j'ai besoin d'afficher des notifications dans la zone de notification de Gnome lorsque la sauvegarde se déclenche. Donc je pense créer un script /etc/gdm/PreSession/:0
Je suppose que ce script :0 doit être exécutable par tous les utilisateurs.
Y a-t-il une syntaxe particulière ou bien est-ce que le fichier suivant suffirait?

#!/bin/sh
xhost + local:root

Je testerai chez moi ce soir.


Lu|Xu|Ubuntu depuis la 7.04, Feisty Fawn

Hors ligne

#8 Le 31/07/2009, à 17:43

bertrand0

Re : Séquence de démarrage

Le script doit renvoyer 0 s'il n'y a pas d'erreur (ajoute à la fin du script "exit 0"); tout autre code de sortie annule la séquence de login.
Il faut noter que le script est bloquant: la séquence de login ne se poursuit qu'une fois le script terminé.

Je ne suis pas vraiment familier avec les notifications et autres, mais il me semble qu'en plus de l'accès au serveur X (soit en transmettant le cookie d'authentification xauth, soit en autorisant explicitement l'accès avec xhost),
il doit falloir avoir un accès à la session Gnome pour pouvoir utiliser la zone de notification: il faut créer la variable d'environnement SESSION_MANAGER pour indiquer le socket du gestionnaire de session,
et utiliser iceauth pour transmettre le cookie d'authentification ou bien utiliser directement la variable d'environnement ICEAUTHORITY pour pointer vers le bon fichier .ICEauthority

Je sais que les outils système comme update-manager utilisent plutôt dbus pour transmettre les notifications, mais je n'ai aucune idée de la façon dont cela se pratique...


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne

#9 Le 31/07/2009, à 17:56

pierrro

Re : Séquence de démarrage

Mon script de sauvegarde programmé par cron marche déjà, si avant, dans ma session, je tape la commande "xhost + local:root".
Donc zenity (que j'utilise pour la notification) doit déjà avoir un accès à la session Gnome.
Merci pour la remarque.
Je vais tester ce soir.


Lu|Xu|Ubuntu depuis la 7.04, Feisty Fawn

Hors ligne

#10 Le 31/07/2009, à 18:07

bertrand0

Re : Séquence de démarrage

J'oubliais: le script /etc/gdm/PreSession/Default contient déjà du code, donc si tu veux que ce code soit toujours exécuté, il faut soit le recopier, soit l'appeler à partir de ton script :0.
EDIT: J'ai jeté un coup d'oeil rapide, et c'est simplement du code pour changer la couleur du fond de l'écran entre le moment où l'écran de login se ferme et où la session gnome apparaît et prend le relais.

Dernière modification par bertrand0 (Le 31/07/2009, à 18:11)


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne

#11 Le 31/07/2009, à 18:32

pierrro

Re : Séquence de démarrage

Merci de m'avoir aidé.
Finalement, j'ai ajouter la ligne

xhost + local:root

au dessus du "exit 0" dans le fichier /etc/gdm/PreSession/Default et cela fonctionne.
Merci encore.

Dernière modification par pierrro (Le 31/07/2009, à 18:32)


Lu|Xu|Ubuntu depuis la 7.04, Feisty Fawn

Hors ligne

#12 Le 03/08/2009, à 08:42

Varamil

Re : Séquence de démarrage

Après quelques recherches, j'ai trouvé la commande init qui permet de changer de runlevel:

sudo init 4

par exemple. Mais cela seulement une fois la machine lancée et chargée selon le runlevel par défaut. N'y a-t-il pas moyen de le choisir dès le grub ?

Hors ligne

#13 Le 03/08/2009, à 15:57

bertrand0

Re : Séquence de démarrage

non, voir mon post plus haut.
La commande dédiée pour changer de runlevel est "telinit" et pas init.


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne

#14 Le 03/08/2009, à 16:54

Varamil

Re : Séquence de démarrage

Desolé, j'avais pas vu la seconde partie de ton post.

Pour le init, j'avais vu ça dans un bouquin ubuntu mais pour la version 7, ça a du changer depuis ^^

Sinon avec le code que tu as mis, il me suffira pour démarrer sur mon mode perso de remplacer :

/boot/vmlinuz-2.6.28-14-generic root=UUID=87694631-1b83-4d48-858e-ca6eb7547220 ro quiet splash

par

/boot/vmlinuz-2.6.28-14-generic root=UUID=87694631-1b83-4d48-858e-ca6eb7547220 ro quiet splash modeperso

?

Merci

Hors ligne

#15 Le 04/08/2009, à 16:11

bertrand0

Re : Séquence de démarrage

oui, c'est ça.

Concernant init, cela fonctionne, mais c'est une tolérance sur tous les systèmes linux, mais qui pourra ne pas fonctionner sur d'autres systèmes unix.


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne