Xorg не запускается при вызове из Python

Вопрос или проблема

Я создаю дисплейный менеджер (dm) на Python, который ожидает запуска Xorg, чтобы запустить GUI.

Python

(опущен ненужный код, такой как виджеты, классы и функции)

import os

(дополнительные импорты PyQt6 и другие ...)
.......

class LoginWindow( QMainWindow ):
    def __init__(self):
        super().__init__()
                
        # Сделать окно на весь экран
        self.setWindowFlags(Qt.WindowType.FramelessWindowHint  | 
                            Qt.WindowType.WindowStaysOnTopHint
                            )

   ..........
   .......... (ненужный код для проблемы)
        
    def cancel(self, window):
        if not window :
             ...

def start_x11():
    xorg =subprocess.run("Xorg :0 -nolisten tcp -background none -logfile /var/log/mydm/xorg.log vt1",shell=True)
    return xorg

def start_user_session(username) :
    loginctl = subprocess.run(f"loginctl enable-linger {username}",shell=True)# ,capture_output=True)
    #print(loginctl)
    if loginctl.returncode == 0 :
        subprocess.run(f"sudo -u {username} dbus-launch startxfce4",shell=True)

if __name__ == "__main__" :
    
    if start_x11().returncode == 0 : 
        app = QApplication(sys.argv)
        app.setStyleSheet('''
            QPushButton#loginDockButton { 
                border: none;    
                padding: 0px;
                margin: 0px;
            }
        ''')


        window = LoginWindow()
        window.show()

        sys.exit(app.exec())

        

Как видите, я использую subprocess.run(), чтобы запустить Xorg.
И когда попросил ИИ решить проблему, мне рекомендовалось выполнить:

subprocess.run("loginctl enable-linger {username}",shell=True)

Согласно этому ИИ, это позволяет дочерним процессам пользователей выполняться даже после выхода из системы, чтобы
предотвратить закрытие процесса dbus. (хотя всё еще думаю, как это может помочь 🤔)

Служба Unit

[Unit]
Description=mydm
[email protected]
After=systemd-user-sessions.service plymouth-quit.service
Requires=systemd-logind.service

[Service]
ExecStart=/usr/bin/python3 /etc/mydm/src/mydm_login.py
Restart=always
RestartSec=3
StandardOutput=syslog
StandardError=syslog
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes

[Install]
WantedBy=graphical.target

Я должен признаться, что код службы unit был полностью сгенерирован ИИ, потому что
я не имел понятия, как работают файлы unit и не знаю ни systemd, ни systemctl

Logfile

После некоторого времени грусти и печали от того, что я не вижу своего GUI, я решил заглянуть в лог-файл из Xorg и получил следующее :

[  3671.154] Current Operating System: Linux MrDikxon 6.13.2-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 08 Feb 2025 18:54:55 +0000 x86_64
    (WW) предупреждение, (EE) ошибка, (NI) не реализовано, (??) неизвестно.

grep EE /var/log/mydm/xorg.log
[  3671.154] (EE) systemd-logind: не удалось получить сеанс: PID 4060 не принадлежит ни одному известному сеансу
[  3671.171] (EE) Не удалось загрузить модуль "fbdev" (модуль не существует, 0)
[  3671.172] (EE) Не удалось загрузить модуль "vesa" (модуль не существует, 0)
[  3671.186] (EE) open /dev/dri/card0: Нет такого файла или каталога
[  3671.191] (II) Инициализация расширения MIT-SCREEN-SAVER
[  3671.193] (EE) Ошибка AIGLX: ошибка dlopen для /usr/lib/dri/i965_dri.so (/usr/lib/dri/i965_dri.so: невозможно открыть общий файл библиотеки: нет такого файла или каталога)
[  3671.193] (EE) Ошибка AIGLX: невозможно загрузить драйвер i965

grep WW /var/log/mydm/xorg.log 

[  3671.154] (WW) Каталог "/usr/share/fonts/misc" не существует.
[  3671.154] (WW) Каталог "/usr/share/fonts/TTF" не существует.
[  3671.154] (WW) Каталог "/usr/share/fonts/OTF" не существует.
[  3671.154] (WW) Каталог "/usr/share/fonts/Type1" не существует.
[  3671.154] (WW) Каталог "/usr/share/fonts/100dpi" не существует.
[  3671.154] (WW) Каталог "/usr/share/fonts/75dpi" не существует.
[  3671.169] (WW) Ошибка открытия ACPI (/var/run/acpid.socket) (Нет такого файла или каталога)
[  3671.171] (WW) Предупреждение, не удалось открыть модуль fbdev
[  3671.172] (WW) Предупреждение, не удалось открыть модуль vesa
[  3671.186] (WW) Возврат к старому методу обнаружения для modesetting

При выполнении команды, связанной с (NI,??) не было получено никакого вывода.

Это мой первый опыт работы с Xorg или systemd, поэтому я действительно не знаю, что делать.
Таким образом, я еще ничего не пробовал, и темы на unix & linux stackexchange не кажутся связанными с тем, что мне нужно.

Ответ или решение

Проблема с запуском Xorg из Python является довольно специфичной и требует комплексного подхода, так как включает взаимодействие множества системных компонентов, таких как systemd, системный журнал и управление дисплейными серверами. Давайте разберем эту ситуацию поэтапно.

Теория

Xorg — это дисплейный сервер для систем с графическим интерфейсом, обеспечивающий работу с графическим дисплеем и пользовательским вводом. Он часто используется в UNIX и UNIX-подобных операционных системах. Запуск Xorg из Python с использованием subprocess.run() требует глубокого понимания, как сам Xorg, так и системы управления услугами, такой как systemd.

systemd — это система инициализации в Linux, которая управляет всеми службами и зависимостями в системе. Когда мы видим ошибки, связанные с systemd-logind, это может указывать на проблемы с настройкой или запуском Xorg вне контекста "сеанса", который systemd может идентифицировать.

Пример

В вашем описании проблемы имеется ряд ошибок и предупреждений, которые нуждаются в анализе:

  1. systemd-logind: Ошибка получения сеанса: Происходит потому, что Xorg запускается из сценария, который, вероятно, не привязан к идентифицируемой systemd-сеансом. Это может происходить, если Xorg запускается из-под отдельного процесса, не связанного с терминалом пользователя.

  2. Open /dev/dri/card0: Такой файл или каталог не существует: Эта ошибка может указывать на неисправности с драйверами графической карты или неправильно настроенным графическим стеком.

  3. Отсутствие модулей fbdev и vesa: Эти модули — часть механизмов, которые Xorg может использовать для отображения. Их отсутствие может указывать на устаревшую конфигурацию или отсутствие необходимых пакетов.

  4. Ошибки, связанные с AIGLX и i965_dri.so: Эти ошибки связаны с графической поддержкой и 3D-ускорением. Отсутствие необходимых библиотек может быть разрешено установкой соответствующих пакетов драйвера видео.

Применение

Решение проблемы Xorg:

  1. Проверка наличия необходимых пакетов: Убедитесь, что установлены все пакеты, необходимые для работы Xorg с вашим конкретным оборудованием. Для Arch Linux, на примере, это может означать наличие пакетов xf86-video-intel, mesa, и других, которые соответствуют вашей аппаратной среде.

  2. Запуск Xorg в user-сессии: Убедитесь, что Xorg запускается в правильной пользовательской сессии. Это может сделать через DM, который корректно обрабатывает user-сессии, например gdm, lightdm, или sddm.

  3. Настройка Unit-сервиса:

    • Правильный ExecStart: Вместо вызова внешнего скрипта, пересмотрите возможность вызова самой Python-программы, которая стартует Xorg.
    • Проверка настроек службы: Убедитесь, что StandardOutput, StandardError и другие параметры корректно настроены и работают в вашей среде. Возможно использование journalctl для логирования.
  4. Настройка прав доступа: Убедитесь, что у пользователя есть необходимые права для обращения к устройствам /dev/dri. Это зачастую можно решить, убедившись, что пользователь включен в группу video.

  5. Обновление и загрузка модулей ядра: Убедитесь, что модули fbdev и vesa загружаются корректно. Выполнение modprobe для этих модулей может помочь.

  6. Исправление ошибок AIGLX: Установите или обновите необходимые библиотеки OpenGL и драйверы.

Далее, необходимо отследить все настройки и конфигурации, которые могут влиять на работу Xorg и ensure, что они настраиваются в рамках того же session и environment, что и пользовательские графические интерфейсы. Особенно важно, чтобы все выполняемые процессы имели соответствующие с системной перспективы разрешения и доступ к требуемым устройствам и модулям.

Заключение

Работа с графическими системами на уровне дисплейного менеджера, особенно на базе Linux, требует грамотной работы с systemd, правильной структуры инициализации и понимания всех взаимодействующих компонентов. Если Xorg продолжает испытывать затруднения в загрузке, зачастую это вызывает необходимость проверить детализацию сообщений об ошибках в логах, свои конфигурации и, возможно, даже пересмотреть общие параметры инициализации системы.

Тщательно отслеживайте журналы session и service, оперируйте в связке с средствами диагностики, такими как journalctl, и активно пользуйтесь доступной документацией по Xorg и systemd.

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

Капча загружается...