0- Cómo crear un RPM desde un SRC.RPM

Imagen de Epe

La forma más fácil de crear un RPM es basándonos en un src.rpm, tenemos dos variantes aqui:

La primera forma es no abrir el src.rpm, sino directamente mandarlo a compilar. Este caso se ve frecuentemente cuando el autor del paquete no libera el .rpm sino solamente el .src.rpm.

Por qué hacen eso? Para evitar compilar su paquete para diversas versiones de linux que usen rpm. Entonces mejor liberan el src.rpm y alguien ya se ocupará de crear el rpm para su linux.

Bajemos un src.rpm cualquiera.. de hecho bajemoslo del sitio de centos. Bajaré el src.rpm del squid.

Lo encuentro aqui: [url]http://mirror.centos.org/centos-4/4.4/os/SRPMS/[/url]

Supongamos que sólo tenemos acceso a ese src.rpm, que no podemos obtener el rpm de ningún sitio (cosa que no es verdad, pero supongamos esto para el desarrollo del documento).

Puedo entonces compilar mi rpm de squid desde este src.rpm ejecutando:


rpmbuild --rebuild squid-2.5.STABLE6-3.4E.12.src.rpm

Quizá te diga que falta algún paquete, si faltara, lo instalas con
[code]
yum install nombredelpaquete
[/code]

y repites la operación de recompilación (Rebuild).

Algunas personas no tienen instalado el rpmbuild (dice comando no encontrado) esto es porque no tienen el paquete llamado: rpm-build solo tienen que instalarlo con yum install rpm-build

siempre que te falle porque algún paquete te falte, instalas el paquete y repites el comando de rpmbuild.

El sistema se demorará un rato compilando el squid, verás que salen una gran cantidad de información sobre el qué va haciendo y a la final te dirá:


Wrote: /usr/src/redhat/RPMS/i386/squid-2.5.STABLE6-3.4E.12.i386.rpm
Wrote: /usr/src/redhat/RPMS/i386/squid-debuginfo-2.5.STABLE6-3.4E.12.i386.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.85604
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd squid-2.5.STABLE6
+ rm -rf /var/tmp/squid-2.5.STABLE6-root
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.85604
+ umask 022
+ cd /usr/src/redhat/BUILD
+ rm -rf squid-2.5.STABLE6
+ exit 0

De todo eso me interesa ver que no han habido errores y que dice: Wrote: XXXXXXXXXX
Esto es, en Wrote, nos dirá en qué lugar escribió el rpm, en este caso es en:


/usr/src/redhat/RPMS/i386/squid-2.5.STABLE6-3.4E.12.i386.rpm

Listo, ahora podemos instalar ese pquete desde el rpm que creamos.

Ahora, no todo es tan feliz. A veces tenemos que usar la segunda forma. Que es el abrir el src.rpm y configurar algo dentro de él.

Supongamos que tenemos el src.rpm del squid (en verdad lo tenemos pues lo bajamos en la anterior forma). Y que queremos cambiar algo dentro de él. Digamos.. queremos habilitar el arp.

Sabemos que para habilitar el arp, tenemos que configurar el squid antes de compilarlo, agregándole el switch: --enable-arp-acl

Dónde lo agregamos en un rpm? Esto es donde todo el mundo pierde la cabeza y por eso optan por compilar desde tar.gz.

Bueno, la configuración de un src.rpm viene en un archivo con extensión .spec que tendremos en el directorio SPECS/

Veamos, primero que todo, instalamos el src.rpm:

rpm -Uvh squid-2.5.STABLE6-3.4E.12.src.rpm

Al instalar un src.rpm (VEAN QUE DICE SRC.RPM!!!!) no se afecta el actual rpm que tengamos ya instalado. Este proceso de instalación realmente no instala ningún paquete sino que abre el src.rpm hacia el directorio /usr/src/redhat

Al instalarlo, podemos verificar dentro de /usr/src/redhat/SOURCES/ y dentro de /usr/src/redhat/SPECS/ y veremos diversos archivos llamados squid*

El que más me interesa es el de las especificaciones, llamado squid.spec

editemos este archivo:

/usr/src/redhat/SPECS/squid.spec

Es aqui donde está el cómo se configura el paquete... deseas agregarle alguna opción? Busca en este archivo algo llamado: configure. Algo así verás:


%configure \
--exec_prefix=/usr \
--bindir=%{_sbindir} \
--libexecdir=%{_libdir}/squid \
--localstatedir=/var \
--sysconfdir=/etc/squid \
--enable-poll \
--enable-snmp \
--enable-removal-policies="heap,lru" \
--enable-storeio="aufs,coss,diskd,null,ufs" \
--enable-ssl \
--with-openssl=/usr/kerberos \
.
.
.
.

Si te fijas, estas son las directivas de configuración del squid. Ahi podemos agregar o quitar las que necesitemos.

Como lo que queremos es agregarle [b]--enable-arp-acl[/b]..dónde lo hacemos? En cualquier lugar debajo del configure.. por ejemplo debajo de [b]--enable-snmp[/b].

El orden no importa, lo que sí importa es que cada opción termina con \

El \ significa: la configuración continúa abajo. Si no pones el \ linux pensará que la configuración acabó ahi y te dará millones de errores por cosas que no entiende. Ponle el \!!!!

Quedaría así:


%configure \
--exec_prefix=/usr \
--bindir=%{_sbindir} \
--libexecdir=%{_libdir}/squid \
--localstatedir=/var \
--sysconfdir=/etc/squid \
--enable-poll \
--enable-snmp \
--enable-arp-acl \
--enable-removal-policies="heap,lru" \
--enable-storeio="aufs,coss,diskd,null,ufs" \
--enable-ssl \
--with-openssl=/usr/kerberos \
.
.
.
.

Fíjate que agregué --enable-arp-acl con el \ al final.

Listo, con esto le hemos indicado al src.rpm que cuando se recompile lo haga con esta opción adicionada.

Sugiero que también se cambie el numero del release, por uno mayor, para que a la hora de instalarse, se instale con facilidad. Los rpm se fijan en los numeros para determinar si tienen que actualizarse o no.

El release queda arriba del .spec, vamos a las primeras páginas del .spec, verán que dice:

Name: squid
Version: 2.5.STABLE6
Release: 3.4E.12

Dice Release.. ahi lo podemos cambiar, por ejemplo en vez de 3.4E.12 podemos poner: 3.4E.13

Con subirle un numero basta....

Listo, salvamos el squid.spec cambiado y ejecutamos:


cd /usr/src/redhat/SPECS
rpmbuild -ba squid.spec

Con este comando le estaremos diciendo a nuestro linux que compile el nuevo paquete de squid pero con el .spec que hemos cambiado.

Al finalizar obtendremos el rpm en el mismo lugar que en el caso anterior, y este rpm tendrá activado el ARP.

Ahora lo podrás distribuir a cientos de servidores de forma fácil, actualizando.

Eso sí, estate alerta, cuando llegue otra versión de squid, tendrás que recompilarla igualmente para que soporte arp y cambiarle el numero de versión y volverla a poner en 100 de servidores.. quizá a través de un repositorio local que tengas.

saludos!
epe

Comentarios

A propósito, el que desee

Imagen de Epe

A propósito, el que desee este squid con arp-acl activado, puede bajarlo de nuestro repo, sin tener que ejecutar ./configure ni ./install ni make, ni make unistall.. sencillamente agrega nuestro repo:

[url]http://centos4.centos.ec[/url]

Saludos
epe
--
EcuaLinux.com
Ecuador: +(593) 9 9246504, +(593) 2 3412402
USA: +1 404 795 0321, España: +34 917617884


Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre

Tengo un pequeño

Imagen de Monkito

Tengo un pequeño inconveniente, tengo un centos 4.5 con el kernel 2.6.9-67.0.4.EL, me bajé src.rpm desde ésta url, pero miren...:

rpmbuild --rebuild kernel-2.6.9-67.0.4.EL.src.rpm
Instalando kernel-2.6.9-67.0.4.EL.src.rpm
error: Arquitectura no incluida: i386

:jawdrop:

cuando instalo el src.rpm se crea un archivo spec y me llama la atención un segmento de su contenido:

# Second, per-architecture exclusions (ifarch)

%ifarch %{all_x86}
%define buildlargesmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-i?86*.config
%define image_install_path boot
%define signmodules 1
%endif

%ifarch x86_64
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-x86_64*.config
%define image_install_path boot
%define signmodules 1
%endif

%ifarch ppc64
%define buildsmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-ppc64*.config
%define image_install_path boot
%define signmodules 1
%define make_target bzImage zImage.stub
%endif

%ifarch ppc64iseries
%define buildsmp 0
%define buildlargesmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-ppc64*.config
%define image_install_path boot
%define signmodules 1
%define make_target bzImage
%endif

%ifarch s390
%define buildsmp 0
%define buildlargesmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-s390*.config
%define image_install_path boot
%endif

%ifarch s390x
%define buildsmp 0
%define buildlargesmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-s390x.config
%define image_install_path boot
%endif

%ifarch ppc
%define buildlargesmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-ppc*.config
%define buildsmp 0
%define image_install_path boot
%endif

%ifarch ia64
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-ia64*.config
%define buildsmp 0
%define image_install_path boot/efi/EFI/redhat
%define signmodules 1
%endif

ya que en ninguna parte veo el i386
la única parte que medio me suena :D es ésta:


%ifarch %{all_x86}
%define buildlargesmp 0
%define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-i?86*.config
%define image_install_path boot
%define signmodules 1
%endif

si ésto corresponde a i386 entonces quiere decir que me falta el archivo $RPM_SOURCE_DIR/kernel-%{kversion}-i386*.config
y efectivamente no está allí, ya que en sources sólo tengo ésto:


kernel-2.6.9-i586.config kernel-2.6.9-i686-xenU.config kernel-2.6.9-ppc64-largesmp.config kernel-2.6.9-x86_64-largesmp.config
kernel-2.6.9-i586-smp.config kernel-2.6.9-ia64.config kernel-2.6.9-ppc.config kernel-2.6.9-x86_64-smp.config
kernel-2.6.9-i686.config kernel-2.6.9-ia64-largesmp.config kernel-2.6.9-s390.config kernel-2.6.9-x86_64-xenU.config
kernel-2.6.9-i686-hugemem.config kernel-2.6.9-ppc64.config kernel-2.6.9-s390x.config
kernel-2.6.9-i686-smp.config kernel-2.6.9-ppc64iseries.config kernel-2.6.9-x86_64.config

Otra cosa, cuando instalo el src.rpm dónde se va todo ese código fuente, es que necesito parcharlo para habilitar el soporte de esfq, ( si es que se puede en esta versión de kernel ) pero no lo encuentro por ninguna parte, necesito hacer un make oldconfig y luego empaquetar en un rpm.

Me parece que estoy un poco perdido.. :?

Desde ya les quedo agradecido por su tiempo.

------------
counter.li.org

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum