Como fazer chroot para fornecer uma nova versão do glibc para um aplicativo?

2

Estou tentando executar um programa, mas quando o executo, aparece o seguinte erro:

./app: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.14' not found (required by ./app)

Primeiro, leio para atualizar manualmente glibc , mas parece muito arriscado para um usuário não avançado como eu. Um amigo meu me contou sobre o chroot , mas não tenho certeza sobre os passos que devo seguir. Alguém pode me ajudar?

Informação do meu sistema:

uname -a:Linux hostName 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Distro: Crunchbang 11 (Waldorf)
ldd --version: ldd (Debian EGLIBC 2.13-38+deb7u8) 2.13

ldd ./app:
  linux-vdso.so.1 =>  (0x00007ffdd593d000)
  libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007febe6450000)
  libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007febe623a000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007febe5eae000)
  libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007febe5c2c000)
   /lib64/ld-linux-x86-64.so.2 (0x00007febe677a000)
    
por David Martínez 12.05.2015 / 15:42

2 respostas

2

Primeiro de você precisa perceber que se você receber uma mensagem como esta, o aplicativo que você está tentando executar não é destinado a esta plataforma / distribuição. Então, é muito provável que ele caia da maneira mais dolorosa, pegando todos os seus arquivos, dinheiro e casa:)

Especialmente, isso está relacionado ao (g) libc, pois ele é estreitamente ajustado ao kernel ABI e executar o glibc compilado para a versão diferente do ABI é arriscado. Essa é a razão por trás do versionamento de bibliotecas.

Se, depois de todos esses avisos, você quiser testá-lo, poderá usar, na ordem de complexidade, o seguinte:

  1. Descompacte a biblioteca apropriada no mesmo catálogo, onde seu aplicativo está (ou qualquer outro catálogo diferenciado) e execute o app como:

    LD_LIBRARY_PATH=. ./app
    

Você pode verificar se a biblioteca certa é obtida testando com LD_LIBRARY_PATH=. ldd ./app . Cuidado, isso não funcionará para root user e suid applications.

  1. Você pode realmente tentar criar um ambiente com chroot para o aplicativo. Lembre-se de que a chamada chroot redefine o local do diretório raiz (/) do aplicativo que é executado sob ele. Na prática, isso significa que você precisa fornecer não apenas a biblioteca glibc de substituição, mas ALL as bibliotecas usadas pelo aplicativo e as bibliotecas usadas por essas bibliotecas e assim por diante, até que você tenha tudo isso criaria um ambiente auto-suficiente. Isso também implica a presença de pelo menos os dispositivos /dev/null , /dev/stdin , /dev/stdout e /dev/log , bem como os arquivos /etc/passwd e /etc/group . O bom exemplo de tal ambiente no Debian é postfix installation (confira /var/spool/postfix/ ). O comando de lançamento em si seria simples:

    chroot /home/of/chrooted/app ./app
    
  2. A melhor e mais fácil forma seria o uso da docker e da imagem apropriada, adequada ao seu aplicativo. Instalar o docker é um tópico enorme por si só, você pode começar com o Guia de instalação do Docker . Um pré-requisito para isso, embora o kernel do Linux seja maior que 3.8+. Além dessa limitação, é a melhor maneira de executar um aplicativo que exige diferentes configurações de distribuição / bibliotecas.

Além disso, verifique como executar um novo software sem atualizar o GLIBC

    
por 13.05.2015 / 00:13
2

Um ambiente chrooted no qual você instala uma distribuição com o vintage de destino é a solução de menor esforço. Vai custar-lhe talvez um par de GB de espaço em disco, mas é bastante indolor, especialmente no Debian e derivados onde schroot faz o trabalho de configurar um ambiente chroot utilizável e Debootstrap pode instalar uma versão mais antiga ou mais recente do Debian ou Ubuntu naquele ambiente chroot. Veja Como executo programas de 32 bits em um Debian / Ubuntu de 64 bits? para um guia schroot + debootstrap. Para o GLIBC 2.14, você pode escolher jessie (Debian) ou precise ou trusty (Ubuntu) como a versão a ser instalada com o debootstrap.

Com a configuração padrão do schroot, você executa algo como

schroot -c jessie ./app

Seu diretório inicial está automaticamente disponível no mesmo caminho no chroot. Contanto que o aplicativo esteja instalado em seu diretório pessoal e precise apenas acessar outros arquivos em seu diretório pessoal ou software que existe dentro do chroot, está tudo pronto.

    
por 13.05.2015 / 02:30