amarao (amarao_san) wrote,
amarao
amarao_san

xorg'ия

Решил доебаться до X-сервера так, чтобы иметь два независимых seat'а или сервера. Чтобы у каждого комплект input'а и свой экран, с разными фокусами.

В идеологии X-сервера проблема должна решаться тривиально минимум тремя разными способами.

1) Два server layout'а для двух разных X-серверов.
2) Два разных seat'а для двух разных X-серверов.
3) Два разных X-сервера с разными конфигами.

Быстро забываем про всякие понтовые новомодные display manager'ы и ерунду типа "input device" сваливаемся к сути проблемы: как сделать два X-сервера на разные мониторы?


Итак, начинаем с невинного: Сделаем два независимых screen'а в одном layout. Работает. Единственное из всего последующего. Два экрана на одном display'е без xrandr'а. Все input'ы на первом, на втором шиш (конфиг). Но дело не в input'ах, а в том, что если запустить что-то на втором screen'е, а потом ткнуть кнопкой в первом, то фокус окно теряет. Как бы ожидаемо. Не годится.

Дальше тривиальное.

Давайте сделаем два layout'а. На одной nvidia.

Что может быть проще?
Section "Device"
    Identifier     "nvidia_dell"
    Screen         0
    Option      "UseDisplayDevice"   "DFP-0"
    Driver         "nvidia"
EndSection

Section "Device"
    Identifier     "nvidia_wacom"
    Screen         1
    Option      "UseDisplayDevice"   "DFP-1"
    Driver         "nvidia"
EndSection


И два layout'а (скрины и мониторы пропустил, они тривиальны):
Section "ServerLayout"
    Identifier "Layout0"
    Screen 0 "Dell"
EndSection

Section "ServerLayout"
    Identifier "Layout1"
    Screen 0 "Wacom"
EndSection


Разумеется, оно не работает. Потому что при парсинге у нас написано два раза screen 0 и nvidia расхерачивает к чертям с битой видеопамятью (где можно видеть фрагменты соседнего экрана).

Если указать в одном screen 0, а во втором screen 1, то очевидно не работает - при парсинге не сходятся layout и screen. Если ещё и в одном layout указать 1, то "просто не работает". Второй сервер не видит ни одного устройства, первый видит их все.

Дважды указать без screen'а не получается (не видит карту на второй копии).

Указать Option "UseDisplayDevice" "DFP-1" без screen'а не получается, ингорирует.

Следующая попытка. А что если завести вместе nvidia и i915?

Запускаю. Пропускаю все неправильные мои попытки и фиксируемся на последней правильной. Включаем в биосе обе видеокарты, грузимся:

Section "ServerLayout"
        Identifier "layout0"
        Screen 0 "Screen0"
        Screen 1 "Screen1"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device "nvidia"
        Monitor "monitor0"
EndSection
Section "Screen"
        Identifier "Screen1"
        Device "intel"
        Monitor "monitor1"
EndSection

Section "Monitor"
        Identifier "monitor1"
EndSection
Section "Monitor"
        Identifier "monitor0"
EndSection

Section "Device"
    Identifier     "nvidia"
    Driver         "nvidia"
    BuSID          "PCI:1:0:0"
    Screen 0
EndSection

Section "Device"
        Identifier  "intel"
        Driver      "intel"
        BusID       "PCI:0:2:0"
        Screen 1
EndSection


Безупречный конфиг от которого невозможно отвертеться. Ядро грузится с nomodeset, так что i915 не загружен.

Перед запуском грузим оба - ноль эффекта. То есть nvidia работает (если её с одиночным конфигом запустить), i915 - нет.

Если загрузить modprobe i915 modeset=1, то оно перехватывает KMS на себя, но таки грузится.

В /dev/dri наконец-таки появляются: /dev/dri/card0 /dev/dri/card1

Запускаем X'ы и получаем... Шах и мат:

[   610.597] (EE)
[   610.597] (EE) Backtrace:
[   610.597] (EE) 0: X (xorg_backtrace+0x56) [0x7f87ef911d46]
[   610.597] (EE) 1: X (0x7f87ef75b000+0x1baf29) [0x7f87ef915f29]
[   610.597] (EE) 2: /lib/x86_64-linux-gnu/libc.so.6 (0x7f87ed44c000+0x35180) [0x7f87ed481180]
[   610.597] (EE) 3: X (xf86SetDepthBpp+0x418) [0x7f87ef7fc608]
[   610.597] (EE) 4: /usr/lib/xorg/modules/drivers/intel_drv.so (0x7f87e7508000+0xf4d7e) [0x7f87e75fcd7e]
[   610.597] (EE) 5: X (InitOutput+0xb94) [0x7f87ef7f5344]
[   610.597] (EE) 6: X (0x7f87ef75b000+0x5b3aa) [0x7f87ef7b63aa]
[   610.597] (EE) 7: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xf5) [0x7f87ed46db45]
[   610.597] (EE) 8: X (0x7f87ef75b000+0x4590e) [0x7f87ef7a090e]
[   610.597] (EE)
[   610.597] (EE) Segmentation fault at address 0x3064726165bf
[   610.597] (EE) Fatal server error:
[   610.597] (EE) Caught signal 11 (Segmentation fault). Server aborting
[   610.597] (EE)


Кажется, на этом всё. Или есть ещё варианты?

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

Неужели это так сложно?

Пока что я поыткаю эту штуку ещё чуть-чуть и перейду к вопросу о "два фокуса на одном layout'е", т.к. этот режим хотя бы работает.
Tags: destop linux, xorg
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 18 comments