Red de conocimiento informático - Conocimiento informático - Cómo resolver problemas de dependencia en la instalación del paquete fuente

Cómo resolver problemas de dependencia en la instalación del paquete fuente

Ya sea que sea un novato o un experto con años de experiencia, encontrará problemas de dependencia de paquetes de software durante la instalación o compilación de paquetes de software de Linux, lo que hará que el proceso de instalación no pueda continuar. Por ejemplo, cuando un administrador instala LAMP, el paquete requiere el archivo libgd.so, que pertenece al paquete de software gd. Pero al instalar el paquete de software GD, es posible que este paquete de software dependa de otros paquetes de software y deba instalarse. En este punto algunos administradores pierden la paciencia. ¿Cómo resolver este problema de dependencia de paquetes de Linux? Antes de hablar de esta medida específica, hablemos de las dependencias de software en el sistema Linux.

Primero, ¿qué son las dependencias?

Los programas dependen de * * * bibliotecas de códigos de programa, por lo que pueden realizar llamadas al sistema, enviar resultados a un dispositivo o abrir archivos, etc. (* * *El uso compartido de bibliotecas existe de muchas maneras, no solo mediante llamadas al sistema). No hay biblioteca. Cada vez que un programador desarrolla un nuevo programa, cada programador necesita reescribir estas operaciones básicas del sistema desde cero. Al compilar un programa, el programador vincula su código a estas bibliotecas. Si el enlace es estático, el código objeto de la biblioteca * * * compilado se agrega al archivo de ejecución del programa; si es dinámico, el programador carga el código objeto de la biblioteca * * * compilado solo cuando es necesario en tiempo de ejecución. Los ejecutables dinámicos dependen de la biblioteca compartida u objeto compartido correcto para funcionar. Las dependencias de Rpm intentan imponer objetos compartidos para ejecutables dinámicos en el momento de la instalación para que los problemas relacionados con el proceso de enlace dinámico no surjan más adelante cuando se ejecute el programa.

Nota: Existe otro tipo de dependencia, que se basa en entradas explícitas. rpm impone esta dependencia al archivo de configuración rpm a través del programador, pero actualmente no nos importa este tipo de dependencia, que es relativamente fácil de resolver. La atención se centra aquí en las dependencias de objetos compartidos más complejas implementadas por rpm.

2. Archivos ejecutables dinámicos y * * objetos

Los archivos ejecutables dinámicos se encuentran utilizando el * * * nombre de objeto compartido del archivo de biblioteca utilizado al compilar y vincular inicialmente el programa *. * *Objetos compartidos. Buscan en varias ubicaciones estándar, como los directorios /lib y /usr/lib y la variable de entorno LD_LIBRARY_PATH (utilizada principalmente para especificar la búsqueda de * * * bibliotecas compartidas, como cuando especificamos la ruta al instalar Oracle, exportld_LIBRARY_PATH = $ Oracle _ home/lib:/lib:/usr/local/lib. Por cierto, los objetos compartidos que se encuentran en estos directorios de biblioteca pueden no ser archivos reales, pueden apuntar a archivos de biblioteca reales ubicados en otro lugar. Un enlace simbólico (pero generalmente todavía en; un directorio dentro del directorio de la biblioteca estándar), al menos desde la perspectiva del administrador del sistema, el nombre del paquete del repositorio utilizado para crear el archivo del repositorio y el nombre del archivo del repositorio. Por ejemplo, el. El paquete GLIBC2.3 se utiliza para crear el archivo de biblioteca compartida libc.so.6***. También puede observar en este ejemplo que el número de versión que se agrega al final del nombre del archivo de la biblioteca (.6) no tiene nada que ver. hacer con el número de versión (2.3) utilizado para crearlo. Esto es intencional por parte de los desarrolladores de los paquetes de bibliotecas compartidas para que las nuevas versiones de GLIBC puedan reutilizar las mismas bibliotecas compartidas. Esto le permite cargar un. nueva versión de GLIBC en su sistema sin romper todos los programas que están vinculados dinámicamente al archivo de biblioteca lib.so.6***, suponiendo, por supuesto, que la nueva versión de GLIBC sea compatible con versiones anteriores. Los ejecutables dinámicos están vinculados originalmente con una versión anterior. de GLIBC, incluso si los archivos de biblioteca o archivos de objetos compartidos tienen números de versión asociados, esos números de versión no le ayudan a determinar de qué versión compartida provienen.

Nota: cuando se utiliza la opción whatprovides. con el comando rpm query, puede usar el paquete rpm para obtener información sobre objetos hedónicos existentes cargados en el sistema. Esta confusión se debe a que * * * los archivos shareware pueden admitir una variedad de * * * versiones de paquetes shareware.

Por ejemplo, para comprobar los paquetes de biblioteca GLIBC*** compatibles con el archivo de biblioteca soname /lib/libc.so.6, ejecute el siguiente comando:

# objdump-all-headers/lib/libc.so .6 | menos

Desplácese hacia abajo en este informe hasta llegar a la sección Definiciones de versión: para ver qué versiones de GLIBC admite el archivo de repositorio libc.so.6***:

Definiciones de versión:

10x 010x 0865 F4 E6 libc 6

20x 00x 0d 696910 glibc_2.0

30x 00x 0d 696911 glibc_2.1

<. p>GLIBC_2.0

40x 00 0x 09691f 71 glibc_2.1.1

GLIBC_2.1

50x 00 0x 09691f 72 glibc_2.1.2

GLIBC_2.1.65438

60x 00 0x 09691 f 73 glibc _ 2.1.3

GLIBC_2.1.2

70x 00x 0d 696912 glibc _ 2.2

GLIBC_2.1.3

80x 00 0x 09691a 71 glibc _ 2 2 .

GLIBC_2.2

90x 00 0x. 09691a 72 glibc _ 2 2 .

GLIBC_2.2.1

100x 00 0x 09691a 73 glibc _ 2 . 2

110x 000x 09691a 74 glibc _ 2 2 .

GLIBC_2.2.3

120x 000x 09691a 76 glibc _ 2 . >

GLIBC_2.2.4

130 x00x 0d 696913 glibc_2.3

GLIBC_2.2.6

140x 00 0x 09691972 glibc_2 3 . >

GLIBC_2.3

150x 00 0x 09691973 glibc _ 2 3 3

GLIBC 2 3 . _ 2 3 . 4

GLIBC_2.3.3

170 x00x 0d 696914 glibc _ 2.4

GLIBC_2.3.4

180 x00x 0d. 696915 glibc_2.5

GLIBC_2.4

190x 000x 0963 cf 85 glibc_PRIVADO

GLIBC_2.5

200 0x 00x 0b 792650 gcc_3.0

En este ejemplo, el archivo de biblioteca 1ibc.so.6*** admite todos los ejecutables dinámicos desarrollados originalmente para las versiones 2.0 a 2.5 de GLIBC. NOTA: También puede utilizar el comando objdump para extraer soname de ** archivos de la biblioteca.

El comando es el siguiente:

# objdump-all-headers/lib/lib crypto .so 0 9 8 b | p>

obj dump:/lib/lib crypto .0 9 8 b:norecognizeddebuggininformation

A continuación, analizaremos cómo generar el paquete rpm para instalarlo en el nuevo. system Tenga en cuenta estas ** dependencias de la biblioteca.

En tercer lugar, el paquete de software Rpm y las dependencias de la biblioteca * * *

Cuando el programador genera el paquete rpm, el comando ldd se utiliza para informar el uso de todos los archivos ejecutables dinámicos en el paquete de software Rpm. paquete ejecutable Todas las * bibliotecas compartidas. Otra confusión surge del hecho de que diferentes ejecutables dinámicos en el mismo paquete pueden estar vinculados con diferentes versiones del mismo paquete compartido de biblioteca. Por ejemplo, es posible que se hayan desarrollado diferentes programas en el paquete Heartbeat y se hayan vinculado dinámicamente a diferentes versiones GLIBC del archivo de biblioteca libc.so.6sonmae***. Usando los parámetros -q y -requires en el comando rpm, puede ver la lista completa de bibliotecas compartidas requeridas por el paquete rpm. Por ejemplo, para ver todas las dependencias necesarias para el paquete Heartbeatrpm, utilice el siguiente comando:

# rpm-q-requires-pheartbeat-1 . Se produjo el siguiente informe:

sysklogd

/bin/sh

/bin/sh

/usr/bin/python

ld-linux.so.2

libapphb.so.0

libc.so.6

libc entonces . (GLIBC 2.0)

libc.so.6(GLIBC 2.1)

GLIBC_2.1.3

libc.so.6(GLIBC_2.2)

libc.so.6(GLIBC_2.3)

libccmclient.so.0

libdl.so.2

libglib-1.2.so .0

libhbclient.so.0

libpils.so.0

libplumb.so.0

libpthread.so.0

p>

librt.so.1

libstonith.so.0

Tenga en cuenta que en este informe, se requiere libc.so.6soname y * * * La biblioteca compartida debe admitir ejecutables dinámicos vinculados con los números de versión 2.0, 2.1, 2.1.3, 2.2 y 2.3 del paquete compartido GLIBC***. Esto está determinado por el hecho de que diferentes ejecutables dinámicos en el paquete Heartbeat se vinculan con cada versión de la biblioteca libc.so.6. Después de comprender cómo se relacionan entre sí los ejecutables dinámicos, los objetos compartidos, los sonames y los paquetes de bibliotecas compartidas, veamos un ejemplo: ¿qué sucede cuando intenta instalar un paquete rpm y falla debido a un error de dependencia? Yum puede descargar e instalar automáticamente paquetes RPM desde servidores designados, manejar automáticamente las dependencias e instalar todos los paquetes de software dependientes a la vez, eliminando la necesidad de tediosas descargas e instalaciones repetidas.

Cuarto, resolver manualmente los problemas de dependencia

Por lo general, cuando intentas instalar un paquete de software que no está incluido en la distribución (y sus dependencias no se pueden instalar a través de herramientas como Microsoft, apt -get o paquetes resueltos automáticamente mediante herramientas de actualización como Yum), encontrará errores de dependencia de rpm.

Por ejemplo, si intenta utilizar el comando rpm –IVH *rpm en una distribución de Linux anterior (como todos los paquetes Heartbeatrpm), puede encontrar el siguiente error durante la instalación:

Error: Dependencias fallidas:

libc.so.6(GLIBC_2.3)es necesario porbheartbeat-1.x.x

libc.so.6(GLIBC_2.3)es necesario porheartbeat-pils -1.x.x

lib crypto . 0 . 9 . 6 isneedbyheart beat-stonith-1 . .3). (Suponiendo que el desarrollador del paquete original no vincule un ejecutable en el mismo paquete a una versión incompatible del paquete de la biblioteca compartida) Todas estas fallas informan el nombre de la biblioteca compartida requerida o soname (en lugar de un nombre de archivo, soname siempre comienza con "lib "). Sin embargo, puede eliminar el número de versión agregado al final de soname en el informe rpm y usar el comando de localización para verificar rápidamente si estas * * * bibliotecas están instaladas en el sistema (suponiendo que su base de datos de localización esté actualizada, consulte el manual de localización o página de slot para más información). Por ejemplo, para encontrar el archivo del repositorio libcrypto, ingrese:

#locatelibcrypto

[root @ localhost ~]# localizarlibcrypto

/lib/libcrypto.so

/lib/libcrypto.so.6

/root/. basura/VMware-tools-distrib/lib/lib 32/lib crypto . basura/VMware-tools-distrib/lib/lib 32/lib criptografía 0 9 . basura/VMware-tools-distrib/lib/lib 64/lib crypto .

basura/VMware-tools-distrib/lib/lib 64/lib cripto 0 9 . /p>

/usr/lib/libcrypto.so

/usr/lib/pkg config/lib crypto .

/usr/lib/VMware-tools/lib. 32/lib cripto . 0 . 8 . /usr/lib/VMware-tools/lib32/lib cripto 0 . 8

/usr/lib/VMware-tools/lib 64/libcrypto entonces . so . 0 . 9 . 8/libcrypto . cual * El ** paquete del repositorio contiene los * * * archivos del repositorio. Una forma rápida y sencilla de completar esta herramienta es ingresar el nombre de la biblioteca en la barra de búsqueda. Si ingresa el texto libcrypto.so en este cuadro de búsqueda, pronto sabrá que esta biblioteca la proporciona el paquete openssl.

Si hay una versión anterior del * * * paquete de acceso a la biblioteca instalada en su sistema, puede usar el siguiente comando para confirmar que el software contiene los * * * archivos de acceso a la biblioteca que necesita:

# rpm-q - provideopenssl

[root @ localhost ~]# rpm-q-providesopenssl

Configuración (openssl)=0.9.8b-10.el5

lib4758cca.so

libaep.so

libatalla.so

libchil.so

libcrypto.so.6

libcswift.so

libgmp.so

libnuron.so

libssl.so.6

libsureware .so

libubsec.so

openssl=0.9.8b-10.el5

Este comando informa todo lo proporcionado en este paquete rpm (incluido * * * proporcionado por este paquete (nombre del archivo de biblioteca compartido). Nota: Como se mencionó anteriormente, el número de versión del * * * paquete de software compartido no tiene ni debe tener ninguna correspondencia con el número de versión * * * del archivo de software compartido (soname). Esto no se discutirá aquí, porque el enlace simbólico de soname puede apuntar a diferentes versiones de * * * archivos de biblioteca compartida. Esto también se hace al instalar una nueva versión de * * * paquete de software compartido para evitar la interrupción de archivos ejecutables dinámicos existentes.

5. Resuelva automáticamente los fallos de dependencia

Cuando utiliza paquetes rpm para crear, actualizar o agregar nuevas funciones a su sistema, los fallos de dependencia pueden convertirse rápidamente en una pesadilla. Puede evitar esta pesadilla utilizando el servicio o las herramientas de actualización de su editor. Por ejemplo, al seleccionar un paquete rpm para instalar, la herramienta RedHat www.youtheme.com descarga e instala automáticamente todas las dependencias rpm de RedHat.

Aquí hay algunas formas gratuitas de apoyar a la comunidad haciendo lo mismo: - SNMP I 3861:5 1-24.

net-SNMP-libs .I 3861:5 3 . el5 está instalado

net-SNMP-utils .I 3861:5 3 1-24 .el5 está instalado

Ahora puedes descargarlos e instalarlos todos fácilmente usando YUM rpm. paquete.

Sugerencias de verbos intransitivos para actualizar Gilbc

La biblioteca Glibc es el tiempo de ejecución subyacente de Linux y su rendimiento es de gran importancia para todo el sistema. La biblioteca Glibc contiene una gran cantidad de funciones, que se pueden dividir aproximadamente en dos categorías. Una es la interfaz de llamada al sistema que se comunica con el núcleo del sistema operativo. Se denominan funciones y proporcionan empaquetado y preprocesamiento para las llamadas al sistema operativo Linux. El otro tipo es el objeto de función general, que proporciona la implementación de funciones de uso común y se utiliza como función de herramienta. En funcionamiento real, muchos programas solo pueden depender de la versión Glibc para su instalación y ejecución. Para decirlo sin rodeos, el requisito para la versión Glibc es que la versión sea demasiado alta, pero no demasiado baja. Las aplicaciones en estos entornos compilados deben tener el mismo entorno de ejecución que otros programas. En producción, a menudo me encuentro con administradores que instalan la última distribución de Linux en el servidor. Como resultado, el software de la aplicación no se puede instalar porque la versión de glibc es incorrecta. Algunas se actualizan y otras se degradan de la versión original de Glibc. Como resultado, todo el sistema colapsa. La experiencia práctica me dice que solo necesita seleccionar el glibc correspondiente en la distribución de Linux correspondiente. Por ejemplo, si una aplicación de software de nuestra empresa está desarrollada bajo rhel3.0, entonces debe tener la distribución correspondiente. Sería difícil decirlo si se cambiara por otra cosa. No se recomienda actualizar o degradar Glibc para adaptarlo al software de la aplicación. La solución final al problema es encontrar RHEL3 e instalarlo. En la Tabla 1, he enumerado las versiones originales de Glibc para varias distribuciones de Linux para su referencia.

Haz clic en la imagen para ver una versión más grande.

Biblioteca Glibc y componentes funcionales principales

La figura 1 anterior muestra:

GCC depende de glibc.

Binutils depende de glibc (binutils proporciona una serie de herramientas y programas para crear, administrar y mantener archivos de objetos binarios, como ensamblaje (as), vinculación (ld), archivo de biblioteca estática (ar) y desensamblado. ).

Make depende de glibc

gcc requiere archivos de encabezado al compilar, pero todos son archivos de texto y no es necesario un entorno de ejecución.

Las herramientas comunes se basan en glibc y en varias bibliotecas dinámicas que deben utilizarse.

La Tabla 1 a continuación enumera Glibc para varias distribuciones de Linux importantes.

Distribución Linux versión Glibc

Redhat9glibc-2.3.2-5

Fedora1glibc-2.3.2

redhatenterpriselinuxas 3 glibc-2 . 3 2-95

redhatenterpriselinux 4g libc-2 3 4

redhatenterpriselinux 5 glibc-2.5-24

redhatenterpriselinux 6 glibc-2.9

p>

Centos5.xglibc-2.5

suselinuxenterpriseserver 9 glibc-2 3 2-92

suselinuxeenterpriseserver 10 glibc-2 31.54

<. p >suselinuxeenterpriseserver 11 glibc-2.9

Haga clic en la imagen para ver una versión más grande.

Glibc(32) bit de distribución de Linux

Los siguientes son varios métodos para consultar el número de versión de glibc:

# ls–al/lib/libc *

O se puede lograr usando el siguiente comando.

# rpm–qp | grepglibc

Los sistemas basados ​​en Debian también se pueden encontrar a través de DPKG-L | En resumen, generalmente puede ver información relacionada con glibc en el directorio /usr/share/doc.

Siete. Resumen

En la mayoría de los casos, cuando se encuentran problemas de dependencia de paquetes de software, el nombre del archivo proporcionado por el sistema operativo estará directamente relacionado con el nombre del paquete de software. El nombre del archivo puede ser el nombre del paquete de software. Pero a veces el nombre del archivo es muy diferente del nombre del paquete. En este punto, es posible que la mayoría de los administradores de sistemas no puedan encontrar el paquete de software correspondiente simplemente por su nombre de archivo. En este momento, primero puede buscarlo en el CD de instalación del sistema. Si encuentra la mejor opción en ese momento, deberá utilizar algunos de los sitios web profesionales mencionados anteriormente para buscar el nombre del paquete de software. Cuando un administrador del sistema instala un software, si existen dependencias entre los paquetes de software, es mejor llevar una libreta o registrarlo de otras formas. Para que sea conveniente y práctico la próxima vez, preste atención a la acumulación de trabajo. Creo que la mayoría de los problemas de dependencia de paquetes se resolverán.