2009-04-06 8 views
21

Tengo varias aplicaciones que deseo implementar usando rpm. Algunos de los archivos en las implementaciones de mi aplicación anulan los archivos de otros paquetes implementados. Simplemente incluir los nuevos archivos en el paquete de implementación causará conflictos de rpm.¿Cómo uso rpm para actualizar/reemplazar archivos existentes?

Estoy buscando la forma correcta de usar rpm para actualizar/reemplazar los archivos ya instalados.

Ya he encontrado algunas soluciones pero nada parece estar bien.

  • Mantenga las versiones personalizadas de las rpms que contienen los archivos originales.

Esto parece una gran cantidad de trabajo por una recompensa relativamente pequeña, aunque se siente menos como un truco que algunas de las otras posibles soluciones.

  • Incluya los archivos en las rpm con otro nombre y cópielos en la sección de publicación.

Esto funcionaría, pero significará ensuciar el sistema con varias copias de los archivos. También significa mantenimiento adicional en las especificaciones de compilación rpm para cada archivo.

  • Use wget en la sección de publicaciones para reemplazar los archivos originales de algún servidor conocido.

Esto es similar a la técnica de copia, pero los archivos ni siquiera viven en las rpm. Sin embargo, esto podría actuar como una buena autoridad de configuración central.

  • Despliegue los archivos como nuevos y luego use enlaces simbólicos para anular los originales.

Esto también es similar a la técnica de copia pero con menos desorden. El problema aquí es que algunos archivos no se comportan bien como enlaces simbólicos.

Respuesta

11

A lo mejor de mi conocimiento, RPM no está diseñado para permitir la actualización/reemplazar los archivos existentes, así que cualquier cosa que hagas va a ser un truco.

De las opciones que enumera, elegiría el n. ° 1 como el menos malo si los sistemas de destino son sistemas que administro (como dices, es más trabajo pero es la solución más limpia) y una combinación de n. ° 2 y # 4 (enlaces simbólicos donde sea posible, copias donde no) si estoy creando los RPM para los sistemas de otros (para evitar tener que distribuir un montón de RPM, pero lo haría muy claro en los documentos lo que yo ' Estoy haciendo).

No ha descrito qué archivos deben actualizarse o reemplazarse y cómo deben actualizarse. Dependiendo de las respuestas a estas preguntas, es posible que tenga un par de otras opciones:

  • Muchos programas están diseñados para utilizar un archivo de configuración por defecto individual y también para agarrar los archivos de configuración desde un subdirectorio .d.Por ejemplo, Apache usa /etc/httpd/conf/httpd.conf y /etc/httpd/conf.d/*.conf, por lo que sus RPM podrían soltar archivos bajo /etc/httpd/conf.d en lugar de modificar /etc/httpd/conf/httpd.conf. Y si los archivos que necesita modificar son archivos de configuración que no siguen este patrón pero que podrían realizarse, puede sugerir a los responsables del mantenimiento del paquete que agreguen esta capacidad; esto no te ayudaría de inmediato, pero facilitaría las versiones futuras.
  • Para utilidades de línea de comandos como sendmail y lpr que pueden ser proporcionados por varios paquetes, el sistema alternatives (ver man alternatives) permite más de 1 RPM que proporciona estas utilidades para ser instalados lado a lado. De nuevo, si los archivos que necesita modificar son utilidades de línea de comandos que no siguen este patrón pero que podrían realizarse, puede sugerir a los responsables del paquete que agreguen esta capacidad.
  • Los cambios de los archivos de configuración en los sistemas que administran se administran mejor a través de una herramienta como Cfengine o Puppet en lugar de a través de RPM personalizados. Creo que Red Hat favorece a Puppet.
  • Si estuviera creando los RPM para sistemas que no administro, consideraría usar una herramienta de terceros como Bitrock y deshacerme de todas mis cosas en /opt solo para no tener que pisar los archivos instalados por RPM de otros administradores.
0

¿Revisó la documentación de rpm y la lista de correo? Aquí hay uno sobre rpmsave y rpmnew que cubre su problema: http://www.redhat.com/archives/fedora-list/2003-December/msg04713.html

+0

Este es un buen consejo, pero la función rpmnew/rpmsave realmente se refiere a la actualización de un paquete existente. El problema que tengo es agregar un nuevo paquete que modifica los archivos ya instalados por otro paquete. Gracias! – tremoloqui

+0

La actualización de archivos de otro paquete no me parece muy segura. ¿Por qué necesitarías jugar con archivos de otros paquetes en primer lugar? – lothar

+0

Ejemplo principal: el paquete perl-5.8.8 en CentOS contiene una gran cantidad de versiones anteriores de módulos CPAN, que no podrá actualizar a través de RPM porque los archivos modificados del módulo entrarán en conflicto. Entonces, o estás atascado con los módulos anteriores, o lo pirateas. –

2

Consulte aquí para obtener más información sobre RPM% Archivos de directivas:

http://www.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html

Usted puede utilizar los argumentos del poste% y% secciones previas en las scriptles RPM para determinar si va a instalar, actualizar o eliminar paquetes.

Si $ 1 es 0, entonces estamos eliminando cosas viejas. Orientación 0 paquetes instalados. Si $ 1 es 1, entonces estamos instalando cosas nuevas. Dirigiendo un total de 1 paquete para ser instalado. Si $ 1 es 2 o más, entonces estamos actualizando este paquete y $ 1 representa el número de paquetes ya instalados.

Estas secciones ayudan a administrar los archivos entre las versiones. Mantenga un registro de lo que está haciendo entre versiones y considere lo que podría hacer si se saltaran una o dos versiones.

Tenga en cuenta estas cosas y ¡debería estar listo para empezar!

2

También puede ejecutar rpm -U --replacefiles --replacepkgs ..., que le dará lo que desee.

+0

Um no del todo. Si bien la instalación reemplazará los archivos, la operación no es persistente. La próxima actualización deshará --replacefiles. Tenga en cuenta que --replacepkgs es en gran medida irrelevante a menos que el paquete tenga el mismo nombre. –

+1

Además, no puede esperar que funcione cuando los usuarios extraen su paquete de un servidor yum. – Jolta

Cuestiones relacionadas