não é capaz de executar glxdemo de dentro do contêiner lxc usando nvidia

2

Eu criei o contêiner lxc de nosso conjunto de ferramentas personalizado que tem muitos pacotes. Relacionado a gráficos, instalei o driver nvidia 367.27 usando o instalador nvidia dentro deste container (chamado mk7icontainer )

As bibliotecas / binários do driver nvidia são instaladas no caminho /usr/share/nvidia dentro desse contêiner.

Eu também instalei mesa instalado no caminho /usr dentro do container.

Eu compilei o código-fonte glxdemo usando o comando como:

gcc -g glxdemo.c -Wl,--rpath-link,/usr/share/nvidia/lib -Wl,-rpath,/usr/share/nvidia/lib \
-Wl,--rpath-link,/usr/share/nvidia/lib/tls -Wl,-rpath,/usr/share/nvidia/lib/tls \
-Wl,--rpath-link,/usr/share/nvidia/lib/vdpau  -Wl,-rpath,/usr/share/nvidia/lib/vdpau \
-Wl,--rpath-link,/usr/share/nvidia/lib/xorg/modules -Wl,-rpath,/usr/share/nvidia/lib/xorg/modules \
-Wl,--rpath-link,/usr/share/nvidia/lib/xorg/modules/drivers -Wl,-rpath,/usr/share/nvidia/lib/xorg/modules/drivers \
-Wl,--rpath-link,/usr/share/nvidia/lib/xorg/modules/extensions -Wl,-rpath,/usr/share/nvidia/lib/xorg/modules/extensions -lX11 -lGL -lGLU -lglut -lm -o glxdemo

Dentro do contêiner, eu tenho

DISPLAY=":0"
XAUTHORITY=/root/.Xauthority

Estou iniciando o bash no contêiner usando o comando abaixo:

sudo lxc-attach -n mk7icontainer --clear-env  -- /usr/bin/bash

Minha máquina host está executando Ubuntu 16.0.4 e instalei o mesmo driver nvidia 367.27 usando seu instalador. Está funcionando bem. Eu posso até executar glxdemo na máquina host sem problemas.

No entanto, quando tento executar glxdemo dentro do contêiner (compilado usando o comando acima mencionado), recebo o seguinte erro:

X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  154 (GLX)
Minor opcode of failed request:  3 (X_GLXCreateContext)
Value in failed request:  0x0
Serial number of failed request:  24
Current serial number in output stream:  25

alguém tem alguma ideia do que está errado aqui?

Eu também quero saber como ler esses erros para diminuir o problema.

O código-fonte para glxdemo é:

#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>
#include <stdlib.h>
static void redraw( Display *dpy, Window w )
{
   printf("Redraw event\n");
   glClear( GL_COLOR_BUFFER_BIT );

   glColor3f( 1.0, 1.0, 0.0 );
   glRectf( -0.8, -0.8, 0.8, 0.8 );
   glXSwapBuffers( dpy, w );
}

static void resize( unsigned int width, unsigned int height )
{
   printf("Resize event\n");
   glViewport( 0, 0, width, height );
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
}

static Window make_rgb_db_window( Display *dpy,
                              unsigned int width, unsigned int height )
{
   int attrib[] = { GLX_RGBA,
                    GLX_RED_SIZE, 1,
                    GLX_GREEN_SIZE, 1,
                    GLX_BLUE_SIZE, 1,
                    GLX_DOUBLEBUFFER,
                    None };
   int scrnum;
   XSetWindowAttributes attr;
   unsigned long mask;
   Window root;
   Window win;
   GLXContext ctx;
   XVisualInfo *visinfo;

   scrnum = DefaultScreen( dpy );
   root = RootWindow( dpy, scrnum );

   visinfo = glXChooseVisual( dpy, scrnum, attrib );
   if (!visinfo) {
      printf("Error: couldn't get an RGB, Double-buffered visual\n");
      exit(1);
   }

   /* window attributes */
   attr.background_pixel = 0;
   attr.border_pixel = 0;
   attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
   attr.event_mask = StructureNotifyMask | ExposureMask;
   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;

   win = XCreateWindow( dpy, root, 0, 0, width, height,
                    0, visinfo->depth, InputOutput,
                    visinfo->visual, mask, &attr );

   printf("\n XCreateWindow successfull \n");
   ctx = glXCreateContext( dpy, visinfo, NULL, True );
   if (!ctx) {
      printf("Error: glXCreateContext failed\n");
      exit(1);
   }

        printf("\n glXCreateContext successfull \n");

   glXMakeCurrent( dpy, win, ctx );

   return win;
}

static void event_loop( Display *dpy )
{
   XEvent event;

   while (1) {
      XNextEvent( dpy, &event );

      switch (event.type) {
         case Expose:
            redraw( dpy, event.xany.window );
            break;
         case ConfigureNotify:
            resize( event.xconfigure.width, event.xconfigure.height );
            break;
      }
   }
}

int main( int argc, char *argv[] )
{
   Display *dpy;
   Window win;

   dpy = XOpenDisplay(NULL);
        if(!dpy)
        {
                printf("\nError in XOpenDisplay\n");
        }
        printf("\nXOpenDisplay successfull\n");

   win = make_rgb_db_window( dpy, 300, 300 );

   printf("\nmake_rgb_db_window successfull \n");
   glShadeModel( GL_FLAT );
   glClearColor( 0.5, 0.5, 0.5, 1.0 );

   XMapWindow( dpy, win );

   event_loop( dpy );
   return 0;
}
    
por Monku 01.11.2016 / 22:03

1 resposta

1

Consegui resolver este problema.

Eu tive que adicionar nvidia nós do dispositivo no arquivo de configuração lxc container .

lxc.cgroup.devices.allow = c 195:* rwm
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
    
por Monku 01.11.2016 / 22:36