Mostrando entradas con la etiqueta centos. Mostrar todas las entradas
Mostrando entradas con la etiqueta centos. Mostrar todas las entradas

sábado, 2 de enero de 2016

Cómo crear paquetes RPM

    Un día tuve que instalar una versión de un software para el cual no existía un .rpm para mi distribución (Fedora), pude encontrar el código fuente de la actualización pero no quería instalarlo siguiendo los clásicos ./configure, make y make install ya que si lo hacía así no iba a ser fácil desinstalarlo y volver a dejar mi sistema operativo como estaba.

    Y es que precisamente para eso están los manejadores de paquetes, con ellos no tenemos que preocuparnos por las dependencias de nuestros paquetes, ni tenemos que saber qué archivos el paquete instaló en nuestro equipo para después borrarlos, etc. Todo esto lo hace el manejador de paquetes automáticamente. El manejador de paquetes por lo general utiliza una base de datos que mantiene toda la información de los paquetes instalados, sus dependencias, etc.

    Cada vez que se necesita remover un paquete, por ejemplo, el manejador de paquetes sabe qué archivos este paquete instaló y los puede borrar. También sabe si este paquete depende de otros o si otros dependen de él.

    El tema de este artículo es cómo crear un paquete a partir del código fuente de un software que deseamos instalar para poder aprovechar las ventajas del manejador de paquetes de Red Hat (RPM), el mismo que se utiliza en Fedora, Centos y Suse.

    Lo primero que hice fue descargar una versión anterior del paquete con el código fuente del programa que deseaba actualizar. Para esto simplemente utilicé el siguiente comando:

dnf download --source telepathy-gabble-0.18.2

    Este comando habilita los repositorios que contienen el código fuente de los programas y descarga el paquete telepathy-gabble-0.18.2-5.fc23.src.rpm en el directorio en el que nos encontramos actualmente.

    En CentOS o Red Hat todavía se utiliza yum, por lo que el comando para descargar el paquete en esas distribuciones sería:

yum  download --source telepathy-gabble-0.18.2

    Los paquetes src.rpm son paquetes de código fuente y traen todo lo necesario para construir un paquete rpm con la aplicación compilada y toda la metadata, o sea que a partir de un src.rpm podemos construir un paquete rpm "normal" o un paquete que solamente contiene los binarios y toda la información necesaria para actualizar la base de datos del manejador de paquetes.

    Es por ello que al instalar un paquete src.rpm no se instala la aplicación propiamente, sino que al instalarlo éste genera una serie de directorios con el código fuente de la aplicación, los patches, y el .spec que es un archivo que rpmbuild utiliza para saber cómo contruir el paquete. O sea, todo lo necesario para crear un rpm.

    En Fedora para instalar el src.rpm se utilizan los mismos comandos que para instalar un paquete binario

rpm -i  telepathy-gabble-0.18.2-5.fc23.src.rpm

   Eso me crea un directorio en mi home llamado rpmbuild con los siguientes directorios:



    Es importante señalar que tanto para instalar el src.rpm como para construir el binario no hace falta ser root ya que estamos trabajando en el directorio del usuario normal y no estamos instalando la aplicación, simplemente estamos creando un nuevo rpm. También la localización y el nombre del directorio rpmbuild pueden variar en otras distribuciones.

    En esta captura de pantalla se puede observar que tengo varios paquetes tar.gz que contienen el código fuente de la aplicación, así como varios patches. Naturalmente la última versión del código fuente (0.18.3) la agregué yo para poder construir la nueva versión del rpm.  El código fuente lo bajé desde http://telepathy.freedesktop.org/releases/telepathy-gabble/telepathy-gabble-0.18.3.tar.gz

    Así las cosas, sólo quedaba modificar el correspondiente .spec con las instrucciones para compilar y construir el paquete rpm:

%if 0%{?rhel}
%global run_tests 0
%else
%global run_tests 1
%endif

Name:           telepathy-gabble
Version:        0.18.2
Release:        5%{?dist}
Summary:        A Jabber/XMPP connection manager

Group:          Applications/Communications
License:        LGPLv2+
URL:            http://telepathy.freedesktop.org/wiki/
Source0:        http://telepathy.freedesktop.org/releases/%{name}/%{name}-%{version}.tar.gz
Patch1:         telepathy-gabble-0.18.0-build.patch
Patch2:         0001-xmpp-console-Explicitly-state-python-in-the-shebang.patch

BuildRequires:  dbus-devel >= 1.1.0
BuildRequires:  dbus-glib-devel >= 0.82
BuildRequires:  telepathy-glib-devel >= 0.19.9
BuildRequires:  glib2-devel >= 2.32
BuildRequires:  gnutls-devel >= 2.12.0
BuildRequires:  sqlite-devel
BuildRequires:  libuuid-devel
BuildRequires:  libsoup-devel
BuildRequires:  libnice-devel >= 0.0.11
BuildRequires:  cyrus-sasl-devel
BuildRequires:  libxslt
%if %{run_tests}
# Build Requires needed for tests.
BuildRequires:  python
BuildRequires:  python-twisted
BuildRequires:  dbus-python
BuildRequires:  pygobject2
%endif

Requires:       telepathy-mission-control >= 5.5.0
Requires:       telepathy-filesystem

# Removed in F17
Obsoletes:      telepathy-butterfly < 0.5.15-5


%description
A Jabber/XMPP connection manager, that handles single and multi-user
chats and voice calls.


%prep
%setup -q
%patch1 -p 1 -b .build
%patch2 -p 1 -b .shebang


%if %{run_tests}
%check
#make check
%endif


%build
%configure --enable-static=no
make %{?_smp_mflags}


%install
make install DESTDIR=$RPM_BUILD_ROOT
find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'

## Don't package html doc to incorrect doc directory
rm -f $RPM_BUILD_ROOT%{_docdir}/%{name}/*.html


%post -p /sbin/ldconfig


%postun -p /sbin/ldconfig


%files
%doc COPYING AUTHORS
%doc docs/*.html
%{_bindir}/%{name}-xmpp-console
%{_libexecdir}/%{name}
%{_datadir}/dbus-1/services/*.service
%{_datadir}/telepathy/managers/*.manager
%{_mandir}/man8/%{name}.8.gz
## If more connection managers make use of libdir/telepathy this
## be moved to the tp-filesystem spec file.
%dir %{_libdir}/telepathy
%dir %{_libdir}/telepathy/gabble-0
%dir %{_libdir}/telepathy/gabble-0/lib
%dir %{_libdir}/telepathy/gabble-0/plugins
%{_libdir}/telepathy/gabble-0/lib/libgabble-plugins-*.so
%{_libdir}/telepathy/gabble-0/lib/libgabble-plugins.so
%{_libdir}/telepathy/gabble-0/lib/libwocky-telepathy-gabble-*.so
%{_libdir}/telepathy/gabble-0/lib/libwocky.so
%{_libdir}/telepathy/gabble-0/plugins/libconsole.so
%{_libdir}/telepathy/gabble-0/plugins/libgateways.so


%changelog
* Fri Jun 19 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.18.2-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild

* Wed Feb 18 2015 Slavek Kabrda <bkabrda@redhat.com> - 0.18.2-4

....

    Aquí simplemente cambié la versión a 0.18.3, el Release (la versión del rpm) a 1 y eliminé las líneas que aplicaban los patches a la versión anterior. La sección files le indica al manejador de paquetes dónde debe de instalar los archivos. Es importante leer el código fuente del programa para verificar que no haya nuevas dependencias que debamos incluir, generalmente podemos encontrar un README o un INSTALL con información importante.

    Una vez hecho todo lo anterior, sólamente quedaba crear el paquete rpm utilizando para ello el comando rpmbuild -bb ~/rpmbuild/SPECS/telepathy-gabble.spec este comando compilará las fuentes y creará un nuevo paquete en el directorio /RPMS/x86_64 (arquitectura de mi equipo) llamado en este caso telepathy-gabble-0.18.3-1.fc23.x86_64.rpm listo para ser instalado.

    Espero que esta información les sea útil y les dejo el link de la documentación oficial, que aunque está un poco desactualizada puede servir de guía.

https://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/pdf/RPM_Guide/Fedora_Draft_Documentation-0.1-RPM_Guide-en-US.pdf

Saludos

domingo, 22 de noviembre de 2015

Recuperar la contraseña Root en sistemas RHEL y derivados

  Siempre me he preguntado qué pasaría si olvido la contraseña del usuario administrador o root en un sistema Linux. Sabemos que con el comando passwd un usuario puede cambiar su contraseña y que el usuario root puede cambiar la contraseña de los demás usuarios, sin embargo, ningún otro usuario sin privilegios administrativos puede cambiar la contraseña de root (naturalmente) por lo que si olvidamos la contraseña del único usuario administrativo, cómo la recuperamos?

 El proceso que describo a continuación funciona para sistemas RHEL y derivados (Fedora y Centos).

  Primero debemos tener acceso al menú de arranque del sistema. Al reiniciar el sistema operativo debemos detener el arranque automático presionando cualquier tecla en el menú del grub.


  Una vez que hemos seleccionado nuestro sistema operativo, procedemos a presionar la tecla 'e' para editar la entrada correspondiente.

  Luego vamos hasta la línea donde se encuetra el kernel.

  Nos posicionamos al final de la línea y agregamos el parámetro rd.break


  Luego de esto, procedemos a presionar Crtl-x para arrancar el sistema con la entrada editada. Esto ocasionará que el sistema se detenga y nos arroje un shell dentro del initramfs, antes de montar el resto del sistema.


  Dentro de este shell podemos montar el root filesystem, simplemente necesitamos ejecutar el comando

mount -o rw, remount /sysroot

  De hecho dentro de sysroot se encuentran todos los archivos del sistema, así que una vez que los hemos montado en modo lectura-escritura podemos utilizar el comando passwd y cambiar la contraseña del usuario root.

  Primero debemos cambiar al root /sysroot ejecutando el comando

chroot /sysroot

  Una vez hecho esto, podemos ejecutar el comando passwd y cambiar la contraseña del usuario root.

  El último paso consiste en hacer un relabel de los archivos del sistema linux, ya que si estamos utilizando RHEL o derivados este procedimiento habrá cambiado el contexto del archivo passwd, lo que nos dará problemas con SELinux.

  Para hacer el relabel automático en el próximo arranque, sólo necesitamos crear un archivo vacío en el directorio raíz llamado .autorelabel

touch /.autorelabel

  Listo, solamente necesitamos continuar con el proceso normal de arranque, para ello utilizamos el comando exit para salir del chroot y del ram filesystem.

Espero que les sea útil.