LINUX.ORG.RU

xvfb не запускается

 ,


0

1

X Window работает на 0-м экране. Запускаю Xvfb на 1-м:

$ Xvfb -screen :1 1024x768x16 
(EE) 
Fatal server error:
(EE) Server is already active for display 0
        If this server is no longer running, remove /tmp/.X0-lock
        and start again.
(EE) 

Что ему не нравится?

В /tmp/.X0-lock — PID работающего на 0-м экране X Window. Удаление /tmp/.X0-lock и /tmp/.X11-unix/ не помогает. В dmesg ничего нет.

Gentoo, KDE, x11-base/xorg-server-21.1.24. Конфигурация подробнее: emerge –info: https://pastebin.com/ei5qKVLj, emerge -pqv: https://pastebin.com/YDWkXWUW, emerge –info xorg-server: https://pastebin.com/y4VVcmew, strace Xvfb -screen :1 1024x768x16: https://pastebin.com/83WDztjF

Дополнение:
Собственно, Xvfb понадобился для сборки Firefox с PGO — с самого начала вызывает Xvfb -displayfd 1 -screen 0 1280x1024x24 +extension RANDR и не начинает компиляцию, если Xvfb не работает.

Но после серии перезагрузок с выключением/включением в параметрах ядра 'nvidia-drm.modeset=0' и заменой 0 на 1, когда я снова загрузился со старой командной строкой и попробовал thread apply all bt full в GDB, эта команда не упала! И больше не падает.

Я даже пересобрал xorg-server с CFLAGS="-O2 -pipe -march=native" (убрав -ggdb3 и вернув native) и перезагрузился. Всё равно работает.

Теперь вопрос: что это было?

★★★★★

Последнее исправление: question4 (всего исправлений: 3)

Очевидно, он не понимает твоё "-screen :1". Я бы посмотрел в исходниках каким аргументом ему терминал выбирать.

firkax ★★★★★
()

Xvfb :1 -screen 0 1024x768x16. -screen - это про виртуальный экран. Номер X-дисплея передаётся самостоятельным аргументом.

anonymous
()
Ответ на: комментарий от anonymous

Xvfb :1 -screen 0 1024x768x16

Спасибо, но так тоже падает.

$ Xvfb :1 -screen 0 1024x768x16
(EE) 
(EE) Backtrace:
(EE) 0: Xvfb (0x55c9cfa06000+0x136782) [0x55c9cfb3c782]
(EE) 1: Xvfb (0x55c9cfa06000+0x13a5dd) [0x55c9cfb405dd]
(EE) 2: /lib64/libc.so.6 (0x7f4bede38000+0x3d560) [0x7f4bede75560]
(EE) 3: /usr/lib64/libnvidia-egl-gbm.so.1 (0x7f4bed84a000+0x2211) [0x7f4bed84c211]
(EE) 4: /usr/lib64/libEGL_nvidia.so.0 (0x7f4bed6c2000+0xab0f9) [0x7f4bed76d0f9]
(EE) 5: /usr/lib64/libEGL_nvidia.so.0 (0x7f4bed6c2000+0x4c30f) [0x7f4bed70e30f]
(EE) 6: /usr/lib64/libEGL.so.1 (0x7f4bed7ed000+0x30fc) [0x7f4bed7f00fc]
(EE) 7: /usr/lib64/dri/swrast_dri.so (0x7f4bed89d000+0x24a9) [0x7f4bed89f4a9]
(EE) 8: Xvfb (0x55c9cfa06000+0x14b461) [0x55c9cfb51461]
(EE) 9: Xvfb (0x55c9cfa06000+0x14a31f) [0x55c9cfb5031f]
(EE) 10: Xvfb (0x55c9cfa06000+0x66bfc) [0x55c9cfa6cbfc]
(EE) 11: Xvfb (0x55c9cfa06000+0x16c91f) [0x55c9cfb7291f]
(EE) 12: Xvfb (0x55c9cfa06000+0x1be29) [0x55c9cfa21e29]
(EE) 13: Xvfb (0x55c9cfa06000+0x654c7) [0x55c9cfa6b4c7]
(EE) 14: /lib64/libc.so.6 (0x7f4bede38000+0x2747e) [0x7f4bede5f47e]
(EE) 15: /lib64/libc.so.6 (__libc_start_main+0x8b) [0x7f4bede5f59b]
(EE) 16: Xvfb (0x55c9cfa06000+0x19f95) [0x55c9cfa1ff95]
(EE) 
(EE) Segmentation fault at address 0x10
(EE) 
Fatal server error:
(EE) Caught signal 11 (Segmentation fault). Server aborting
(EE) 
Аварийный останов      Xvfb :1 -screen 0 1024x768x16
question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

Если через xvfb-run тоже не заработает (это скрипт-обёртка, который запускает заданный клиент, а не просто сервер), остаётся предложить собрать Xvfb с отладочными символами и посмотреть, откуда берётся вызов функции по указателю 0x10. Это не нормальное поведение программы, так не должно быть. Интересно, при чём здесь nvidia? Фреймбуфер-то должен быть виртуальным.

anonymous
()
Ответ на: комментарий от anonymous

через xvfb-run

$ xvfb-run xargs
/usr/bin/xvfb-run: строка 184: 653885 Аварийный останов      ( trap '' USR1; exec Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP -auth $AUTHFILE 1>&3 2>&3 3>&- )
xvfb-run: error: Xvfb failed to start

собрать Xvfb с отладочными символами

CFLAGS="-O2 -pipe -ggdb3" подойдёт?

и посмотреть, откуда берётся вызов функции по указателю 0x10.

Как это сделать? Я в GDB самостоятельно не ориентируюсь.

https://pastebin.com/QMRpbP7S – запустил gdb --args Xvfb :1 -screen 0 1024x768x16, сделал run и disas.

question4 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

мб vesa vs nouveau

Что? Драйвер — закрытый, nvidia. Хотя зачем он Xvfb — непонятно.

nomodeset в grub.cfg?

$ cat /proc/cmdline 
BOOT_IMAGE=/boot/kernel-6.12.90-r3 root=PARTUUID=.... nvidia-drm.modeset=0 nvidia-drm.modeset=0 modprobe.blacklist=amdgpu

Если заменить nvidia-drm.modeset=0 на nvidia-drm.modeset=1 — загрузка виснет в районе включения elogind или загрузки консольных шрифтов.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

мб ИИ-шка поможет: Как добиться использования NVIDIA Я подобрала основные шаги: Установите драйверы NVIDIA. Убедитесь, что для вашей системы и экземпляра (например, EC2) установлены подходящие проприетарные драйверы NVIDIA. Запустите Xvfb с нужными опциями. При старте укажите разрешение экрана и обязательно добавьте флаг +extension GLX — это активирует поддержку OpenGL для X11 (GLX), без которой многие приложения с GPU-ускорением не заработают. Пример: Xvfb :0 -screen 0 1024x768x24 +extension GLX -noreset &. Настройте переменную окружения DISPLAY. После запуска Xvfb укажите, куда направлять вывод приложений. Например: DISPLAY=:0 google-chrome-stable. Проверьте, что GPU задействован. После запуска выполните команду DISPLAY=:0 glxinfo | grep «direct rendering: Yes». Если в выводе есть эта строка с Yes — рендеринг идёт через GPU.

только попытаться явно отключить: вдруг по дефолту пытается

anonymous
()
Ответ на: комментарий от question4

CFLAGS="-O2 -pipe -ggdb3" подойдёт?

Вполне, поскольку среди этих флагов есть -g.

сделал run и disas.

Спасибо! Ещё одно полезное заклинание: thread apply all bt full. Может быть, тут можно было вообще не вызывать код из libnvidia-egl-gbm.so.1, а для этого надо понять, как программа туда пришла.

anonymous
()
Ответ на: комментарий от anonymous

Это плохие советы. Пожалуйста, не давайте их. Мы пытаемся поднять виртуальный фреймбуфер, который вообще не будет трогать nVidia, а не добиться использования им видеокарты.

anonymous
()
Ответ на: комментарий от anonymous

я ж выше написал о ответе ИИ, плюс там есть проверка на задействование видеокарты.

anonymous
()
Ответ на: комментарий от anonymous

мб ИИ-шка поможет:

В прошлый раз, когда послушал совета ИИ по nvidia, полдня переставлял драйвер в разных позах. В итоге нашёл в совете фактическую ошибку. А правильный ответ был по 2-й ссылке в Гугле.

Запустите Xvfb с нужными опциями.

Любой запуск приводит к ошибке наподобие
(EE) Fatal server error: (EE) Server is already active for display 0 If this server is no longer running, remove /tmp/.X0-lock and start again. (EE)

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Если заменить nvidia-drm.modeset=0 на nvidia-drm.modeset=1 — загрузка виснет в районе включения elogind или загрузки консольных шрифтов.

И вот тут начинаются странности. Я не смог вспомнить, при каких обстоятельствах добавил этот параметр, и зачем добавил его 2 раза. Попробовал грузиться с заменой на 0 на 1 и удалением 2-го или вообще без него — загрузка висла. В итоге загрузился со старыми параметрами, часов через 6 попробовал в GDB c thread apply all bt full команду Xvfb -displayfd 1 -screen 0 1280x1024x24 +extension RANDR (ради которой и начал разбираться) — и она заработала! После этого проверил без GDB — темерь тоже работает.

Хранят ли драйверы Nvidia или видеокарты состояние между перезагрузками? Могли ли эти перезагрузки с удалением nvidia-drm.modeset=0 и заменой 0 на 1 что-то изменить?

question4 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ещё одно полезное заклинание: thread apply all bt full.

Что оно даёт?

Я пересобрал xorg-server с -O2 -pipe -ggdb3,
перезагрузился,
запустил gdb --args Xvfb :1 -screen 0 1024x768x16,
thread apply all bt full
run
и ничего не упало.

После этого я для чистоты эксперимента пересобрал xorg-server с -O2 -pipe -march=native и перезагрузился, но всё равно Xvfb больше не падает.

Мог ли запуск Xvfb в условиях thread apply all bt full что-то изменить в его настройках?

question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

Мог ли запуск Xvfb в условиях thread apply all bt full что-то изменить в его настройках?

Нет. bt (backtrace) показывает стек вызовов. bt full так же показывает локальные переменные во всех функциях. thread apply all bt full выполняет это для всех потоков процесса (на случай, если их несколько). Эту команду обычно выполняют в процессе падения программы (Program received signal SIGSEGV, Segmentation fault.), чтобы из локальных переменных восстановить причину падения и постараться её исправить. Запуск backtrace до запуска программы ничего менять не должен.

anonymous
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария