LinuxProgramacionPythonServidores

Instalando paquetes en Centos, sin internet (Repotrack,Createrepo)

centos

Instalando paquetes en Centos, sin internet (Repotrack,Createrepo)

Hace poco tuve un problema al cual nunca me había enfrentado. Tenía que instalar algunos paquetes en un centos, el cual no tenía salida a internet, y para no perdernos en detalles, debo aclarar que sería imposible tener salida a internet, por políticas de seguridad.
Sólo tenía acceso a través de SSH,  y ese era el reto, instalar estos paquetes en el equipo, sin internet.

Al principio me pareció una tarea sencilla, como hacía cuando quería buscar algún rpm, me dirigí a https://pkgs.org/, y descargué el RPM. Luego subí el .rpm por SCP, y voilá.
Ahí fue cuando me di cuenta del error en el cual me encontraba, al tratar de instalar el .rpm.
Para este caso, trataremos de instalar kwrite.


root@b4rt$ rpm -ivh kwrite-4.10.5-6.el7.x86_64.rpm 

error: Failed dependencies:
	kate-part(x86-64) = 4.10.5-6.el7 is needed by kwrite-4.10.5-6.el7.x86_64
	kde-runtime >= 4.10.5 is needed by kwrite-4.10.5-6.el7.x86_64

Resolver esto es sencillo,  regresar a pkgs.org  y descargar las dependencias, pero, en estos casos, lo más facil sería utilizar  YUM


root@b4rt$ yum install kwrite-4.10.5-6.el7.x86_64.rpm

Yum, automáticamente buscará los las dependencias y las instalará…

Pero, como comentaba al inicio, lamentablemente no dispongo de salida a internet, no puedo usar YUM, lo único que me quedaba era  localizar las dependencias, descargar los rpm, e instalarlos. Y esa tarea, aunque suene sencilla, no lo es. En un primer nivel el paquete tenía 12 dependencias, y al intentar instalar la primera dependencia, el nuevo paquete,  tenía sus propias dependencias, y a su vez, estos últimos paquetes tenían más y más dependencias, en una cuenta rápida, tenía que instalar más de 100 paquetes.
Y lamentablemente, instalar todo de forma manual, no era nada óptimo.
Revisando por internet encontré algunas formas de descargar las dependencias.
$ yumdownloader
$ repotrack

Bueno, aquí empezamos y este será nuestro primer paso:

-Levantar un centos con las mismas características, (obviamente aquí si tenemos internet).
Lo siguente fué probar los comandos, descarté yumdownloader, pues lo único que descargaba, eran las dependencias, pero de primer nivel, y obviamente necesitamos descargar las dependencias de esas dependencias, lo siento si suena redundante, pero debo remarcar ese punto.
Repotrack resolvía ese problema, me generaba un directorio con absolutamente todas las dependencias que requería el paquete, el comando es magnifico!.

Así que aquí vamos con el segundo paso:

Primero, utilizamos yum para determinar el paquete que vamos a instalar.


root@b4rt$ yum search kwrite

Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.cedia.org.ec
 * epel: mirror.upb.edu.co
 * extras: mirror.cedia.org.ec
 * remi-php70: fr2.rpmfind.net
 * remi-safe: ap.stykers.moe
 * updates: mirror.cedia.org.ec
============================= N/S matched: kwrite ==============================
kwrite.x86_64 : Text Editor

  Name and summary matches only, use "search all" for everything.

Ya que tengamos el nombre del paquete:
$ kwrite.X86_64


Viene el tercer paso:
-Utilizamos repotrack (Uso básico)
$ repotrack -p [directorio] [paquete]


 


root@b4rt$ repotrack -p /home/b4rt/kwrite kwrite.x86_64

Downloading GConf2-3.2.6-8.el7.i686.rpm
Downloading GConf2-3.2.6-8.el7.x86_64.rpm
Downloading OpenEXR-libs-1.7.1-7.el7.x86_64.rpm
Downloading OpenEXR-libs-1.7.1-7.el7.i686.rpm
...

-p: directorio en el cual se descargarán los rpms a instalar
kwrite.x86_64 : Es el nombre del paquete
Ten en cuenta que los paquetes podrían tardar un buen tiempo el descargarse, así que ve por un café.
Una vez que se hayan descargado todos los paquetes, vamos a crear nuestro propio repositorio.
Cómo puedes ver, en este caso se descargaron 707 dependencias (377MB)


root@b4rt$ find /home/b4rt/kwrite/ -type f -print | wc -l

707

root@b4rt$  du -mh /home/b4rt/kwrite/

377M	/home/b4rt/kwrite/

Bueno, ahora continuamos con el cuarto paso.
Vamos a crear un un repositorio, utilizando todos los RPMs descargados, para esto usaremos el comando
$ createrepo [directory]


root@b4rt$ createrepo /home/b4rt/kwrite/

Spawning worker 0 with 118 pkgs
Spawning worker 1 with 118 pkgs
Spawning worker 2 with 118 pkgs
Spawning worker 3 with 118 pkgs
Spawning worker 4 with 118 pkgs
Spawning worker 5 with 117 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

Este comando nos generará un directorio llamado “repodata” dentro del  directorio en el cual tenemos los RPM’s, Este directorio tiene la estructura necesaria (XML, Sqlite) para poder utilizarlo como un repositorio de centos.
Ahora sólo comprimimos el directorio y tendríamos lo necesario para moverlo al servidor principal.
$ tar -zcvf kwrite.tar.gz [directory]
Despues de cargar el archivo al servidor principal,  ya sea por SCP o de la forma que más te guste, procederemos a configurar nuestro repositorio local.


//Servidor_Principal
Seguimos con el quinto paso
Primero descomprimimos el repositorio, por comodidad lo haré dentro de /home/
$ tar -zxvf kwrite.tar.gz

Ahora, tenemos que crear un fichero de extensión [.repo],  el cual tiene la información del directorio al cual apuntará, nombre del repositorio y otros datos:
Este fichero deberá estar ubicado en
# /etc/yum.repos.d/[name].repo


root@b4rt$ vim /etc/yum.repos.d/repo_b4rt.repo

[local]
name=repo_b4rt
baseurl=file:///home/kwrite
enabled=1
gpgcheck=0

name:          Nombre del repositorio
baseurl:       Ruta de nuestro repositorio
enabled :     (1) activo,  (0) inactivo
gpgcheck :   Si está seleccionado el  1, validará las firmas GPG, para verificar la autenticidad de los paquetes,
                         debemos dejarlo en (0)

Ahora, usaremos YUM para instalar el paquete localmente.
Lo primero es saber algo básico de YUM,  los argumeto que usaremos son:
$
--disablerepo y --enablerepo
En disablerepo, usamos el nombre de los repositorios que vamos a desactivar, en nuestro caso, los que tienen salida a internet,  y en enablerepo,usaremos nuestro el  nombre de nuestro repositorio local (el que acabamos de crear) podemos hallarlos en /etc/yum.repos.d/Revisamos los repositorios disponibles, verificamos el campo nombre, todos tienen una esctructura parecida a la del ejemplo.
Entonces, el comando final deberia ser similar al que muestro lineas abajo.
Inhabilito todos, y sólo habilito el repositorio local

el

root@b4rt$ yum search --disablerepo=base --disablerepo=extras --disablerepo=updates --disablerepo=remi-safe --disablerepo=epel --disablerepo=centos-sclo-rh --disablerepo=centos-sclo-sclo --enablerepo=local kwrite

Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
local                                                                                                                                                                                       | 2.9 kB  00:00:00     
local/primary_db                                                                                                                                                                            | 513 kB  00:00:00     
=============================================================================================== N/S matched: kwrite ===============================================================================================
kwrite.x86_64 : Text Editor

  Name and summary matches only, use "search all" for everything.

Cómo puedes notar, ahora el comando YUM funciona, con todo lo que quieras usar, en nuestro repositorio local:
Ahora vamos a instalar el paquete..


root@b4rt$ yum install --disablerepo=base --disablerepo=extras --disablerepo=updates --disablerepo=remi-safe --disablerepo=epel --disablerepo=centos-sclo-rh --disablerepo=centos-sclo-sclo --enablerepo=local kwrite

Ya no pongo el output del comando pues es demasiado largo, y básicamente es trabajar sólo con yum.

Como acabamos  de ver, despues de todo, ya tenemo instalado nuestro paquete, y sabemos como crear repositorios locales para hacer instalaciones COMPLETAMENTE offline.
El proceso de generar el repositorio es algo tedioso, así que hice un script en python que realiza el track de las dependencias, crea el repositorio y comprime el directorio, todo queda listo para mover nuestro repositorio al servidor principal.
 
Recuerda que utiliza python 3.5+
Puedes clonarlo desde aquí.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *