Creare un repository base Red Hat o Debian in pochi passi

redhat    Debian

Quando una distribuzione non possiede un pacchetto di cui si necessita all’interno dei propri repository (ad esempio se l’esigenza è quella di una versione specifica oppure se il programma in questione è stato sviluppato per proprio conto) l’operazione che tendenzialmente viene effettuata dall’amministratore del sistema è quella di scaricare (o creare) il pacchetto ed installarlo manualmente. Sia questo un pacchetto per distribuzioni Red Hat ed affini (quindi un rpm) o Debian ed affini (quindi deb).
Cosa succede però quando non è uno soltanto, ma un gruppo di pacchetti a non essere presente nella distribuzione? E se tale operazione deve essere ripartita tra più sistemi? In questi casi potrebbe valere la pena creare un repository centrallizato che possa essere configurato localmente sui sistemi ed all’interno del quale tutte le dipendenze tra i pacchetti vengono soddisfatte.
Questo articolo spiega come creare un repository Red Hat o Debian basato su un gruppo di pacchetti locali.

Cos’è, fisicamente, un repository

Un repository, Red Hat o Debian, altro non è che una directory, locale o esposta via rete mediante ad esempio protocolli come http, https, ftp o nfs, che rispetta determinati requisiti.
Tipicamente all’interno di un repository i sistemi di gestione dei pacchetti come yum o apt si aspettano un file indice che, una volta caricato, metterà al corrente il sistema dei pacchetti di cui dispone.
La struttura di un repository Red Hat che rispetti i requisiti di compatibilità con il sistema yum (Package manager dei sistemi RedHat-like) è la seguente:

basedir/
  └── architettura/
          └─┬─ Packages/
            |     └─── *.rpm
            └─ repodata/
                  └─┬─ repmod.xml
                    └─ *.gz

Dove:

  • basedir è la directory base;
  • architettura può essere i386 o x86_64;
  • Packages è la cartella che contiene i pacchetti rpm effettivi;
  • repodata è la cartella che contiene le informazioni e gli indici del repository;

Un repository base Debian compatibile con apt (Package manager dei sistemi Debian-like) non è poi molto diverso:

basedir/
  └── architettura/
          └─┬─ Packages.gz
            └─ *.deb

Dove:

  • basedir è la directory base;
  • architettura può essere i386 o x86_64 (o una qualsiasi delle altre architetture supportate da Debian);
  • Packages.gz file compresso contenente l’elenco dei pacchetti con relativa versione;
  • *.deb insieme dei pacchetti con estensione .deb;

Se quindi la propria cartella risulta compatibile con gli standard illustrati, allora sarà considerata valida dai package manager relativi.

Creare un repository Red Hat

Fortunatamente, qualsiasi tipo di repository si voglia creare, esistono tool che consentono di automatizzare i processi di indicizzazione delle cartelle contenenti i pacchetti. Nel caso di rpm il pacchetto di riferimento è createrepo., che va ovviamente installato:

[root@rhel ~]# yum -y install createrepo

Si parte poi dal presupposto che esista una cartella locale contenente uno o più file rpm. Nel caso illustrato, la cartella contiene un solo rpm:

[root@rhel ~]# ls myrepo/
test-1.0-1.el6.x86_64.rpm

Il comando andrà lanciato proprio su questa directory, come unico parametro:

[root@rhel ~]# createrepo myrepo/
Spawning worker 0 with 1 pkgs
Workers Finished
Gathering worker results
 
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

Il comando createrepo ha percorso il path che è stato passato, generando i file di indice relativi al contenuto:

[root@rhel ~]# find myrepo/repodata/
myrepo/repodata/
myrepo/repodata/262588e7561d667a04349f32ed46c67fd4d74d462c43245cecd8cee2dd1fb057-other.xml.gz
myrepo/repodata/c654b6969deb697adcd14a98591b603a8d975e6322f6907fc0db468719ae8933-filelists.xml.gz
myrepo/repodata/80a8dea8aaf919aab36e01dd19ca5faa91bb0e55c3d59d2de863cd4cf9187a6f-filelists.sqlite.bz2
myrepo/repodata/repomd.xml
myrepo/repodata/560721451e5c8bcd910f8733ed953b0a5f6c74febbffdb8faac9942eb321aef0-other.sqlite.bz2
myrepo/repodata/b6574d0992096b9d43d46e393ca13a3102d8e2228ce6407d7235843f425a04c9-primary.sqlite.bz2
myrepo/repodata/48c37973501fa21a8d252109aaf828e41d6cff4326cf8db6c240c9eacb45ce2a-primary.xml.gz

Eventuali aggiornamenti alla directory potranno essere applicati utilizzando il parametro “-d”, che effettuerà un aggiornamento dei soli indici.
A questo punto la directory contenente il repository andrà esposta, via rete o più semplicemente in locale, in modo che all’interno del file di dichiarazione del reposoitory possa essere dichiarato quanto segue:

[root@rhel ~]# yum update
Loaded plugins: product-id, rhnplugin, subscription-manager
Repository 'myrepo' is missing name in configuration, using id
myrepo                 | 2.9 kB     00:00 ... 
myrepo/primary_db      | 1.7 kB     00:00 ...

Sarà infine possibile installare il pacchetto:

[root@rhel ~]# yum install test
Loaded plugins: product-id, rhnplugin, subscription-manager
Repository 'myrepo' is missing name in configuration, using id
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package test.x86_64 0:1.0-1.el6 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=====================================================================
 Package         Arch         Version         Repository         Size
=====================================================================
Installing:
 test            x86_64       1.0-1.el6       myrepo            4.0 k
 
Transaction Summary
=====================================================================
Install       1 Package(s)
 
Total download size: 4.0 k
Installed size: 6.2 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : test-1.0-1.el6.x86_64                     1/1 
  Verifying  : test-1.0-1.el6.x86_64                     1/1
 
Installed:
  test.x86_64 0:1.0-1.el6               
 
Complete!

Creare un repository Debian

La creazione di un repository Debian è altrettanto semplice. E’ necessario installare il pacchetto dpkg-dev contenente una serie di utility inerenti la gestione dei pacchetti Debian:

apt-get install dpkg-dev

Partendo poi da una cartella popolata di file con estensione .deb (in questo caso la cartella è /pacemaker e contiene tutti i file .deb ricompilati per supportare l’ultima release del pacchetto) mediante il comando dpkg-scanpackages è possibile creare il file Packages.gz in questo modo:

node1:/pacemaker# dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning:   cluster-glue cluster-glue-dev corosync corosync-dbg corosync-dev crmsh ldirectord libcfg-dev libcfg4 libcib3 libcib3-dev libcluster-glue libcluster-glue-dev libconfdb-dev libconfdb4 libcoroipcc-dev libcoroipcc4 libcoroipcs-dev libcoroipcs4 libcorosync-dev libcorosync4 libcpg-dev libcpg4 libcrmcluster4 libcrmcluster4-dev libcrmcommon3 libcrmcommon3-dev libcrmservice1 libcrmservice1-dev libevs-dev libevs4 liblogsys-dev liblogsys4 liblrm2 liblrm2-dev liblrmd1 liblrmd1-dev libpe-rules2 libpe-rules2-dev libpe-status4 libpe-status4-dev libpengine4 libpengine4-dev libpils2 libpils2-dev libpload-dev libpload4 libplumb2 libplumb2-dev libplumbgpl2 libplumbgpl2-dev libqb-dev libqb0 libquorum-dev libquorum4 libsam-dev libsam4 libstonith1 libstonith1-dev libstonithd2 libstonithd2-dev libtotem-pg-dev libtotem-pg4 libtransitioner2 libtransitioner2-dev libvotequorum-dev libvotequorum4 pacemaker pacemaker-cli-utils pacemaker-dbg pacemaker-dev pacemaker-remote resource-agents resource-agents-dev
dpkg-scanpackages: info: Wrote 74 entries to output Packages file.

A questo punto, per configurare il repository Debian sarà sufficiente aggiungere la seguente linea nel file /etc/apt/sources.list:

deb file:///pacemaker/ ./

Aggiornando poi l’archivio dei pacchetti mediante il comando apt-get:

# apt-get update
Ign file: ./ Release.gpg
Ign file: ./ Release                                                                                                                                   
Ign file: ./ Translation-it_IT                                                                                                                         
Ign file: ./ Translation-it                                                                                                                                                
Ign file: ./ Translation-en
...
...

Le prime righe di output mostrano come il comando, non trovando i file relativi alla chiave gpg ed alle traduzioni, ignori il loro scaricamento. Da questo momento in poi sarà possibile installare i pacchetti inseriti nel proprio repository con il consueto comando apt-get install .

Conclusioni

E’ chiaro come la creazione ed il mantenimento di repository propri resi pubblici necessiti di maggiore approfondimento, ma l’obiettivo di quanto descritto vuole essere quello di rendere disponibile, tendenzialmente in una rete interna, dei pacchetti nella forma più usabile possibile dalle distribuzioni.

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.

Tags: , , , ,