O que acontece nos bastidores para me conectar e iniciar o Unity ou outra interface gráfica do usuário?

55

Quando houver problemas, pode ser bom entender o que acontece nos bastidores para conectar um usuário a uma sessão da GUI e obter um Unity (ou outro gerenciador de janelas) para abrir uma área de trabalho.

John S Gruber
fonte

Respostas:

86

Como uma sessão da GUI do usuário de desktop é iniciada com o Ubuntu 12.04-14.04

Aqui está a cadeia de eventos:

O kernel do Ubuntu Linux e o iniciante

O kernel inicia o processo init como o número do processo 1. Isso é recente para o Ubuntu 12.04.

Trabalhos iniciados estão em /etc/init/


Página de manual: man init

Logs: log do kernel ( dmesg; copiado para /var/log/syslog) /var/log/upstart/jobname.log, outros logs determinados pelos trabalhos iniciados.

Fonte: /etc/init/lightdm.conf


O trabalho inicial é executado /usr/sbin/lightdm. Provavelmente, podemos esperar que isso seja convertido em uma systemdunidade de serviço ao longo do tempo.

Lightdm


Página de manual:,man lightdm Também: Ubuntu Wiki: LightDM

Registros:

/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


o lightdm get começou bastante tarde no processo de inicialização; Por exemplo, o sistema dbus já deve estar iniciado, o sistema de arquivos deve estar pronto e o sistema de exibição gráfica deve estar pronto.

O lightdm cria um arquivo xauthority e inicia o X, iniciando-o no VT 7, o terminal virtual que você obtém se pressionar Alt+ Ctrl+ F7. Quando o X é iniciado, o lightdm sinaliza para que o programa da tela inicial de Plymouth seja encerrado. É essencial que isso aconteça após o início de todos os tty (1-6).

Desde julho de 2013, os itens de suporte Mir foram adicionados ao lightdm, mas esses não são usados ​​por padrão para sistemas de desktop a partir de 14.04.

X tenta usar os drivers mais avançados possíveis. Seus próprios drivers são carregados /usr/lib/xorg/modules/. Observe que existem drivers de kernel e drivers do xorg para muitos dispositivos, com os drivers do xorg quase certamente usando os do kernel. dri e glx são recursos importantes, em particular, para gráficos avançados de alto desempenho. Os logs são armazenados para o X in /var/log/Xorg.0.log.

Há comunicação pelo dbus do sistema sobre esse "assento" e possíveis nomes de usuário são adquiridos. O lightdm usa X para desenhar a tela. O unity-greeter é usado para ajudar no processo.

Conforme você seleciona os vários possíveis IDs de usuário, a imagem de fundo desse ID de usuário é usada.

lightdm get é o nome de possíveis gerenciadores de janelas / sistemas /usr/share/xsessions/*.desktop.

As informações da conta são adquiridas por meio do serviço de contas accounts daemon através do dbus.

lightdm e greeter usam o PAM para autenticar o usuário. Uma vez autenticado, o PAM iniciará um daemon gnome-keyring-daemon com a opção --login e alimentará a senha do usuário para que ele possa desbloquear o chaveiro de login do usuário, se presente. Veja https://live.gnome.org/GnomeKeyring/Pam e man 8 pam_unix para obter mais informações. O PAM armazena informações de logon /var/log/auth.loge é controlado por /etc/pam.conf(quase vazio) e /etc/pam.d/*. Em particular, veja /etc/pam.d/lightdme /etc/pam.d/lightdm-autologin.

Depois que o usuário é autenticado, os privilégios são eliminados e um arquivo é gravado para ~user/.dmrcdescrever a sessão. Por exemplo:

[Desktop]
Session=ubuntu

ou

[Desktop]
Session=awesome

Os .desktoparquivos a partir de /usr/share/xsessions/*.desktopagora determinam o restante da sequência de inicialização.

Por exemplo, aqui está o 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

O /usr/sbin/lightdm-sessionscript shell é executado com os argumentos g nome-session --session=ubuntu (sic .-- 'ubuntu', não 'unity')

lightdm-session


Logs:?
Logs de erro: Logs de ~/.xsession-errors
processo iniciados: ~/.cache/upstart/*
Origem:/usr/sbin/lightdm-session


/usr/sbin/lightdm-session então segue estas etapas:

Corre:

  • /etc/profile, $HOME/.profile
  • /etc/xprofile $HOME/.xprofile;
  • carrega recursos de /etc/X11/Xresourcese $HOME/.Xresources, se existirem, carrega o mapa do teclado com setxbmap usando o conteúdo de /etc/X11/Xkbmape $HOME/.Xkbmap;
  • se não estiver usando usos XKB xmodmap contra qualquer existente /etc/X11/Xmodmape$HOME/.Xmodmap
  • executa scripts em /etc/X11/xinit/xinitrc.d;
  • executa os scripts Xsession em /etc/X11/Xsession.d/*, usando as opções /etc/X11/Xsession.options.

    Um deles inicia o ssh-agent (redundante), outro é executado $HOME/.xsessionrc. Outro inicia o session-dbus (ssh-agent e session-dbus conforme permitido no Xsession.optionsarquivo acima ). Esta sessão dbus é útil para comunicações entre processos relacionados a esta sessão de usuário único.

O ssh-agent pode manter as teclas ssh para a sessão se elas forem adicionadas ssh algum tempo durante a sessão, mas o gnome-keyring-daemon faz a mesma coisa.

/etc/X11/Xsession.d/50_check_unity_supporté executado /usr/lib/nux/unity_support_teste, se falhar, exporta LIBGL_ALWAYS_SOFTWARE=1para o ambiente, para que llvmpipeseja usado para renderizar o software na área de trabalho.

Começando com o Ubunu 13.10: /etc/X11/Xsession.d/00upstartdefine a variável UPSTARTpara 1. /etc/X11/Xsession.d/99upstartverifica essa variável e se set substitui init --user os outros itens definidos como $STARTUP. Assim, o iniciante no modo de usuário inicia esses trabalhos iniciados /usr/share/upstart/sessions. Um deles é o gnome-session.confque inicia o gnome-session.

A menos que já tenha sido feito, finalmente o lightdm-session inicia um gerenciador de janelas ou, para a unidade, o item acima inicia o gerenciador de sessões do gnome-session.

Parece que o lightdm-session assume o papel tradicional de xsession. Sua página de manual está em http://manpages.ubuntu.com/manpages/precise/man5/Xsession.5.html . O lightdm considera um wrapper de sessão.

gerenciador de sessões gnome-session (Unity e Gnome Shells)


Página de manual: http://manpages.ubuntu.com/manpages/precise/en/man1/gnome-session.1.html
Logs:?

Fonte: página de manual


O gnome-session é usado para o Unity, mas não por incrível, por padrão, por exemplo. Veja os arquivos .desktop acima.

O gnome-session inicia o programa especificado em / usr / share / gnome-session / sessions / e inicia aplicativos em ~ / .config / autostart / e / etc / xdg / autostart.

Aqui está um exemplo de / etc / xdg / autostart:

$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

Outro, /etc/xdg/autostart/gnome-keyring-ssh.desktop, inicia o gnome-keyring-daemon com a opção --start, concluindo o início desse processo daemon e armazenando informações importantes sobre ele no ambiente para uso potencial por ssh.

A partir de uma lista ps aux, parece que o gnome-session inicia os gerenciadores de janelas com o dbus-launch.

Gerenciadores de janelas

Awesome Window Manager


Página do manual : http://manpages.ubuntu.com/manpages/precise/en/man1/awesome.1.html
Logs:?

Fonte: página de manual, exame do arquivo de configuração


Aqui está o arquivo awesome.desktop em / usr / share / xsessions / usado pelo lightdm-session:

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

Como você pode ver, a entrada simplesmente faz com que o incrível gerenciador de janelas seja executado. Ele lê seus próprios arquivos de configuração, incluindo /etc/xdg/awesome/rc.lua do pacote awesome. Pode ser configurado com $ HOME / .config / awesome / rc.lua.

Unidade


Fonte: exame do arquivo de configuração


Aqui está o arquivo ubuntu.desktop em / 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

Isso inicia a sessão do gnome descrita em /usr/share/gnome-session/sessions/ubuntu.session

Aqui está esse arquivo:

[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

O programa IsRunnableHelper executado pelo gnome-session no 12.04 determina se a unidade pode ser executada ou se o ubuntu-2d será executado. Se cometer um erro e disser que a unidade pode funcionar e não pode, há problemas. Escolha o ubuntu-2d manualmente no lightdm, se isso acontecer com você. Enquanto ele retorna um código de retorno, podemos ver o que está fazendo executando-o com a opção -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

Para a versão 12.10 e posterior, o hardware não suportado usa o software llvmpipe para renderizar o que o hardware não pode. Seu arquivo de configuração é mais simples que o acima. Veja acima como está habilitado.

Podemos ver nos arquivos acima que o gnome-session deve iniciar o daemon de configurações e iniciar o compiz com a finalidade de executar um gerenciador de janelas e quaisquer painéis.

compiz


Página do manual : http://manpages.ubuntu.com/manpages/precise/en/man1/compiz.1.html
Logs:?
Fonte: http://en.wikipedia.org/wiki/Compiz , exame do sistema de arquivos


Uma vez iniciado, o compiz executa vários plugins. Antes das 12.10, o gnome-settings é usado para defini-las. Eles podem ser alterados com o ccsm (gerenciador de configurações do compiz) ou com o gconf-editor. As configurações do plug-in são armazenadas em apps / compiz-1 / general / screen0 / options em active_plugins. Duplicatas me fizeram ter segfaults com compiz. Eles são armazenados no diretório inicial do usuário, no diretório ~ / .gconf /, organizado como acima. Os valores reais são armazenados nos arquivos% gconf.xml lá.

Desde a 12.10, esses plugins são armazenados em binário no seu arquivo ~ / .config / dconf / user. O método dconf ou gsettings de armazenar configurações é mais recente. Você pode ver todas essas configurações com dconf dump /org/gnome/.

O Unityshell é um desses plugins. Ele usa o projeto nux como um kit de ferramentas incorporado. As imagens são desenhadas em texturas no espaço tridimensional com valores de transparência especificados. Eles são processados ​​pelo compiz e enviados ao llvm ou aos drivers gráficos avançados para que os mecanismos gráficos sejam compostos no hardware gráfico do computador do sistema e renderizá-los. Geralmente, isso é o contrário de renderizar imagens diretamente em um buffer de moldura, como era feito de maneira mais tradicional. Essa complicada cadeia de eventos é o que requer drivers mais avançados e, às vezes, solicita o uso de drivers gráficos proprietários no Ubuntu.

John S Gruber
fonte
Como posso saber se meu sistema está executando o Awesome, Unity ou compiz?
James
@james Você provavelmente pode procurar por compiz ou incríveis na lista de processos. Você obtém isso com um comando como ps aux. Você também pode verificar o arquivo ~ / .dmrc para o parâmetro Session cat ~/.dmrc. Veja acima. A Sessão = ubuntu significa que você está usando o Compiz e unidade juntos (e esse é o padrão.
John S Gruber
Resposta excepcional, permitindo uma boa compreensão do processo sem conhecimento prévio! Seguindo sua descrição, tentei replicar o xsessions/ubuntu.desktoparquivo em outro arquivo e esperava terminar com o mesmo comportamento, mas sem sucesso (mais detalhes nesta pergunta ). Existe algo de especial na ubuntu.desktopxsession padrão ?
Ad N
Na verdade, seria +10 se eu pudesse. Melhor do que o doc ...
Anel Ø
Obrigado por escrever isso. Você pode atualizar como as coisas mudaram para as versões mais recentes do Ubuntu?
exic