Os executáveis do disco de uma distro montada podem ser executados sem inicializar?

1

Esta pergunta, " Descobrir qual é o SO em qual partição? ", me fez pensar se você poderia executar os executáveis a partir de uma distro montada sem realmente ter iniciado na distro.

A resposta a esta pergunta, " Como recuperar de um chmod -R 000 / bin? ", me levou a pensar que talvez você pudesse chamar o carregador da partição montada da distro.

Isso é possível?

Exemplo

Quando tentei, não funcionou, mas estou pensando que talvez esteja faltando alguns outros bits.

O comando com o qual eu estava tentando isso era lsb_release . Eu estou em uma instalação do Fedora 14 de 64 bits no momento, se isso for importante.

$ sudo /lib/ld-2.13.so /usr/bin/lsb_release
/usr/bin/lsb_release: error while loading shared libraries: /usr/bin/lsb_release: invalid ELF header
    
por slm 05.08.2013 / 23:59

1 resposta

2

Sim, desde que o kernel em execução seja capaz de executar os binários a partir da distribuição montada.

Isso requer que a distribuição montada seja para a arquitetura do processador em execução ou para uma arquitetura compatível. Você não será capaz de executar binários ARM em um processador x86, por exemplo. Compatibilidade depende da CPU; por exemplo, em x86 / amd64, os binários de 64 bits são executados apenas em CPUs de 64 bits, enquanto os binários de 32 bits são executados em CPUs de 32 e 64 bits. Compatibilidade também depende do sistema operacional; por exemplo, em CPUs x86_64, o Solaris pode executar programas indiferentemente de 64 bits e 32 bits em kernels de 32 e 64 bits; Os kernels Linux de 64 bits podem rodar programas de 32 bits, mas não vice-versa; enquanto os kernels de 64 bits do OpenBSD não podem rodar programas de 32 bits.

Os executáveis vinculados estaticamente serão executados sem esforço, desde que não estejam procurando arquivos em locais fixos. Os executáveis vinculados dinamicamente podem não funcionar se a distribuição montada tiver uma versão mais recente da biblioteca C ou estiver usando uma biblioteca C diferente (por exemplo, uClibc vs. Glibc) ou estiver usando uma arquitetura diferente para a qual o host não tenha suporte (por exemplo, i386 vs amd64, armhf vs armel).

Às vezes, para fazer com que os executáveis vinculados dinamicamente funcionem, você precisará chamar o vinculador dinâmico explicitamente e colocar os diretórios de biblioteca do sistema montado primeiro no caminho de pesquisa da biblioteca.

LD_LIBRARY_PATH=/mnt/lib:/mnt/usr/lib /mnt/lib/ld-linux.so.2 /mnt/bin/foo

Uma maneira fácil de garantir que o programa do sistema montado localizará tudo o que precisa no local correto (carregador, bibliotecas, arquivos de configuração, arquivos de dados, etc.) é executá-lo em um chroot . Um chroot restringe a visão do sistema de arquivos para um único diretório e seus subdiretórios. Apenas root pode chamar o comando chroot .

chroot /mnt /bin/foo

Como o programa está sendo executado com /mnt como seu diretório raiz, ele não verá nada fora dessa hierarquia: não /home (ou melhor, o de /mnt ), não /proc , apenas o padrão estático para /dev , etc. Os sistemas de arquivos especiais, como /proc , podem ser montados no chroot, a partir do exterior ( mount -t proc proc /mnt/proc ) ou do interior ( mount -t proc proc /proc ). No Linux, os diretórios podem ser montados novamente em um segundo local (permanecendo onde quer que estejam) com mount --bind ou com mount --rbind para também replicar sistemas de arquivos montados sob o diretório especificado.

mount --rbind /dev /mnt/dev
mount --bind /home /mnt/home
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/foo

O Debian e algumas outras distribuições fornecem uma ferramenta chamada schroot para automatizar tais montagens e executar outras gentilezas. É um exagero para uma coisa única, mas conveniente se você quiser mantém distribuições múltiplas .

    
por 06.08.2013 / 02:40