Запуск X Window System Linux

Автор: | 14.12.2018

Запуск X Window System Linux

Локальный запуск X-клиентов

Существует «ручной» запуск компонент оконной системы X, что достаточно неудобно, т. к. требует установить правильное значение переменной окружения display, запустить X-сервер «до запуска первого клиента, а завершить после завершения последнего и т. д.

Поэтому для автоматизации запуска X-сервера и всех клиентов X-сеанса пользователя предназначается специальная команда xinit, проиллюстрированная в листинге ниже.

Запуск сеанса iceWM с отображением на сервере Xnest

homer@ubuntu:~$ xinit /usr/bin/icewn-session — /usr/bin/Xnest :1 &
honer@ubuntu:~$ ps f

PID      TTY    STAT    TIME    COMMAND
28163  pts/8   Ss        0:00      bash
28218  pts/0   S          0:00      \_ xinit /usr/bin/icewm-session — /usr/bin/Xnest :1
28219 pts/0    Sl         0:00       |      \_ /usr/bin/Xnest 1
28226 pts/0    S          0:00      |        \_ /usr/bin/icewm-session
28231 pts/0    R+       0:00                 \_ ps f

Запускатель xinit может быть сконфигурирован пользовательскими dot-файлами -/.xinitrc и ~/.xserverrc, представляющими собой сценарии командного интерпретатора, которые запускают, клиентскую и серверную части оконной системы соответственно.

В примере из листинга ниже показан сценарий .xserverrc, позволяющий xinit использовать виртуальный X-сервер Xnest по умолчанию на указанном дисплее, что сокращает командную строку запуска.

Запуск сеанса TWM с отображением на сервере «по умолчанию» (Xnest)

homer@ubuntu:~$ cat .xserverrc 
#!/bin/sh
exec /usr/bin/Xnest
honer@ubuntu:~$ xinit /usr/bin/twm — :2 &
honer@ubuntu:~$ ps f

PID    TTY     STAT    TIME    COMMAND
28268 pts/1   Ss          0:00      bash
28322 pts/1    S            0:00      \_ xinit /usr/bin/twm — :2
28323 pts/1    Sl           0:01       |       \_/usr/bin/Xnest :2
28330 pts/1    S           0:00        |       \_ /usr/bin/twm
30112 pts/1     R+         0:00        \_ ps f

В примере из листинга ниже показан сценарий .xinitrc, позволяющий xinit использовать X-сеанс среды KDE по умолчанию, что еще более сокращает командную строку запуска.

Запуск локальной X Window System (окружение KDE с отображением на сервере Xnest)

homer@ubuntu:~$ cat .xserverrc

#!/bin/sh
exec /usr/bin/Xnest «$@»
homer@ubuntu: ~$ cat .xinitrc

#!/btn/sh
exec startkde «$@»
homer@ubuntu:~$ xinit — :3 &

homer@ubuntu:~$ ps f

PID    TTY     STAT   TIME   COMMAND
30810  pts/2 Ss        0:00      bash
30996 pts/2   S         0:00     \_ xinit — :3
30997 pts/2   Si         0:04     |    \_/usr/bin/Xnest :3

31004 pts/2    S        0:00     |      \_ /bin/sh /usr/bin/startkde

31064 pts/2    S         0:00     |        \_ kwrapper4 ksmserver
31179  pts/2    R+       0:00     \_ ps f

Нужно заметить, что все три пользовательских сеанса, запущенных из листингов выше, могут существовать одновременно, т. к. используют разные экземпляры X-сервера.

Дистанционный запуск X-клиентов

Оконная система X изначально: проектировалась для распределенной работы ее компонент на различных узлах сети, что достаточно широко используется на практике, когда нужно запускать графические приложения на удаленном узле, их окна отображать на локальном дисплее.

В большинстве случаев для дистанционного запуска используется ssh. Попытка «прямого» запуска xeyes на узле centos от лица пользователя lich не увенчалась успехом потому, что в большинстве инсталляций аппаратный X-сервер на дисплее :0 не принимает сетевые соединения.

Попытка запуска локального виртуального сервера Xnest на дисплее :1 с перенаправлением ему вывода дистанционного xeyes тоже оказалась неудачной, но уже по другим причинам.

Запуск дистанционного X-клиента

homer@ubuntu:~$ ssh -f lich@centos «DISPLAY=ubuntu. local:0 xeyes»

Error: Can’t open display: ubuntu.local:0

homer@ubuntu:~$ Xnest :1 &

homer@ubuntu:~$ ssh -f lich@centos «DISPLAY=ubuntu.local:1 xeyes»

No protocol specified

Error: Can’t open display: ubuntu.local:1

При сетевом взаимодействии X-клиентов и X-сервера для аутентификации клиентских подключений используется механизм, основанный на предъявлении общего (известного обеим сторонам) «секрета», называемого «волшебной печенькой» (см. W:[magic cookie]), использование которых проиллюстрировано в примере ниже.

На стороне сервера «печеньки» всех клиентов, которым разрешено подключение, размещаются при помощи утилиты xauth в «банке с печеньками» (jar), откуда извлекаются сервером для проверки при подключении клиента. На стороне клиента «печеньки» при помощи той же утилиты xauth размещаются в «банке» -/.Xauthority, откуда извлекаются библиотекой Xlib для предъявления серверу при соединении с ним.

Аутентификация дистанционного X-клиента

homer@ubuntu:~$ mcookie

8f36c904dc0c9934c506c21ea7860eb2 

homer@ubuntu:~$ xauth -f cookie-jar

xauth: file cookie-jar does not exist Using authority file cookie-jar

xauth> add ubuntu:1 MIT-MAGIC-C00KIE-1 8f36c904dc0c9934c506c21ea786Oeb2↵

xauth> exit↵

Writing authority file cookie-jar

homer@ubuntu:~$ Xnest :1 -auth cookie-jar  &

homer@ubuntu:~$ ssh lich@centos

lich@centos

Last login: Fri Jan 8 17:43:04 2016 from ubuntu

[lich@centos ~]$ xauth

xauth: file /home/lich/.Xauthority does not exist

Using authority file /hone/lich/.Xauthority

xauth> add ubuntu.local:1 MIT-MAGIC-COOKIE-1  8f36c904dc0c9934c506c21ea7860eb2↵

xauth> exit↵

Writing authority file /hone/lich/.Xauthority [llch@centos ~]$ logout

onnection to centos closed.

honer@ubuntu:~$ ssh -f lich@centos «DISPLAY=ubuntu.local:1 xeyes»

Необходимость установки общего секрета и переменной окружения display и необходимость запуска дополнительного виртуального X-сервера (или необходимость активации приема сетевых соединений аппаратным сервером) делают «ручной» запуск дистанционных X-клиентов неудобным «чуть более, чем полностью».

Вместе с этим, передача «волшебных печенек» (как и любых других сообщений X-протокола) от X-клиента к X-серверу по сети происходит незащищенным образом, что может быть легко использовано злоумышленником. Именно поэтому на практике  используют туннелирующие возможности протокола SSH, позволяющие удобным автоматизированным способом решить все вышеперечисленные задачи и проблемы.

В примере из листинга ниже показано поведение SSH-сервера при туннелировании X-протокола. По запросу (-x) от SSH-клиента SSH-сервер начинает эмулировать поведение X-сервера, устанавливает О переменную окружения display, указывающую на «дисплей» :10 на «том же» узле localhost, и создает «волшебную печеньку» для этого дисплея.

При последующем запуске X-клиента xeyes им будет установлено соединение с «SSH-эмулятором» X-сервера на localhost: 10, а SSH-сервер перенаправит (туннелирует) это соединение X-протокола обратно SSH-клиенту внутри зашифрованного соединения SSH.

SSH-туннелирование X-протокола (SSH-сервер)

homer@ubuntu:~$ ssh -X lich@centos

Last login: Fri Jan 8 17:48:34 2016 from ubuntu

[lich@centos ~]$ echo $DISPLAY 

localhost:10.0
[lich@centos ~]$ xauth list
centos/unix:10 MIT-MAGIC-C00KIE-1 80c749073282be2001c33bd43e577aa4
[lich@centos ~]$ strace -fe connect xeyes
connect(3, {sa_family=AF_INET, sin_port=htons(6010), sin_addr_inet_addr( «127.0.0.1»)}, 16) = 0

+++ exited with 0 +++
[lich@centos ~]$ sudo lsof -nP -i 4:6010

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sshd 14221 Itch 10u IPv4 44578 0t0 TCP 127.0.0.1:6010 (LISTEN)
[lich@centos ~]$ logout

Connection to centos closed.

Листинг ниже иллюстрирует поведение SSH-клиента в режиме (-X) X-туннелирования, при котором он эмулирует «Х-клиента» и соединяется с аппаратным (!) Х-сервером через локальный сокет /tmp/.x11-unix/X0.

При получении от SSH-сервера перенаправленных соединений X-протокола они ретранслируются SSH-эмулятором «X-клиента» локальному X-серверу, тем самым вывод дистанционных X-клиентов изображается в окнах локального X-сервера.

SSH-туннелирование X-протокола (SSH-клиент)

honer@ubuntu:~$ strace

-fe connect ssh -f |X lich@centos xeyes

connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr(«10.0.0.99»)}, 16) = 0

connect(7, {sa_family=AF_FILE, path=»/tnp/.X11-unix/X0″»•}, 110) = 0

Так как SSH-туннелирование X-протокола позволяет перенаправлять любое количество X-соединений внутри одного SSH-соединения, то дистанционно можно запускать целые сеансы пользовательских сред, таких как GNOME с использованием xinit и виртуального X-сервера Xnest.

Запуск дистанционного сеанса GNOME с отображением на локальном сервере Xnest

homer@ubuntu:~$ xinit /usr/bin/ssh -X lich@centos gnome-session — /usr/bin/Xnest :4 &
homer@ubuntu:~$ ps f

PID    TTY     STAT    TIME    COMMAND
27759 pts/0   Ss          0:00       bash
27829 pts/0   S            0:00       \_ xinit/usr/bin/ssh -X llch@centos gnomes-session — …
27830 pts/0   Sl          0:00        |     \_ /usr/bin/Xnest :4
27837 pts/0    S            0:00       |       \_ /usr/bin/ssh -X lich@centos gnome-session
27928 pts/0    R+         0:00           \_ ps f

Управление X-дисплеями: XDMCP-менеджер и протокол

В большинстве современных инсталляций Linux работа пользователей в системе осуществляется сразу с использованием оконной системы X и какой-либо пользовательской среды, например GNOME.

Оконная система запускается сразу при старте операционной системы и не требует использования xinit или startx.

Если при работе в автоматически запущенной оконной системе проследить дерево процессов от командного интерпретатора до прародителя процессов init, то обнаружится менеджер дисплеев (например, lightdm), осуществляющий запуск пользовательского сеанса в (gnome-session).

Более того, аппаратный -сервер дисплея :0 тоже окажется запущенным этим менеджером.

Менеджер дисплеев является специальной компонентой оконной системы, управляющей автоматическим запуском ее X-серверов и X-сеансов. Именно он запускает аппаратные X-серверы для обслуживания дисплеев в указанном количестве (по умолчанию один дисплей :0), а затем «графическим» образом производит аутентификацию пользователя в системе и запускает менеджер сеансов пользовательской среды.

Кроме этого, менеджер дисплеев предназначен и для запуска дистанционных пользовательских X-сеансов, но делает это при помощи специального протокола W:[XDMCP], а не посредством протокола SSH, как при «ручном» дистанционном их запуске.

В листинге ниже показано дистанционное подключение виртуального X-сервера Xnest с узла terminal к узлу ubuntu.local по протоколу XDMCP (-query), в результате чего менеджер дисплеев lightdm (при помощи X-протокола) отобразил экран аутентификации пользователей в системе узла ubuntu. При успешной аутентификации пользователя будет запущен его X-сеанс на узле ubuntu.local так, что вывод всех X-клиентов будет направлен на дистанционный X-сервер узла terminal.

Дистанционный графический вход в ubuntu

homer@ubuntu:~$ sudo lsof -p 32494 -a -i4

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

lightdm       32494 root 11u    IPv4    3031884    0t0      UDP   *:xdmcp
bart@terminal:~$ Xnest :1 -query ubuntu.local

Надо заметить, что при использовании дистанционного XDMCP-запуска данные XDMCP- и X-протоколов при передаче в публичной сети оказываются никак не защищены (включая согласование «волшебной печеньки» и ее последующее использование), поэтому на практике безальтернативно используют SSH-запуск дистанционных сеансов с туннелированием X-протокола внутри криптографически защищенного SSH-соединения.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *