As distribuições do Linux são mutuamente compatíveis?

4

Em outras palavras, um aplicativo que é executado em uma distro pode ser simplesmente copiado e executado em outra distro?

    
por Dimitri C. 09.03.2010 / 16:09

4 respostas

5

Depende de como o aplicativo é criado. Um problema pode ser os caminhos do sistema que podem diferir de distribuição para distribuição. Outro problema são as bibliotecas compartilhadas que podem não estar instaladas no sistema de destino ou, pior, podem ser instaladas em versões incompatíveis.

Uma solução para o problema das bibliotecas é construir binários vinculados estaticamente ou (como é comum no OS X) apenas enviar todas as bibliotecas requeridas com o aplicativo e, se necessário, configurar LD_LIBRARY_PATH de acordo (embora essa seja uma má idéia para muitos razões).

Uma maneira fácil de verificar se o seu programa será executado é listar todas as bibliotecas vinculadas usando o ldd e ver se elas existem no sistema de destino.

Exemplo usando o http:

do apache
[lukas@web1 /]$ ldd /usr/sbin/httpd
        libm.so.6 => /lib64/libm.so.6 (0x00002b1ec3aaf000)
        libpcre.so.0 => /lib64/libpcre.so.0 (0x00002b1ec3d32000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00002b1ec3f4e000)
        libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0 (0x00002b1ec4167000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00002b1ec4384000)
        libldap-2.3.so.0 => /usr/lib64/libldap-2.3.so.0 (0x00002b1ec45bc000)
        liblber-2.3.so.0 => /usr/lib64/liblber-2.3.so.0 (0x00002b1ec47f7000)
        libdb-4.3.so => /lib64/libdb-4.3.so (0x00002b1ec4a05000)
        libexpat.so.0 => /lib64/libexpat.so.0 (0x00002b1ec4cfa000)
        libapr-1.so.0 => /usr/lib64/libapr-1.so.0 (0x00002b1ec4f1d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b1ec5144000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00002b1ec535f000)
        libc.so.6 => /lib64/libc.so.6 (0x00002b1ec5564000)
        libsepol.so.1 => /lib64/libsepol.so.1 (0x00002b1ec58bb000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b1ec3892000)
        libuuid.so.1 => /lib64/libuuid.so.1 (0x00002b1ec5b01000)
        libpq.so.4 => /usr/lib64/libpq.so.4 (0x00002b1ec5d06000)
        libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x00002b1ec5f28000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00002b1ec6183000)
        libsasl2.so.2 => /usr/lib64/libsasl2.so.2 (0x00002b1ec6399000)
        libssl.so.6 => /lib64/libssl.so.6 (0x00002b1ec65b2000)
        libcrypto.so.6 => /lib64/libcrypto.so.6 (0x00002b1ec67fc000)
        libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00002b1ec6b4e000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00002b1ec6de3000)
        libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00002b1ec6ffc000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00002b1ec722a000)
        libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00002b1ec742c000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x00002b1ec7652000)
        libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00002b1ec7866000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00002b1ec7a6e000)

Se todas as bibliotecas vinculadas existirem em uma versão compatível no sistema de destino, é provável que seu aplicativo possa ser iniciado. A partir daí, são principalmente caminhos que precisam ser ajustados.

    
por 09.03.2010 / 16:39
3

Depende da versão da glibc, entre outras coisas. Geralmente não é uma boa idéia, já que as estruturas do sistema de arquivos podem variar.

    
por 09.03.2010 / 16:19
2

Depende da complexidade do aplicativo, bem como das dependências e bibliotecas às quais ele se conecta.

Se o aplicativo for autônomo, simples, não tiver dependências externas e for compilado na mesma arquitetura de CPU - isso deve funcionar.

Em cenários mais complicados, é difícil dizer. Com certeza, para ter alguma chance, o aplicativo precisa ser para o mesmo arco de CPU, mesma versão glibc, e as 2 distros precisam estar com uma base comum - ou seja, é mais fácil executar o aplicativo Debian no Ubuntu, etc.

Se você quer construir uma aplicação deste tipo, e ser capaz de executá-la em qualquer distro - então você precisa compilá-la com bibliotecas vinculadas estaticamente, e não retransmitir no layout do sistema de arquivos OS e assumir que alguns arquivos serão localizado em locais específicos.

Id não é você quem cria o aplicativo - então é melhor usar os pacotes de pré-compilação da distribuição específica ou compilar a partir da fonte.

Tudo acima é verdadeiro para o aplicativo "compilado". Se for algum aplicativo de linguagem de script - ruby, php, perl, python, etc., muito provavelmente (se a versão do interpretador for a mesma) você pode copiá-lo - novamente, se o aplicativo não assumir que alguns arquivos estão em locais específicos. Mas isso pode ser resolvido, já que você pode modificar o script para se adequar ao movimento.

    
por 09.03.2010 / 16:25
0

Se a arquitetura do processador é a mesma, não vejo por que isso não funcionaria.

    
por 09.03.2010 / 16:14