¿Cómo construir un paquete RPM a partir de los archivos instalados?

8

Hay dos máquinas, versión / arco idéntico de SLES.

En la máquina #A hay un software "foo" instalado que podemos ver usando rpm -qa.

En la máquina #B, se debe instalar el software "foo".

El foo.rpmno está disponible desde ninguna fuente, desde internet, etc.

Pregunta

Dado que el paquete foo.rpmse instaló en la máquina #A, ¿podemos construir un foo.rpmarchivo a partir de los archivos ya instalados?

También hay scripts pre / post en las rpm, creo. Entonces se puede instalar foo.rpm(¿ con dependencias? ).

evachristina
fuente
Casi puede encontrar todos los paquetes rpm desde aquí. rpmfind.net/linux/RPM
Ramesh

Respuestas:

11

Es posible pero muy difícil hacer esto para que se haga correctamente. Si está desesperado, puede crear un nuevo .specarchivo RPM y construir un archivo RPM de origen "falso" (SRPM) que luego puede usar para construir un archivo RPM resultante usando rpmbuild --rebuild.

Continuaría buscando el RPM real en su lugar. No dice cuál en su pregunta, pero según mi experiencia, puede encontrar cualquier cosa en Internet si sabe cómo buscarla. He encontrado versiones antiguas de RPM para las distribuciones de Red Hat que no han estado en uso durante más de 10 años, por lo que me resulta difícil creer que no haya restos de este RPM en ninguna parte.

Además, a menudo puede volver al origen de la aplicación que está contenida en el RPM y usarlo para reconstruir el RPM también. Muchas veces las aplicaciones de origen incluirán un .specarchivo necesario que se utiliza para reconstruir el RPM.

Por último, puede obtener la fuente y el .specarchivo de un servicio de compilación como Koji para distribuciones basadas en Red Hat. SuSE también mantiene servicios de compilación similares, por lo que puede buscarlos para obtener artefactos de compilación antiguos.

Tomando los binarios como están

Puede usar este método para levantar los ejecutables reales de un sistema y ponerlos a prueba para su implementación en otro sistema.

máquina A

$ rpm -ql <packageNameHere> | xargs tar -zcvf /tmp/program.tgz

máquina B

$ tar -zxvf /path/to/your/program.tgz

La versión de SLES de RPM

De acuerdo con una de las publicaciones en este hilo: Re: Cómo crear RPM desde paquetes instalados rpm en SLES se supone que tiene el conmutador --repackage. Esto no existe en la versión de Red Hat (en Fedora o CentOS). Pero según la publicación, puedes usarlo así:

$ rpm -e --repackage <somepackage>

Una vez que se complete, encontrará sus RPM accesibles aquí:

/var/spool/repackage

Usando rpmerizor

Rpmerizor es una herramienta / script de terceros que puede instalar que volverá a empaquetar los archivos fuente en un RPM correspondiente. El uso de este script está disponible aquí, titulado: página de manual de rpmerizor .

extracto

Rpmerizor es un script que le permite crear un paquete RPM a partir de archivos instalados. Simplemente tiene que especificar archivos en la línea de comando y responder algunas preguntas interactivas para completar los metadatos rpm (nombre del paquete, versión ...). También puede usarlo en modo por lotes con opciones de línea de comandos para metadatos.

Usando rpmrebuild

No debe confundirse con la herramienta de compilación rpmbuild, rpmrebuildes otro script de terceros que puede usar para reempaquetar un RPM ya instalado.

extracto

rpmrebuild es una herramienta para construir un archivo RPM a partir de un paquete que ya se ha instalado en un uso básico, el uso de rpmrebuild no requiere ningún conocimiento de construcción de rpm. (En debian, el producto equivalente es dpkg-repack).

Ejemplo

Digamos que queremos reempaquetar openssh-server.

$ rpm -aq | grep openssh-server
openssh-server-6.2p2-8.fc19.x86_64

Ahora empaquételo:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..?......  c /etc/ssh/sshd_config
..?......  c /etc/sysconfig/sshd
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) n
result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

Referencias

slm
fuente
de todos modos, es: jdk-1.6.0_02-fcs.rpm :) No está en "internet"
evachristine
Puede obtener RPM oficiales para cualquier versión de JDK desde aquí: oracle.com/technetwork/java/javase/downloads/… . Eso te llevará a 1.6u2, que es la misma versión.
slm
¿Cómo puede saber que "jdk-1.6.0_02-fcs.rpm" es "1.6u2"? : O
evachristine
1
¡¡Lo encontré!! ¡GRACIAS! se llamaba: jdk-6u2-linux-i586.rpm ¡GRACIAS!
evachristine
1
@evachristine: sí, ese es el gusto de haberlo resuelto.
slm
0

Como regla general no.

Con un poco de suerte rpm -qiy rpm -q --changelogproporcionar información sobre el origen del paquete.

Si se creó en el sistema en el que se está ejecutando, es posible que aún tenga el archivo de especificaciones utilizado para hacer las rpm reales, si no ambas.

Como regla general, no recomiendo copiar archivos / binarios, pero la mayoría de la metainformación se encuentra en la base de datos RPM y usted tiene los archivos reales.

rpm -q --list <pkg_name> muestra todos los archivos que implementa un paquete.

rpm -q --scripts <pkg_name> mostrar los scripts que se ejecutan instalando (o eliminando) el paquete podría proporcionar la menor información sobre su propósito que los archivos que se implementan.

Y se puede encontrar cualquier dependencia que deba instalarse rpm -q --requires <pkg_name>.

HBruijn
fuente