Pacotes / arquivos dependentes do usuário em / lib

0

Eu configurei um computador de 2 lugares. Eu inicio um servidor X11 usando a placa de vídeo interna do computador (intel) e outra na dedicada (nvidia). Tudo corre bem, exceto o opengl. Atualmente, apenas o nvidia-seat tem o opengl devido a arquivos conflitantes dos pacotes nvidia e intel opengl em / lib.

Existe alguma maneira de forçar um usuário a usar libs de um caminho diferente?

Toda coisa geral / lib que eu encontrei afeta todo o sistema (ldconfig). Eu também considerei o FUSE, mas me preocupo com problemas gerais de segurança e desempenho. O chroot só é viável se eu não tiver que duplicar e manter todos os arquivos. A unionfs parecia certa se permitisse sobreposições dependentes do usuário, mas nunca mexi com unionfs e nada que eu achei sugere que é possível.

    
por Olivetree 28.10.2015 / 20:52

2 respostas

0

Se seus programas são dinamicamente vinculados, então sim, definindo LD_LIBRARY_PATH para cada sessão apontando separadamente para diretórios diferentes com bibliotecas compartilhadas intel e nvidia, e armazenando apenas libs padrão do sistema em / lib.

    
por 30.10.2015 / 16:32
0

A próxima tentativa é usar duas árvores de arquivos chroot separadas com árvores de arquivos Xorg idênticas, o suficiente para que dois servidores Xorg diferentes sejam executados, e continue usando o LD_LIBRARY_PATH no espaço do usuário.

Para o Xorg ser executado, você precisa colocar todas as bibliotecas e programas relacionados ao Xorg dentro do chroot. Isso pode ser feito com ferramentas automáticas, como o chroot do Debian, ou manualmente. Abaixo está um começo muito rápido de como fazer isso manualmente (na verdade, funcionou bem para um sistema musl em um passado não muito distante):

  • Crie um diretório chroot separado, por exemplo / X11 / nvidia (e / X11 / intel).
  • Coloque binários e bibliotecas do X11 nele, refletindo o layout do sistema antigo (ou seja, coloque o Xorg em / X11 / nvidia / usr / bin, libX * .so * em / X11 / nvidia / usr / lib e bibliotecas de núcleo glibc / lib em / X11 / nvidia / lib - eles geralmente prefixados com o número da versão, então é fácil encontrar qual).
  • Não se esqueça dos diretórios dos quais o servidor X depende, ou seja, / usr / lib / X11 ou / usr / lib / xorg. Eles contêm módulos e drivers para vários tipos de dispositivos e, claro, peças de driver nvidia / intel.
  • Você provavelmente precisará de itens como / X11 / nvidia / bin / sh e / X11 / nvidia / sbin / modprobe. Crie diretórios necessários e coloque binários do host lá.
  • Você também precisará de / X11 / nvidia / tmp, / X11 / nvidia / var / lib / xkb e / X11 / nvidia / var / log.
  • Neste ponto, você pode copiar seu / X11 / nvidia para / X11 / intel.
  • Encontre e copie em locais apropriados o arquivo libglx.so e talvez outras partes do driver.
  • Vincule o mount / dev em cada / X11 / nvidia / dev e / X11 / intel / dev (criando diretórios anteriores), ou você pode tentar copiar os nós de dispositivos monitorando o que exatamente cada dispositivo requer com a ferramenta strace posteriormente
  • Vincular a montagem / proc e / sys também.
  • Se você tiver a configuração do X11 em / etc / X11, copie cada configuração para cada dispositivo em cada diretório chroot / etc.

Neste ponto, os servidores X11 chrooted devem estar prontos. Mas muitas coisas específicas de distribuição podem quebrar isso, porque elas impõem algumas outras dependências modernas (talvez você seja obrigado a copiar e iniciar alguns outros daemons em seus chroots).

Configuração do cliente: basta apontar seus clientes para diferentes bibliotecas de drivers com LD_LIBRARY_PATH. Você pode até mesmo colocar os clientes no chroot (e isso não exigirá muita alteração no layout da árvore de arquivos), mas você provavelmente acabará espelhando seu sistema duas vezes.

Os clientes devem se conectar normalmente, mesmo se o soquete X11 estiver faltando. Isso ocorre porque eles usam o nome abstrato registrado pelo servidor X ao chamar o connect (), sem requerer o soquete existente, e isso pode ser visto na saída strace. Mas se o seu sistema requer socket existente, você precisará ligar o mount / tmp também.

Como alternativa, você ainda precisará esforçar seus servidores Xorg, encontrando bibliotecas que carregam errado e apontando para lugares certos com LD_PRELOAD e LD_LIBRARY_PATH. Strace deve funcionar como root (se você fez sudo -i ou logado como root), se isso não acontecer, então isso é certamente um bug.

    
por 05.11.2015 / 04:01