Вопрос или проблема
Я создаю EGL-контекст с помощью DRM.
Информация о файловой системе следующая:
ls -l /dev/dri
lrwxrwxr-x 1 root wheel 8 Jan 7 05:15 card0 -> ../drm/0
lrwxrwxr-x 1 root wheel 10 Jan 7 05:15 renderD128 -> ../drm/128
ls -l /dev/drm
crw-rw---- 1 root video 0x6b Jan 6 17:28 0
getfacl /dev/dri
# file: /dev/dri
# owner: root
# group: wheel
user::r-x
group::rwx
other::r-x
getfacl /dev/dri/card0
# file: /dev/dri/card0
# owner: root
# group: video
user::rw-
group::rw-
other::---
yv@yv-lap:~/src/x11 $ groups yv
yv wheel video
Я получаю ошибки разрешения доступа к файлу libegl:
libEGL warning: failed to open /dev/dri/renderD128: Permission denied
libEGL warning: failed to open /dev/dri/card0: Permission denied
Фрагмент кода:
181│ #define SKIP_EGL_DEVICE(i, s) { EGL_PRINT_ERROR; status = 3; fprintf(stderr, " \t! egl: GPU {%u} skip: %s\n", i, s); goto l_end_loop_gpus; }
182│
183│ for(unsigned i = 0; i < (unsigned)n_devices_total; ++i) {
184│ dpy = fn_get_platform_display(EGL_PLATFORM_DEVICE_EXT, devices[i], 0);
185│ if(EGL_NO_DISPLAY == dpy) {
186│ SKIP_EGL_DEVICE(i, "can't get platform display")
187│ }
188│
189│ printf(" i egl: GPU {%u}:\n", i);
190│ if (!eglInitialize(dpy, &maj, &min)) { /* file permission errors here */
191├───> SKIP_EGL_DEVICE(i, "eglInitialize()")
192│ }
Я являюсь членом всех необходимых групп, как видно выше. Я не уверен насчёт группы video, потому что я уже в группе wheel.
Почему возникают ошибки доступа?
ОБНОВЛЕНИЕ
Переключение на root устраняет ошибки.
обновление по комментарию
ещё не вышел из системы. вывод команды id следующий:
yv@yv-lap:~/src/x11 $ id yv
uid=1001(yv) gid=1001(yv) groups=1001(yv),0(wheel),44(video)
Забавно, выход и повторный вход помогли. Что за этим стоит?
Ответ или решение
Ваша ситуация связана с проблемами доступа к устройствам DRM через библиотеку libEGL, когда ваша программа пытается создавать контекст EGL с использованием DRM (Direct Rendering Manager).
Анализ проблемы
Судя по предоставленной информации, причины возникновения ошибки, а именно отказ в доступе к файлам /dev/dri/renderD128
и /dev/dri/card0
, связаны с управлением прав доступа к устройствам. Давайте разберемся в причинах и способах решения.
Причины отказа в доступе
-
Правильная принадлежность к группе:
- Ваша учетная запись пользователя "yv" состоит в группе "video", которая имеет права на чтение и запись устройств DRM. Это подтверждается выводом команды
id yv
.
- Ваша учетная запись пользователя "yv" состоит в группе "video", которая имеет права на чтение и запись устройств DRM. Это подтверждается выводом команды
-
Необходимость в обновлении сеанса:
- Вы упомянули, что после выхода из системы и повторного входа проблема исчезла. Это указывает на то, что изменения в группах пользователя вступают в силу только после обновления сеанса. Без выхода и повторного входа операционная система продолжала использовать старые права доступа.
-
Проверка символьных ссылок:
- Символьные ссылки
/dev/dri/card0
и/dev/dri/renderD128
ведут к файлам устройств в/dev/drm
, что подтверждается выводомls -l
. Это корректные символические связи, однако важно, чтобы доступ был также предоставлен к целевым устройствам.
- Символьные ссылки
Решение проблемы
-
Обновите сеанс пользователя:
- После добавления пользователя в группу "video", требуется выйти из сеанса и заново войти, чтобы изменения в правах доступа вступили в силу.
-
Диагностика прав доступа:
- Убедитесь, что файлы устройств в
/dev/drm
имеют корректные права доступа:ls -l /dev/drm
- Права должны разрешать чтение и запись для группы "video".
- Убедитесь, что файлы устройств в
-
Проверка конфигурации системы:
- Убедитесь, что ваша система корректно настраивает группы и права доступа для устройств DRM. Если проблема повторится, возможно стоит проверить настройки udev и наличие соответствующих правил.
Заключение
Ошибка доступа к устройствам /dev/dri
и, как следствие, отказ libEGL, связана с несоответствием прав доступа, вызванным отсутствием обновления сеанса после правок групп. Правильный выход и повторный вход в систему позволяют применить изменения, предотвращая дальнейшие ошибки. Это показывает важность обновления сеанса пользователя в Unix-подобных системах после изменения групп.