Действительно ли дистрибутивы Linux взаимно совместимы?

Другими словами, может приложение, которое работает на одном дистрибутиве просто копироваться и работаться другой дистрибутив?

4
задан 09.03.2010, 17:09

4 ответа

Это зависит от того, как приложение является сборкой. Одной проблемой могут быть системные пути, которые могли бы отличаться от распределения до распределения. Другой проблемой являются совместно использованные библиотеки, которые не могли бы быть установлены в целевой системе, или хуже мог бы быть установлен в несовместимых версиях.

Одно решение проблемы библиотек состоит в том, чтобы или создать статически связанные двоичные файлы или (как, он распространен на OS X) просто поставляться, все требуемые освобождают с приложением и если необходимый набор LD_LIBRARY_PATH соответственно (хотя это - плохая идея по такому количеству причин).

Простой способ проверить, будет ли Ваша программа работать, состоит в том, чтобы перечислить все связанные библиотеки с помощью ldd и видеть, существуют ли они в целевой системе.

Пример с помощью апачского httpd:

[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)

Если все связанные библиотеки существуют в совместимой версии в целевой системе, вероятно, что Ваше приложение сможет запуститься. Оттуда на он - главным образом пути, которые должны быть скорректированы.

5
ответ дан 07.12.2019, 19:25

Это зависит от glibc версии среди других вещей. Обычно не хорошая идея, так как структуры файловой системы могли бы варьироваться.

3
ответ дан 07.12.2019, 19:25

Это зависит от сложности приложения, а также на зависимостях и библиотеках, с которыми это связывается.

Если приложение автономно, просто, не имеет никаких внешних зависимостей и компилируется на той же архитектуре ЦП - это должно работать.

В более сложных сценариях трудно сказать. Наверняка, чтобы иметь любой шанс, приложение должно быть для той же дуги ЦП, той же glibc версии, и эти 2 дистрибутива должны быть с общей базой - т.е. легче запустить debian приложение на человечности и т.д.

Если Вы хотите создать такое приложение и смочь выполнить его на каком-либо дистрибутиве - затем необходимо скомпилировать его со статически связанными библиотеками, и к, ни реле на расположении файловой системы ОС и предполагать, что некоторые файлы будут расположены в определенных местоположениях.

Идентификатор это не Вы, кто создает приложение - затем лучшее использование пакеты определенного дистрибутива перед сборкой или компиляция из источника.

Все выше верны для "скомпилированного" приложения. Если это - некоторое приложение языка сценариев - рубин, php, жемчуг, Python, и т.д., по всей вероятности (если версия интерпретатора является тем же), можно просто скопировать его - снова, если приложение не предполагает, что некоторые файлы в определенных местоположениях. Но это может быть решено, поскольку можно изменить сценарий для удовлетворения перемещению.

2
ответ дан 07.12.2019, 19:25

Если бы архитектура процессора является тем же, я не вижу, почему это не работало бы.

0
ответ дан 07.12.2019, 19:25

Теги

Похожие вопросы