Что происходит под обложками для входа в систему и запуска Unity или другого графического интерфейса пользователя?

54

Когда есть проблемы, может быть полезно понять, что происходит под обложками, чтобы подписать пользователя в сеанс GUI и получить Unity (или другой диспетчер окон), чтобы открыть рабочий стол.

    
задан John S Gruber 13.06.2012 в 20:33
источник

1 ответ

83

Как запускается сеанс GUI рабочего стола с Ubuntu 12.04-14.04

Вот цепочка событий:

Ядро Ubuntu Linux и выскочка

Ядро запускает процесс инициализации как номер процесса 1. Это выскочка для Ubuntu 12.04.

Задания на старте в /etc/init/

Страница руководства: man init

Журналы: журнал ядра ( dmesg ; скопирован в /var/log/syslog ), /var/log/upstart/jobname.log , другие журналы определены начальными заданиями.

Источник: /etc/init/lightdm.conf

Выполнение выскочки выполняется /usr/sbin/lightdm . Вероятно, мы можем ожидать, что с течением времени это будет преобразовано в сервисную единицу systemd .

LightDM

Страница руководства: man lightdm , Также: Ubuntu Wiki: 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

Источник: человек lightdm и /var/log/lightdm/lightdm.log

lightdm get запущен довольно поздно в процессе init; Например, система dbus должна быть уже запущена, файловая система должна быть готова, а система отображения графики должна быть готова.

lightdm создает файл xauthority, а затем запускает X, запуская его на VT 7, виртуальный терминал, который вы получаете, если вы нажмете Alt + Ctrl + F7 . Когда X запускается сигналы lightdm для программы заставки Plymouth, чтобы выйти. Очень важно, чтобы это произошло после того, как все tty (1-6) начали.

С июля 2013 года элементы поддержки Mir добавлены в lightdm, но по умолчанию для настольных систем они не используются по состоянию на 14.04.

X пытается использовать самые продвинутые драйверы. Его собственные драйверы загружаются из /usr/lib/xorg/modules/ . Обратите внимание, что существуют как драйверы ядра, так и драйверы xorg для многих устройств, причем драйверы xorg почти наверняка используют ядро. dri и glx - важные функции, в частности, для высокопроизводительной графики. Журналы хранятся для X в /var/log/Xorg.0.log .

Об этом «сиденье» есть связь по системе dbus, и приобретаются возможные имена пользователей. lightdm использует X для рисования экрана. Единственный-приветлитель используется для оказания помощи в этом процессе.

Когда вы выбираете различные возможные идентификаторы пользователя, используется обратное изображение userid.

lightdm get - имена потенциальных оконных менеджеров / систем из /usr/share/xsessions/*.desktop .

Информация об учетной записи приобретается через учетную запись accountservice-daemon через dbus.

lightdm и greeter использовать PAM для аутентификации пользователя. После аутентификации PAM запустит демон gnome-keyring-daemon с --login и подайте ему пароль пользователя, чтобы он мог разблокировать регистрационный ключ пользователя, если он есть. Дополнительную информацию см. В разделе Ссылка и man 8 pam_unix. PAM хранит информацию журнала в /var/log/auth.log и контролируется /etc/pam.conf (почти пустым) и /etc/pam.d/* . В частности, см.% Co_de% и /etc/pam.d/lightdm .

Как только пользователь будет аутентифицирован, привилегии будут удалены и файл будет записан в /etc/pam.d/lightdm-autologin , описывающий сеанс. Например:

[Desktop]
Session=ubuntu

или

[Desktop]
Session=awesome

Теперь файлы ~user/.dmrc из .desktop определяют остальную последовательность запуска.

Например, вот для 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

Скрипт оболочки /usr/share/xsessions/*.desktop запускается с аргументами g /usr/sbin/lightdm-session (sic .-- 'ubuntu', а не «единство»)

LightDM-сессия

Журналы:?
Журналы ошибок: nome-session --session=ubuntu
Начальные журналы процессов: ~/.xsession-errors
Источник: ~/.cache/upstart/*

/usr/sbin/lightdm-session выполняет следующие действия:

Запускает:

  • /usr/sbin/lightdm-session
  • %код%;
  • загружает ресурсы из /etc/profile, $HOME/.profile и /etc/xprofile $HOME/.xprofile , если они существуют, загружает карту клавиатуры с помощью setxbmap, используя содержимое /etc/X11/Xresources и $HOME/.Xresources ;
  • Если не использовать XKB, используйте xmodmap для любых существующих /etc/X11/Xkbmap и $HOME/.Xkbmap
  • запускает скрипты в /etc/X11/Xmodmap ;
  • запускает сценарии Xsession в $HOME/.Xmodmap , используя опции в /etc/X11/xinit/xinitrc.d .

    Один из них запускает ssh-agent (избыточно), другой выполняет /etc/X11/Xsession.d/* . Другой запускает сеанс-dbus (как ssh-agent, так и session-dbus, как разрешено в вышеупомянутом файле /etc/X11/Xsession.options ). Этот сеанс dbus полезен для связи между процессами в отношении этого сеанса с одним пользователем.

ssh-agent может удерживать ключи ssh для сеанса, если они ssh-add 'ed некоторое время во время сеанса, но gnome-keyring-daemon делает то же самое.

$HOME/.xsessionrc запускает Xsession.options , и если он не выполняет экспорт /etc/X11/Xsession.d/50_check_unity_support в среду, так что /usr/lib/nux/unity_support_test будет использоваться для программного обеспечения, отображающего рабочий стол.

Начиная с Ubunu 13.10: LIBGL_ALWAYS_SOFTWARE=1 устанавливает переменную llvmpipe в /etc/X11/Xsession.d/00upstart . UPSTART проверяет эту переменную и, если она устанавливает, заменяет 1 другим элементам, установленным в /etc/X11/Xsession.d/99upstart . Таким образом, пользовательский режим upstart запускает эти выскочки в init --user . Один из них - $STARTUP , который запускает gnome-session.

Если это уже сделано, то, наконец, lightdm-session запускает диспетчер окон или для единства, выше запускает диспетчер сеанса gnome-session.

Похоже, что lightdm-session принимает традиционную роль xsession. Его справочная страница находится на ссылке . lightdm считает, что это сеансовая оболочка.

диспетчер сеанса gnome-session (оболочки Unity и Gnome)

Manpage: Ссылка
Журналы:?

Источник: справочная страница

gnome-session используется для Unity, но не для awesome по умолчанию, например. См. Приведенные выше файлы .desktop.

gnome-session запускает указанную программу из / usr / share / gnome-session / sessions / и запускает приложения из ~ / .config / autostart / и / etc / xdg / autostart.

Вот один пример из / 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

Другой, /etc/xdg/autostart/gnome-keyring-ssh.desktop, запускает gnome-keyring-daemon с опцией -start, завершает запуск этого процесса и хранит важную информацию об этом в среде для потенциальное использование ssh.

Из списка ps aux видно, что gnome-session запускает оконные менеджеры с dbus-запуском.

Менеджеры окон

Awesome Window Manager

Страница пользователя: Ссылка
Журналы:?

Источник: справочная страница, проверка конфигурационного файла

Вот файл awesome.desktop в / usr / share / xsessions /, используемый lightdm-session:

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

Как вы можете видеть, запись просто заставляет запускать awesome window manager. Он считывает свои собственные файлы конфигурации, включая /etc/xdg/awesome/rc.lua из удивительного пакета. Его можно настроить с помощью $ HOME / .config / awesome / rc.lua.

Unity

Источник: проверка файла конфигурации

Вот файл ubuntu.desktop в каталоге / 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

Это начало сеанса gnome, описанного в /usr/share/gnome-session/sessions/ubuntu.session

Вот этот файл:

[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

Программа IsRunnableHelper, запускаемая gnome-session в 12.04, определяет, может ли быть запущено единство или будет ли запущен ubuntu-2d. Если это делает ошибку и говорит, что единство может бежать, а это невозможно, есть проблемы. Выберите ubuntu-2d вручную в lightdm, если это произойдет с вами. Пока он возвращает код возврата, мы можем видеть, что он делает, запустив его с опцией -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

Для 12.10 и более поздних версий неподдерживаемое оборудование использует программное обеспечение llvmpipe для отображения того, что аппаратное обеспечение не может. Его конфигурационный файл проще, чем указано выше. См. Выше, как он включен.

Из приведенных выше файлов видно, что gnome-session должен запустить демон настроек и начать компиляцию для запуска диспетчера окон и любых панелей.

Compiz

Страница пользователя: Ссылка
Журналы:?
Источник: Ссылка , проверка файловой системы

После запуска компиляции он запускает различные плагины. До 12.10 gnome-settings используются для их определения. Их можно изменить с помощью ccsm (менеджер настроек конфигурации compiz) или с помощью gconf-editor. Настройки плагина хранятся в приложениях / compiz-1 / general / screen0 / options под active_plugins. Дубликаты заставили меня иметь segfaults с compiz. Они хранятся в домашнем каталоге пользователя в каталоге ~ / .gconf /, организованном, как описано выше. Фактические значения хранятся в файлах% gconf.xml.

С 12.10 эти плагины хранятся в двоичном формате в файле ~ / .config / dconf / user. Метод хранения настроек dconf или gsettings является более новым. Вы можете увидеть все эти настройки с помощью /usr/share/upstart/sessions .

Unityshell - один из этих плагинов. Он использует проект nux как встроенный инструментарий. Изображения рисуются на текстурах в трехмерном пространстве с заданными значениями прозрачности. Они обрабатываются с помощью compiz и отправляются либо в llvm, либо в усовершенствованные графические драйверы, чтобы иметь графические движки на графическом аппаратном компоненте системы и отображать их. Как правило, это в противоположность передаче изображений непосредственно в фреймбуфер, как это было сделано более традиционно. Эта сложная цепочка событий - это то, что требует более продвинутых драйверов, а иногда и побуждает к использованию проприетарных графических драйверов в Ubuntu.

    
ответ дан John S Gruber 13.06.2012 в 20:33
источник