Cosa succede sotto le copertine per accedere e avviare Unity o un'altra interfaccia utente grafica?

54

Quando ci sono problemi, potrebbe essere utile capire cosa succede sotto le copertine per firmare un utente in una sessione della GUI e ottenere un Unity (o un altro gestore di finestre) per far apparire un desktop.

    
posta John S Gruber 13.06.2012 - 20:33

1 risposta

84

Come viene avviata una sessione della GUI utente desktop con Ubuntu 12.04-14.04

Ecco la catena di eventi:

Il kernel di Ubuntu Linux e upstart

Il kernel avvia il processo di init come processo numero 1. Questo è upstart per Ubuntu 12.04.

I lavori di Upstart sono in /etc/init/

Pagina man: man init

Log: log del kernel ( dmesg ; copiato in /var/log/syslog ), /var/log/upstart/jobname.log , altri registri determinati dai lavori avviati.

Fonte: /etc/init/lightdm.conf

Il lavoro di upstart esegue /usr/sbin/lightdm . Probabilmente possiamo aspettarci che questo venga convertito in un'unità di servizio systemd nel tempo.

lightdm

Pagina man: man lightdm , Inoltre: Wiki di Ubuntu: LightDM

Registri:

/var/log/syslog
/var/log/lightdm/lightdm.log
/var/log/lightdm/*

## for PAM:
/var/log/auth.log

## for the Xorg X server:
/var/log/Xorg.0.log

Fonte: man lightdm e /var/log/lightdm/lightdm.log

lightdm get è iniziato abbastanza tardi nel processo di init; Ad esempio, il sistema dbus deve essere già avviato, il filesystem deve essere pronto e il sistema di visualizzazione grafica deve essere pronto.

lightdm crea un file xauthority e quindi avvia X, avviandolo su VT 7, il terminale virtuale che si ottiene premendo Alt + Ctrl + F7 . Quando X viene avviato, i segnali lightdm per il programma splash screen di Plymouth vengono chiusi. È essenziale che ciò avvenga dopo che tutti i tty (1-6) sono iniziati.

Dal luglio 2013 gli elementi di supporto di Mir sono stati aggiunti a lightdm, ma quelli non sono utilizzati di default per i sistemi desktop dal 14.04.

X tenta di utilizzare i driver più avanzati possibili. I suoi driver sono caricati da /usr/lib/xorg/modules/ . Si noti che esistono sia i driver del kernel che i driver xorg per molti dispositivi, con i driver xorg che usano quasi certamente quelli del kernel. dri e glx sono caratteristiche importanti, in particolare, per la grafica avanzata ad alte prestazioni. I log sono memorizzati per X in /var/log/Xorg.0.log .

Su questo "sedile" ci sono comunicazioni sul sistema dbus e vengono acquisiti eventuali nomi utente. lightdm usa X per disegnare lo schermo. unity-greeter è usato per aiutare nel processo.

Mentre selezioni i vari possibili ID utente, viene utilizzata l'immagine del backgound dell'utente.

lightdm prende il nome di potenziali window-manager / sistemi da /usr/share/xsessions/*.desktop .

Le informazioni sull'account vengono acquisite tramite il demone degli account accountsservice su dbus.

lightdm e il greeter usano PAM per autenticare l'utente. Una volta autenticato, PAM avvierà un demone gnome-keyring-daemon con il - l'opzione login e la si nutre della password dell'utente in modo che possa sbloccare il portachiavi di accesso dell'utente, se presente. Vedi link e man 8 pam_unix per maggiori informazioni. PAM memorizza le informazioni del registro in /var/log/auth.log ed è controllato da /etc/pam.conf (quasi vuoto) e /etc/pam.d/* . In particolare, vedi /etc/pam.d/lightdm e /etc/pam.d/lightdm-autologin .

Una volta che l'utente è autenticato, i privilegi vengono eliminati e un file viene scritto in ~user/.dmrc che descrive la sessione. Ad esempio:

[Desktop]
Session=ubuntu

o

[Desktop]
Session=awesome

I file .desktop di /usr/share/xsessions/*.desktop ora determinano il resto della sequenza di avvio.

Ad esempio, ecco quello per Unity:

[Desktop Entry]
Name=Ubuntu
Comment=This session logs you into Ubuntu
Exec=gnome-session --session=ubuntu
TryExec=unity
Icon=
Type=Application
X-Ubuntu-Gettext-Domain=gnome-session-3.0

Lo script di shell /usr/sbin/lightdm-session viene eseguito con gli argomenti g nome-session --session=ubuntu (sic .-- 'ubuntu', non 'unity')

lightdm-session

Log:?
Registri errori: ~/.xsession-errors
Registri di processo avviati: ~/.cache/upstart/*
Fonte: /usr/sbin/lightdm-session

/usr/sbin/lightdm-session quindi procede come segue:

Esegui:

  • /etc/profile, $HOME/.profile
  • %codice%;
  • carica le risorse da /etc/xprofile $HOME/.xprofile e /etc/X11/Xresources , se esistono, carica la mappa tastiera con setxbmap usando il contenuto di $HOME/.Xresources e /etc/X11/Xkbmap ;
  • se non si utilizza XKB usa xmodmap contro qualsiasi $HOME/.Xkbmap esistente e /etc/X11/Xmodmap
  • esegue script in $HOME/.Xmodmap ;
  • esegue gli script Xsession in /etc/X11/xinit/xinitrc.d , utilizzando le opzioni in /etc/X11/Xsession.d/* .

    Uno di questi avvia ssh-agent (ridondante), un altro esegue /etc/X11/Xsession.options . Un altro avvia sessione-dbus (sia ssh-agent che session-dbus come consentito nel file $HOME/.xsessionrc sopra). Questa sessione dbus è utile per le comunicazioni tra i processi relativi a questa sessione utente singola.

ssh-agent può tenere le chiavi ssh per la sessione se sono ssh-add 'aggiunte un po' di tempo durante la sessione, ma gnome-keyring-daemon fa la stessa cosa.

Xsession.options esegue /etc/X11/Xsession.d/50_check_unity_support e se non riesce esporta /usr/lib/nux/unity_support_test nell'ambiente in modo che LIBGL_ALWAYS_SOFTWARE=1 venga utilizzato per il rendering software del desktop.

A partire da Ubunu 13.10: llvmpipe imposta la variabile /etc/X11/Xsession.d/00upstart su UPSTART . 1 controlla quella variabile e se imposta sostituti /etc/X11/Xsession.d/99upstart agli altri elementi impostati su init --user . Pertanto, l'upstart in modalità utente avvia quei lavori avviati in $STARTUP . Uno di questi è /usr/share/upstart/sessions che avvia gnome-session.

A meno che non sia già stato fatto, finalmente lightdm-session avvia un gestore di finestre, o per unità, quanto sopra avvia il gestore di sessione di gnome session.

Sembra che la sessione lightdm assuma il tradizionale ruolo di xsession. La sua pagina man è al link . lightdm lo considera un session-wrapper.

gestore della sessione gnome-session (Unity e Gnome Shells)

Manpage: link
Registri:?

Sorgente: pagina man

gnome-session è usato per Unity, ma non per awesome di default, per esempio. Vedi i precedenti file .desktop.

gnome-session avvia il programma specificato da / usr / share / gnome-session / sessions / e avvia le applicazioni da ~ / .config / autostart / e / etc / xdg / autostart.

Ecco un esempio di / etc / xdg / avvio automatico:

$cat /etc/xdg/autostart/nm-applet.desktop
[Desktop Entry]
Name=Network
Comment=Manage your network connections
Icon=nm-device-wireless
Exec=nm-applet
Terminal=false
Type=Application
NoDisplay=true
NotShowIn=KDE;
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Component=general
X-GNOME-Autostart-enabled=true
X-Ubuntu-Gettext-Domain=nm-applet

Un altro, /etc/xdg/autostart/gnome-keyring-ssh.desktop, avvia gnome-keyring-daemon con l'opzione --start, completando l'avvio di quel processo demone e memorizzando informazioni importanti su di esso nell'ambiente per potenziale utilizzo di ssh.

Da una ps aux list sembra che gnome-session avvii i window manager con dbus-launch.

Gestori di finestre

Gestore di finestre straordinario

Pagina man: link
Registri:?

Fonte: pagina man, esame file di configurazione

Ecco il file awesome.desktop in / usr / share / xsessions / utilizzato da lightdm-session:

[Desktop Entry] 
Encoding=UTF-8
Name=awesome
Comment=Highly configurable framework window manager
TryExec=awesome
Exec=awesome

Come puoi vedere, la voce fa semplicemente funzionare l'impressionante window manager. Legge i propri file di configurazione, incluso /etc/xdg/awesome/rc.lua dal fantastico pacchetto. Può essere configurato con $ HOME / .config / awesome / rc.lua.

Unità

Fonte: esame del file di configurazione

Ecco il file ubuntu.desktop in / usr / share / xsessions /:

[Desktop Entry]
Name=Ubuntu
Comment=This session logs you into Ubuntu
Exec=gnome-session --session=ubuntu
TryExec=unity
Icon=
Type=Application
X-Ubuntu-Gettext-Domain=gnome-session-3.0

Questo avvia la sessione di gnome descritta in /usr/share/gnome-session/sessions/ubuntu.session

Questo è il file:

[GNOME Session]
Name=Ubuntu
RequiredComponents=gnome-settings-daemon;
RequiredProviders=windowmanager;panel;
DefaultProvider-windowmanager=compiz
DefaultProvider-panel=compiz
IsRunnableHelper=/usr/lib/nux/unity_support_test
FallbackSession=ubuntu-2d
DesktopName=Unity

Il programma IsRunnableHelper eseguito da gnome-session in 12.04 determina se è possibile eseguire l'unità o se verrà eseguito ubuntu-2d. Se commette un errore e dice che l'unità può funzionare e non può, ci sono problemi. Scegli ubuntu-2d manualmente in lightdm se ti capita. Mentre restituisce un codice di ritorno, possiamo vedere cosa sta facendo eseguendolo con l'opzione -p.

$ /usr/lib/nux/unity_support_test -p
OpenGL vendor string:   X.Org R300 Project
OpenGL renderer string: Gallium 0.4 on ATI RS690
OpenGL version string:  2.1 Mesa 8.0.2

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       yes

Per 12.10 e versioni successive l'hardware non supportato utilizza il software llvmpipe per rendere ciò che l'hardware non può. Il suo file di configurazione è più semplice di quanto sopra. Vedi sopra per come è abilitato.

Possiamo vedere dai file sopra che gnome-session deve avviare il demone delle impostazioni e avviare compiz per l'esecuzione di un gestore di finestre e di eventuali pannelli.

compiz

Pagina man: link
Registri:?
Fonte: link , esame del file system

Una volta avviato il compiz, vengono eseguiti vari plugin. Prima delle 12.10 vengono utilizzate le impostazioni di gnome per definirle. Possono essere modificati con ccsm (compiz config settings manager) o con gconf-editor. Le impostazioni del plugin sono memorizzate in app / compiz-1 / general / screen0 / options in active_plugins. I duplicati mi hanno indotto ad avere segfaults con compiz. Questi sono memorizzati nella directory home dell'utente nella directory ~ / .gconf / organizzata come sopra. I valori effettivi sono memorizzati in% file gconf.xml lì.

Dal 12.10 questi plugin sono memorizzati in binario nel tuo file ~ / .config / dconf / user. Il metodo dconf o gsettings di memorizzazione delle impostazioni è più recente. Puoi visualizzare tutte queste impostazioni con gnome-session.conf .

Unityshell è uno di questi plugin. Usa il progetto nux come toolkit incorporato. Le immagini vengono tratte su trame nello spazio tridimensionale con valori di trasparenza specificati. Questi vengono elaborati da Compiz e inviati a llvm oa driver di grafica avanzati per avere i componenti grafici dell'hardware grafico del computer in composito e renderli. In genere, questo è diverso dal rendering delle immagini direttamente su un framebuffer come è stato fatto più tradizionalmente. Questa complicata catena di eventi è ciò che richiede driver più avanzati e, a volte, richiede l'uso di driver grafici proprietari in Ubuntu.

    
risposta data John S Gruber 13.06.2012 - 20:33

Leggi altre domande sui tag