O que acontece embaixo das capas para entrar e iniciar o Unity ou outra Interface Gráfica com o Usuário?

54

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

    
por John S Gruber 13.06.2012 / 20:33

1 resposta

84

Como uma sessão de GUI de 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 upstart

O kernel inicia o processo de inicialização como processo número 1. Isso é novidade para o Ubuntu 12.04.

As tarefas de inicialização 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 por jobs iniciados.

Origem: /etc/init/lightdm.conf

O job upstart executa /usr/sbin/lightdm . Provavelmente, podemos esperar que isso seja convertido em uma unidade de serviço systemd ao longo do tempo.

Lightdm

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

Logs:

/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: homem lightdm e /var/log/lightdm/lightdm.log

O lightdm get começou bem tarde no processo init; Por exemplo, o sistema dbus deve ser iniciado, o sistema de arquivos deve estar pronto e o sistema de exibição de gráficos deve estar pronto.

lightdm cria um arquivo xauthority e então inicia o X, iniciando-o no VT 7, o terminal virtual que você obtém se pressionar Alt + Ctrl + F7 . Quando X é iniciado, os sinais lightdm para o programa da tela inicial de Plymouth são encerrados. É essencial que isso aconteça depois que todos os ttys (1-6) tiverem começado.

Desde julho de 2013, os itens de suporte do Mir foram adicionados ao lightdm, mas esses não são usados por padrão nos 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 de /usr/lib/xorg/modules/ . Note que existem drivers de kernel e drivers xorg para muitos dispositivos, com os drivers xorg quase certamente usando os drivers do kernel. O dri e o glx são características importantes, em particular, para gráficos avançados de alto desempenho. Os logs são armazenados para X em /var/log/Xorg.0.log .

Existem comunicações através do sistema dbus sobre este "assento" e possíveis nomes de usuário são adquiridos. lightdm usa X para desenhar a tela. unidade-greeter é usado para ajudar no processo.

Quando você seleciona os vários IDs possíveis, essa imagem de fundo do usuário é usada.

lightdm obtém os nomes dos possíveis gerenciadores de janelas / sistemas de /usr/share/xsessions/*.desktop .

A informação da conta é adquirida através do daemon accountservice accounts sobre o dbus.

lightdm e o greeter usam o PAM para autenticar o usuário. Uma vez autenticado, o PAM iniciará um daemon do gnome-keyring-daemon com o - opção de login e alimentá-lo com a senha do usuário para que ele possa desbloquear o chaveiro de login do usuário, se presente. Consulte o link e o man 8 pam_unix para mais informações. O PAM armazena informações de registro em /var/log/auth.log e é controlado por /etc/pam.conf (quase vazio) e /etc/pam.d/* . Em particular, consulte /etc/pam.d/lightdm e /etc/pam.d/lightdm-autologin .

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

[Desktop]
Session=ubuntu

ou

[Desktop]
Session=awesome

Os arquivos .desktop de /usr/share/xsessions/*.desktop agora determinam o restante da seqüência de inicialização.

Por exemplo, aqui está o da 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 script de shell /usr/sbin/lightdm-session é executado com os argumentos g nome-session --session=ubuntu (sic .-- 'ubuntu', não 'unidade')

sessão lightdm

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

/usr/sbin/lightdm-session , em seguida, segue estes passos:

Execuções:

  • /etc/profile, $HOME/.profile
  • %código%;
  • carrega recursos de /etc/xprofile $HOME/.xprofile e /etc/X11/Xresources , se eles existirem, carrega o mapa do teclado com o setxbmap usando o conteúdo de $HOME/.Xresources e /etc/X11/Xkbmap ;
  • se não estiver usando o XKB, o xmodmap será usado em relação a qualquer $HOME/.Xkbmap e /etc/X11/Xmodmap
  • executa scripts em $HOME/.Xmodmap ;
  • executa os scripts Xsession em /etc/X11/xinit/xinitrc.d , usando as opções em /etc/X11/Xsession.d/* .

    Um desses inicia o agente ssh (redundante), outro executa /etc/X11/Xsession.options . Outro inicia sessão-dbus (tanto ssh-agent quanto session-dbus, conforme permitido no arquivo $HOME/.xsessionrc acima). Esta sessão dbus é útil para comunicações entre processos relativos a esta sessão de usuário único.

O ssh-agent pode conter chaves ssh para a sessão se elas forem adicionadas por ssh durante algum tempo da sessão, mas o gnome-keyring-daemon faz a mesma coisa.

Xsession.options runs /etc/X11/Xsession.d/50_check_unity_support e se falhar as exportações /usr/lib/nux/unity_support_test para o ambiente, de forma que LIBGL_ALWAYS_SOFTWARE=1 seja usado para renderizar o software na área de trabalho.

Começando com o Ubunu 13.10: llvmpipe define a variável /etc/X11/Xsession.d/00upstart para UPSTART . 1 verifica essa variável e, se definido, substitui /etc/X11/Xsession.d/99upstart para os outros itens definidos como init --user . Assim, o upstart do modo de usuário inicia essas tarefas de inicialização em $STARTUP . Uma delas é /usr/share/upstart/sessions , que inicia a sessão do gnome.

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

Parece que a sessão lightdm assume o papel tradicional de xsession. Sua página man está no link . lightdm considera que seja um wrapper de sessão.

gerenciador de sessão gnome-session (Unity e Gnome Shells)

Manpage: link
Registros:?

Fonte: man page

gnome-session é usado para Unity, mas não para 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 os aplicativos de ~ / .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 daemon-gnome-keyring com a opção --start, completando 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 janela com o dbus-launch.

Gerentes de janela

Gerenciador impressionante de janelas

Página man: link
Registros:?

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

Aqui está o arquivo awesome.desktop em / usr / share / xsessions / usado por 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 gerenciador de janelas impressionantes seja executado. Ele lê seus próprios arquivos de configuração, incluindo /etc/xdg/awesome/rc.lua do pacote incrível. 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

Isto inicia a sessão 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 em 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 ele 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 o 12.10 e posterior, hardware não suportado usa o software llvmpipe para processar o que o hardware não pode. Seu arquivo de configuração é mais simples que o acima. Veja acima como está ativado.

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

compiz

Página man: link
Registros:?
Fonte: link , exame do sistema de arquivos

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

Desde 12.10 estes 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 gnome-session.conf .

Unityshell é um desses plugins. Ele usa o projeto nux como um kit de ferramentas embutido. Imagens são desenhadas em texturas no espaço tridimensional com valores de transparência especificados. Eles são processados pelo compiz e enviados para o llvm ou para os drivers gráficos avançados para que os mecanismos gráficos do hardware gráfico do computador compor e renderizá-los. Geralmente, isso é o oposto de renderizar imagens diretamente para um framebuffer como foi feito de forma 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.

    
por John S Gruber 13.06.2012 / 20:33