Conférences et Ateliers

Conférence COAGUL : Initiation à la mise en paquet RPM

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières


Mardi 14 Janvier 2014



Conférence COAGUL :

Initiation à la mise en paquet RPM



Adrien DAUGABEL







Prérequis pour l'atelier







Avoir accès à Internet (ou à la copie locale des miroirs Mageia 3)

Une machine virtuelle Mageia 3 (ou récupérer l'image OVA fabriquée) en pont ou en NAT.

Avoir Virtualbox installé sur son PC

Avoir un accès à Internet ADSL (ou avoir à disposition le script d'ajout de miroir local)





Préparer la VirtualBox





Pour ceux qui n'ont pas de Mageia :

  • Distribuer la machine virtuelle.
  • Montrer comment importer. (Réinitialiser l'adresse MAC ! )
  • Ajouter processeurs nb de processeurs physiques /2.
  • Mettre ~2Go de RAM à la machine, pas plus de 50 % de la RAM.
  • Être en interface par pont sur la carte Ethernet.





Une fois la machine virtuelle importée, la démarrer.

Clic droit sur le net applet, Configurer le réseau. Filaire (Ethernet) => Suivant tout le temps.





Choix de la distribution





Mageia :

Personnel : J'utilise Mageia depuis sa sortie, et Mandriva depuis 2008.

Les dépôts Mageia sont en train de s'approvisionner il manque des logiciels

Les choix de Mageia sur les versions stables : Ne faire que les mises à jour "importantes"






Rappel sur les commandes RPM et URPM







RPM : RPM Package Manager







Système de gestion de paquets, utilisés par certaines distributions GNU/Linux : Mageia, CentOS, OpenSUSE, Fedora

Commandes RPM = les mêmes.

A noter que RPM ne gère pas les dépendances.



rpm -i : installer

rpm -e : supprimer

rpm -U : mettre à jour

-vh : En mode verbeux, et avec une barre de progression.

rpm -E %{macro} : donne la valeur de la macro ( rpm -E %{_lib} )





URPM : User RPM







Mageia utilise URPM (hérité de Mandriva, utilisé aussi dans ROSA et OpenMandriva)

Fedora utilise YUM, et OpenSuse utilise zypper.



Les commandes essentielles :

urpmi => Installation et Mise à jour

urpmq => Recherche

urpme => Suppression





Concept de build : RPM, SRPM









Un RPM, c'est un paquetage binaire ou métapaquetage.







Le métapaquetage : Le plus simple, suite de dépendances.

Un paquetage binaire est un fichier qui contient tous les fichiers appartenant à une certaine application (ou bibliothèque). Un peu à la manière d'une archive TAR (ou ZIP). Mais le paquetage n'est pas seulement une archive (compressée), il contient aussi des scripts de contrôle. Ces scripts sont lus, exécutés et stockés lors de l'installation locale du RPM. Ils gèrent l'installation, la désinstallation, les contrôles d'état, les dépendances etc.





Un SRPM, c'est un paquetage source.







Un paquetage source contient le code source de l'application, les éventuels patchs, et le fichier SPEC.





Ce qu'il faut comprendre







La création d'un paquet binaire consiste à compiler le programme sur une machine, à partir du code source. Nécessite bien souvent de connaître le langage de programmation. Google est notre ami sinon.

On y applique parfois des patchs.

On en produit un fichier RPM.



Compilation = long + chercher les dépendances etc...



Avantage du RPM, apporter à l'utilisateur un paquet tout fait, qui s'installe rapidement.



Attention : Si compile sur machine 32bits, c'est un RPM 32bits généré. (Idem 64bits). Impossible de faire des RPM32 sur PC 64bits (mais dépendances 32bits OK). Sauf paquets noarch.





Installer les prérequis







Besoin de plusieurs outils :

  • rpm et urpmi : Logique pour faire des paquets mais déjà installé par défaut.
  • rpm-build : Contient les scripts et exécutables pour compiler des paquets RPM.
  • rpm-sign : Sert à signer ses paquets RPM
  • rpmlint et rpmlint-mageia-policy : Vérificateur de paquets RPM
  • rpmdevtools : Outils de développement RPM





Se déconnecter de root, car pas besoin de droits root pour compiler.





Créer les répertoires requis







Créer l'arborescence :

Copier vers le presse-papierCode BASH :
mkdir -p ~/rpmbuild/{BUILD,RPMS/{i586,noarch,x86_64},SOURCES,SRPMS,SPECS}




Vérifier :

Copier vers le presse-papierCode BASH :
tree rpmbuild 
rpmbuild 
|-- BUILD 
|-- RPMS 
|   |-- i586 
|   |-- noarch 
|   `-- x86_64 
|-- SOURCES 
|-- SPECS 
|-- SRPMS 




  • ~/rpmbuild/BUILDROOT : émulation du / pour compiler les paquets (Fake-root)
  • ~/rpmbuild/BUILD : dossier où se fait la compilation des sources.
  • ~/rpmbuild/RPMS : contient les répertoires, un par architecture, qui contiendront les paquetages binaires générés.
  • ~/rpmbuild/RPMS/i586 : le répertoire où seront stockés les paquetages binaires 32bits.
  • ~/rpmbuild/RPMS/x86_64 : le répertoire où seront stockés les paquetages binaires 64bits.
  • ~/rpmbuild/RPMS/noarch : le répertoire où seront stockés les paquetages binaires indépendants de l'architecture du processeur (Exemples thèmes, fond d'écran...)
  • ~/rpmbuild/SOURCES : contient les fichiers sources (par exemple monpaquetage.tar.bz2 ).
  • ~/rpmbuild/SPECS : contient les fichiers spec que nous devons écrire.
  • ~/rpmbuild/SRPMS : RPM sources après la construction. (pas d'architecture)











Structure d'un fichier SPEC







Créer un fichier spec : test.spec

Pour plus de simplicité (et fichier pré-rempli) :

Copier vers le presse-papierCode BASH :
rpmdev-newspec test




Décortiquer les sections SPEC :



En vert, les valeurs minimum requises pour effectuer la compilation d'un RPM



  • %global var val : variable globale
  • Name : nom du paquet
  • Version : version du paquet
  • Release : Révision du paquet (%mkrel 1)
  • Summary : Résumé du paquet
  • License : Type de License
  • Group : Groupe de tri des paquets https://wiki.mageia.org/en/RPM_groups_policy (Pour classer dans le CCM).
  • URL : Lien de téléchargement du logiciel empaqueté
  • Source0 : Premier fichier source
  • Patch0 : Premier fichier patch
  • BuildRequires : Paquetages requis pour la compilation du paquet RPM.
  • BuildConflicts : Paquetages en conflits pour la compilation du paquet RPM.
  • Requires : Paquetages requis pour l'utilisation du RPM (dépendances)
  • %{_lib} = lib si 32bits, lib64 si 64bits.
  • Suggests : Paquets suggérés à l'installation (pas orphelins si paquet désinstallé)
  • Obsoletes : Paquets obsolètes à proposer de désinstaller
  • Conflicts : Paquets en conflits avec celui qu'on créée
  • %description : Description complète du paquet
  • %prep : section de préparation à la compilation (créé le dossier ~/rpmbuild/BUILD)
  • %setup -q (silencieux) (-n name si le nom du rpm est différent du dossier source) (-a 1 = Source1 si pas de -a = Source0) : Extraction du zip
  • %patch0 -p1 : Applique le patch0 avec la commande patch
  • %build : section de compilation (compilation réelle du logiciel dans ~/rpmbuild/BUILD)
  • %configure : = ./configure avec des options (more /etc/rpm/macros.d/20build.macros)
  • %make = make (avec les -j qui vont bien )
  • %install : section où on installe les fichiers dans l'arborescence simulée ( ~/rpmbuild/BUILDROOT)
  • %make_install = make install
  • %pre : ce script s'exécute juste avant l'installation du paquetage sur le système.
  • %post : ce script s'exécute juste après l'installation du paquetage sur le système.
  • %preun : ce script s'exécute juste avant la désinstallation du paquetage du système.
  • %postun : ce script s'exécute juste après la désinstallation du paquetage du système.
  • %clean : un rm -rf $RPM_BUILD_ROOT est exécuté pour « nettoyer » un dossier éventuellement encore plein.
  • %files : liste des fichiers qui seront empaquetés dans le RPM
  • %doc : manpages, README et autres
  • %changelog : Section où on renseigne les versions et révisions.

    * Mon Jan 13 2014 adriend <adriend@email.com> version-revision.mga3

    + Revision: 1

    - New RPM Package










Quelques macros utiles







Macro Correspondance
%{buildroot} /home/$USER/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64
%{_bindir} /usr/bin
%{_datadir} /usr/share
%{_prefix} / %{_usr} /usr
%{_lib} lib / lib64
%{_libdir} /usr/lib ou /usr/lib64
%{_mandir} /usr/share/man
%{_sbindir} /usr/sbin
%{_sysconfdir} /etc
%{_usrsrc} /usr/src
%{_var} /var








Fichier RPM Macros







C'est dedans que sont définies toutes les macros %make %configure %mkrel

Dossier des macros génériques : /etc/rpm/macros.d/ (Variables Mageia dans Default.macros)



On peut réécrire ces macros via ~/.rpmmacros



Exemple :



Copier vers le presse-papierCode BASH :
%distsuffix = .coagul






Création d'un paquet vide







Création d'un fichier coagul-vide.spec



Copier vers le presse-papierCode :
rpmdev-newspec coagul-vide




Copier vers le presse-papierCode BASH :
Name:        coagul-vide
Version:    1
Release:    %mkrel 1
Summary:    Empty RPM for testing
 
License:    GPLv2
URL:        http://www.coagul.org
 
%description
It is an empty RPM show concepts to COAGUL workshop.
 
%prep
 
%build
 
%install
 
%files
 
%doc
 
 
 
%changelog
* Tue Jan 14 2014 adriend <adriend> 1-1.mga3
- New RPM Package




On quitte et on lance la compilation.



Utilisation de rpmbuild -ba : pour compiler un RPM + SRPM à partir d'un fichier SPEC

Copier vers le presse-papierCode BASH :
rpmbuild -ba coagul-vide.spec




Vérifier son RPM et son SRPM avec la commande rpmlint



On corrige les erreurs :



Pour le groupe (Classement dans le CCM):

Copier vers le presse-papierCode :
Group : Sciences/Other




On en profite pour augmenter la révision de 1 :

Copier vers le presse-papierCode :
Release:    %mkrel 2




Et on renseigne le changelog

Copier vers le presse-papierCode :
* Tue Jan 14 2014 adriend <adriend> 1-2.mga3
+ Revison 2
- Correct SPEC file : add Group field




Pour le Packager : C'est toujours le même.

On peut le définir dans le .rpmmacros

Copier vers le presse-papierCode :
%packager       AdrienD <adriend@email.com>








METAPAQUET : task-coagul







Mise en situation.

Ajouter les dépendances pour installer en un clic des applications qu'on a besoin. Il n'y a que des Requires.



Fichier task-coagul.spec final :



Copier vers le presse-papierCode :
Name:           task-coagul
Version:        1
Release:        %mkrel 2

License:        GPLv2
URL:           http://www.coagul.org

Summary:        Meta-Package for COAGUL apps
Group:          Sciences/Other

Requires:       thunderbird thunderbird-fr
Requires:       clementine
Requires:       smplayer
#Requires:      paquet-qui-est-introuvable


BuildArch:       noarch

%description
It's a task package to install quickly all
applications for COAGUL needs.

%prep

%build

%install

%files




%changelog

* Tue Jan 14 2014 adriend <adriend> 1-2.mga3
- Remove Requires : paquet-qui-est-introuvable because doesn't exists

* Tue Jan 14 2014 adriend <adriend> 1-1.mga3
- New RPM Package








PAQUET : 2 RPM dans un SPEC







Fichier task-coagul.spec final :



Copier vers le presse-papierCode :
Name:        task-coagul
Version:    1    
Release:    %mkrel 1

License:    GPLv2
URL:        [url=http://www.coagul.org]http://www.coagul.org[/url]

Summary:    Meta-Package for COAGUL apps
Group:    Sciences/Other

BuildArch:    noarch

#Requires:    task-coagul-web
#Requires:    task-coagul-multimedia


%description
It's a task package to install quickly all
applications for COAGUL needs.


%files


%package -n task-coagul-web
Summary:    Meta-Package for COAGUL Network apps
Group:        Networking/Other


Requires:    thunderbird thunderbird-fr
Requires:    pidgin



%description -n task-coagul-web
It's a task package to install quickly all
web applications for COAGUL needs.

%package -n task-coagul-multimedia
Summary:    Meta-Package for COAGUL Multimedia apps
Group:        Sound/Players

Requires:    smplayer
Requires:    clementine


%description -n task-coagul-multimedia
It's a task package to install quickly all
multimedia applications for COAGUL needs.

%files -n task-coagul-web

%files -n task-coagul-multimedia


%changelog


* Tue Jan 14 2014 adriend <adriend> 2-1.mga3
- Split meta package in 2 RPMS

* Tue Jan 14 2014 adriend <adriend> 1-2.mga3
- Remove Requires : paquet-qui-est-introuvable because doesn't exists

* Tue Jan 14 2014 adriend <adriend> 1-1.mga3
- New RPM Package








PAQUET : créer pxz







On ne fait que l'étape %prep (~/rpmbuild/BUILD)

Copier vers le presse-papierCode BASH :
rpmbuild -bp pxz.spec




On fait %prep et %build (~/rpmbuild/BUILD)

Copier vers le presse-papierCode BASH :
rpmbuild -bc pxz.spec




On fait %prep et %build et %install (~/rpmbuild/BUILDROOT)

Copier vers le presse-papierCode BASH :
rpmbuild -bi pxz.spec




On regarde les fichiers qui sont à installer, puis on les note dans la section %file



Fichier pxz.spec final :

Copier vers le presse-papierCode :
%global git_date 20100608

Name:        pxz
Version:    4.999.9
Release:    %mkrel 1
Summary:    Parallel LZMA compressor using XZ
License:    GPLv2+
Group:        Archiving/Compression
Source0:    %{name}-%{version}beta.%{git_date}git.tar.xz
URL:        [url=http://jnovy.fedorapeople.org/pxz]http://jnovy.fedorapeople.org/pxz[/url]

BuildRequires:    liblzma-devel
BuildRequires:    libgomp-devel


%description
Parallel XZ is a compression utility which can use 
multiple cores and processors.

%prep
%setup -q  -n %{name}-%{version}beta

%build
%make

%install
%make_install

%files
%{_mandir}/man1/pxz*
%{_bindir}/pxz


%changelog

* Tue Jan 14 2014 adriend <adriend> 4.999.9-1.mga3
- New RPM Package for COAGUL's workshop






PAQUET : Mise à jour de SMPLayer







Pour plus de simplicité et de rapidité, le tout a été soigneusement mis à disposition.

On récupère le RPM SOURCE de SMPlayer : smplayer-0.8.2-2.mga3.src.rpm : ftp://fr2.rpmfind.net/linux/mageia/distrib/3/SRPMS/smplayer-0.8.2-2.mga3.src.rpm

On récupère les nouvelles sources du logiciel : smplayer-0.8.6.tar.bz2



On édite le SPEC en y mettant la nouvelle version, modifier la révision.

Copier vers le presse-papierCode :
Version:    0.8.6
Release:    %mkrel 1




Copier vers le presse-papierCode :
On modifie le changelog
* Tue Jan 14 2014 adriend <adriend> 0.8.6-1.mga3
- Update to version 0.8.6




Au passage, il est possible de spécifier une verson minimale de prérequis :

Copier vers le presse-papierCode :
BuildRequires:    qt4-devel    >= 4:4.2.0




On tente de fabriquer le paquet.



Copier vers le presse-papierCode BASH :
su -c 'urpmi –buildrequires smplayer.spec'




Copier vers le presse-papierCode BASH :
rpmbuild -ba smplayer.spec




Le paquet ne parvient pas à se créer, nous avons une erreur :



Copier vers le presse-papierCode :
Erreur de construction de RPM :
    Fichier(s) installé(s) (mais non empaquetés) :
   /usr/share/smplayer/translations/smplayer_he_IL.qm
   /usr/share/smplayer/translations/smplayer_ms_MY.qm
   /usr/share/smplayer/translations/smplayer_th.qm




Trois nouvelles traductions ont été ajoutées. Elles sont donc présentes dans notre dossier BUILDROOT, mais non spécifiés dans la section %files.



Copier vers le presse-papierCode :
%lang(he_IL) %{_datadir}/%{name}/translations/smplayer_he_IL.qm
%lang(ms_MY) %{_datadir}/%{name}/translations/smplayer_ms_MY.qm
%lang(th) %{_datadir}/%{name}/translations/smplayer_th.qm






Cet exemple marque certains fichiers comme étant seulement de l'utilisation des langues particulières, telles que pl pour le texte polonais et fr pour le texte français.



On relance la compilation

Copier vers le presse-papierCode BASH :
rpmbuild -ba smplayer.spec






PAQUET : pigz (avec patch)







On télécharge la source sur le site : pigz-2.3.tar.gz

On se un SPEC.

Copier vers le presse-papierCode :
Name:        pigz
Version:    2.3
Release:    %mkrel 1
Summary:    Parallel GZ compressor
License:    zlib
Group:        Archiving/Compression
URL:            http://www.zlib.net/pigz/
Source0:        %{name}-%{version}.tar.gz

BuildRequires:    zlib-devel


%description
Parallel GZ is a compression utility which can use 
multiple cores and processors.

%prep
%setup -q

%build
%make

%install

%files


%changelog

* Tue Jan 14 2014 adriend <adriend> 2.3-1.mga3
- New RPM Package for COAGUL's workshop




On teste la section %prep :

Copier vers le presse-papierCode BASH :
rpmbuild -bp pigz.spec




RAS.



On tente la compilation du programme :

Copier vers le presse-papierCode BASH :
rpmbuild -bc pigz.spec 




Erreur :

Copier vers le presse-papierCode :
cc -o pigz pigz.o yarn.o zopfli/deflate.o zopfli/blocksplitter.o zopfli/tree.o zopfli/lz77.o zopfli/cache.o zopfli/hash.o zopfli/util.o zopfli/squeeze.o zopfli/katajainen.o -lpthread -lz
zopfli/tree.o: dans la fonction « CalculateEntropy »:
tree.c:(.text+0x183): référence indéfinie vers « log »
tree.c:(.text+0x1ee): référence indéfinie vers « log »
tree.c:(.text+0x252): référence indéfinie vers « log »




Je ne suis pas un pro du C mais => Problème de compilation.

Recherche Internet (un développeur sait comment compiler son programme)

Il faut éditer le Makefile. On doit donc créer un PATCH.



Pour l'éditer, décompressons le fichier de sources

Copier vers le presse-papierCode BASH :
cd ~/rpmbuild/SOURCES/
tar xzf pigz-2.3.tar.gz
cd  pigz-2.3
cp Makefile Makefile.ori
vim Makefile




On édite la ligne, et on ajoute -lm

Copier vers le presse-papierCode :
$(CC) -o pigz $^ -lpthread -lz -lm




On créé notre patch :

Copier vers le presse-papierCode BASH :
diff -rus Makefile.ori Makefile > ../pigz-2.3-fix-lz.patch
cd ..
rm -rf pigz-2.3




On ajoute notre patch dans le SPEC :

Copier vers le presse-papierCode :
Patch0:        pigz-2.3-fix-lz.patch




Et dans la section %prep, on ajoute notre action de patcher :

Copier vers le presse-papierCode :
%patch0 -p0




On vérifie que notre patch s'applique bien :

Copier vers le presse-papierCode BASH :
rpmbuild -bp pigz.spec




On relance la compilation :

Copier vers le presse-papierCode BASH :
rpmbuild -bc pigz.spec




RAS



On regarde dans ~/rpmbuild/BUILD/pigz-2.3/ nos exécutables sont compilés.

On renseigne la section install où on installe nos fichiers dans BUILDROOT

Copier vers le presse-papierCode :
%install
install -D -m755 %{name} %{buildroot}%{_bindir}/%{name}
install -D -m755 unpigz %{buildroot}%{_bindir}/unpigz
install -D -m644 %{name}.1 %{buildroot}%{_datadir}/man/man1/%{name}.1




Mais aussi les fichiers du RPM :

Copier vers le presse-papierCode :
%files
%{_bindir}/%{name}
%{_bindir}/unpigz
%{_datadir}/man/man1/%{name}.*




Et on lance la compilation de la totale :

Copier vers le presse-papierCode BASH :
rpmbuild -ba pigz.spec




Voila à la fin le SPEC

Copier vers le presse-papierCode :
Name:        pigz
Version:    2.3
Release:    %mkrel 1
Summary:    Parallel GZ compressor
License:    zlib
Group:        Archiving/Compression
URL:            http://www.zlib.net/pigz/
Source0:        %{name}-%{version}.tar.gz
Patch0:        pigz-2.3-fix-lz.patch

BuildRequires:    zlib-devel


%description
Parallel GZ is a compression utility which can use 
multiple cores and processors.

%prep
%setup -q
%patch0 -p0

%build
%make

%install
install -D -m755 %{name} %{buildroot}%{_bindir}/%{name}
install -D -m755 unpigz %{buildroot}%{_bindir}/unpigz
install -D -m644 %{name}.1 %{buildroot}%{_datadir}/man/man1/%{name}.1

%files
%{_bindir}/%{name}
%{_bindir}/unpigz
%{_datadir}/man/man1/%{name}.*


%changelog

* Tue Jan 14 2014 adriend <adriend> 2.3-1.mga3
- New RPM Package for COAGUL's workshop






PAQUET : Scripts COAGUL







On se rend dans le dossier SOURCES

git clone git://gitorious.org/c-scripts/c-scripts.git



On se créé une arcgive tar.gz des scripts

tar czvf c-scripts-2014.01.14.tar.gz c-scripts



On supprime notre git-clone :



Copier vers le presse-papierCode BASH :
rm -rf c-scripts




On fait ensuite notre SPEC.

(On se fait une instruction BASH dans la section %install pour le fun)



Copier vers le presse-papierCode :
Name:           c-scripts
Version:        2014.01.14
Release:        %mkrel 1
Summary:        COAGUL's bash scripts
License:        GPLv2+
Group:          Office/Utilities
Source0:        %{name}-%{version}.tar.gz
URL:            https://gitorious.org/c-scripts

%description
Various scripts created by COAGUL's members

%prep
%setup -q -n %{name}

%build

%install
list=" homogene impressionListeDossiers partageConnexion retaille"
for fic in $list
do
        install -D -m755 bash/$fic %{buildroot}%{_bindir}/$fic
done

%files

%{_bindir}/homogene
%{_bindir}/impressionListeDossiers
%{_bindir}/partageConnexion
%{_bindir}/retaille


%changelog

* Tue Jan 14 2014 adriend <adriend> 2014.01.14-1.mga3
- New RPM Package for COAGUL's workshop








Créer son dépôt RPM





Il est important de bien structurer les futurs dépôts.

Par exemple, lorsque j'ai créé l'arborescence des dépôts MLO, voici comment j'ai fait :



Copier vers le presse-papierCode BASH :
tree -d /media/mlo/Mageia/3
 
/media/mlo/Mageia/3
|-- i586
|   |-- core
|   |   |-- media_info
|   |-- nonfree
|   |   |-- media_info
|   |-- tainted
|       |-- media_info
|-- SRPMS
|   |-- core
|   |   |-- media_info
|   |-- nonfree
|   |   |-- media_info
|   |-- tainted
|       |-- media_info
|-- Testing
|-- x86_64
    |-- core
    |   |-- media_info
    |-- nonfree
    |   |-- media_info
    |-- tainted
        |-- media_info








Nous, on va tout mettre dans le même dépôt.



Installons un serveur HTTP:



Copier vers le presse-papierCode BASH :
urpmi apache2




Copier vers le presse-papierCode BASH :
mkdir /var/www/html/rpm




On démarre le service httpd :

Copier vers le presse-papierCode BASH :
systemctl start  httpd.service




On vérifie qu'il est lancé :

Copier vers le presse-papierCode BASH :
systemctl status httpd.service




on déplace nos RPM's dans le dossier de notre serveur web :

Copier vers le presse-papierCode BASH :
cd /var/www/html/rpm
cp /home/adrien/rpmbuild/RPMS/*/*.rpm .




On génère les médias :

Copier vers le presse-papierCode BASH :
genhdlist2 --xml-info --allow-empty-media .




  • changelog.xml.lzma : Ce fichier XML (compressé) contient l'ensemble des modifications des paquets présents dans le dépôt (Il recense toutes les lignes du fichier SPEC du pavé %changelog)
  • files.xml.lzma : Ce fichier XML (compressé) contient l'ensemble des fichiers présents dans chaque paquet RPM présents dans le dépôt Il recense toutes les lignes du fichier SPEC du pavé %files)
  • hdlist.cz : Synthèse des fichiers RPM présents dans le dépôt
  • info.xml.lzma : Ce fichier XML (compressé) contient l'ensemble des descriptions dans chaque paquet RPM présents dans le dépôt Il recense toutes les lignes du fichier SPEC du pavé %description)
  • MD5SUM : Ce fichier contient les sommes MD5 des fichiers présents dans ici pour s'assurer de leur intégrité.
  • synthesis.hdlist.cz : Synthèse des fichiers RPM présents dans le dépôt







On ajoute notre dépôt :

Copier vers le presse-papierCode BASH :
urpmi.addmedia COAGUL http://127.0.0.1/rpm/
ajout du média « COAGUL »
   http://127.0.0.1/rpm/media_info/synthesis.hdlist.cz




On « urpmise » un paquet du dépôt, ça fonctionne.



Copier vers le presse-papierCode BASH :
urpmi coagul-vide
 
 
    http://127.0.0.1/rpm/coagul-vide-1-2.mga3.x86_64.rpm
installation de coagul-vide-1-2.mga3.x86_64.rpm depuis /var/cache/urpmi/rpms   
Préparation...                   #############################################
      1/1: coagul-vide           #############################################
 




On les voit aussi dans le CCM si on effectue une recherche d'un paquet de notre dépôt.



On va mettre à jour un de nos paquet :



On édite coagul-vide.spec et on le met à jour en incrémentant la release ou la version :



Copier vers le presse-papierCode :
Release:        %mkrel 3




Copier vers le presse-papierCode :
* Tue Jan 14 2014 adriend <adriend> 1-3.mga3
+ Revison 3
- Fake Update




On recompile le RPM



Copier vers le presse-papierCode BASH :
rpmbuild -ba coagul-vide.spec 




On le déplace dans notre dépôt :



Copier vers le presse-papierCode BASH :
cp ~/rpmbuild/RPMS/x86_64/coagul-vide-1-3.mga3.x86_64.rpm /var/www/html/rpm/




On regénère les médias :



Copier vers le presse-papierCode BASH :
cd /var/www/html/rpm/




Copier vers le presse-papierCode BASH :
genhdlist2 --xml-info --allow-empty-media .
 
filtering ./media_info/hdlist.cz into hdlist.cz.tmp
adding 1 new rpms not available in existing hdlist
replacing ./media_info/hdlist.cz with hdlist.cz.tmp
replacing ./media_info/synthesis.hdlist.cz with synthesis.hdlist.cz.tmp
replacing ./media_info/info.xml.lzma with info.xml.lzma.tmp
replacing ./media_info/files.xml.lzma with files.xml.lzma.tmp
replacing ./media_info/changelog.xml.lzma with changelog.xml.lzma.tmp
updating ./media_info/MD5SUM




Tester la mise à jour et voir que notre média paquet se met à jour et trouve le nouveau paquet.



Copier vers le presse-papierCode BASH :
urpmi --auto-update




Copier vers le presse-papierCode :
le média « Core Release » est à jour
le média « Core Updates » est à jour                                            
le média « Nonfree Release » est à jour
le média « Nonfree Updates » est à jour
le média « Tainted Release » est à jour
le média « Tainted Updates » est à jour
le média « Core 32bit Release » est à jour
le média « Core 32bit Updates » est à jour                                     
le média « Nonfree 32bit Release » est à jour
le média « Nonfree 32bit Updates » est à jour
le média « Tainted 32bit Release » est à jour
le média « Tainted 32bit Updates » est à jour
    http://127.0.0.1/rpm/media_info/synthesis.hdlist.cz
média « COAGUL » mis à jour                                                    
Pour satisfaire les dépendances, les paquetages suivants vont être installés :
  Paquetage                      Version      Révision      Arch  
(média « COAGUL »)
  coagul-vide                    1            3.mga3        x86_64  
un espace additionnel de 0Mo sera utilisé.
1Mo de paquets seront récupérés.
Procéder à l'installation ? (O/n) O

installation de coagul-vide-1-3.mga3.x86_64.rpm depuis /var/cache/urpmi/rpms
Préparation...                   #############################################
      1/1: coagul-vide           #############################################
      1/1: désinstallation de coagul-vide-1-2.mga3.x86_64
                                 #############################################




L'ancien paquet est désinstallé.



A noter :

La commande genhdlist n'est disponible que chez Mageia.

Si les RPM sont sur un serveur tiers et qu'on y a accès en SSH, monter un sshfs depuis notre Mageia :



On installe le paquet sshfs-fuse

Copier vers le presse-papierCode RUBY :
urpmi sshfs-fuse




On monte notre répertoire distant dans notre arborescence locale. Exemple avec un serveur Web sur Gentoo :

Copier vers le presse-papierCode BASH :
mkdir ~/sshfs
sshfs adrien@monserveur:/home/adrien/public_html/rpm ~/sshfs




Une fois terminé, on démonte notre sshfs :

Copier vers le presse-papierCode BASH :
fusermount -u /home/adrien/sshfs








Signer ses paquets RPM







Pour signer ses paquets, on doit créer une paire de clés avec GPG.





Créer son jeu de clé GPG







On regarde dans un premier temps si le paquet gnupg est installé :

Copier vers le presse-papierCode BASH :
rpm -qa gnupg




S'il n'y est pas, on l'installe (en root)

Copier vers le presse-papierCode BASH :
urpmi gnupg




On revient utilisateur classique.



On créé ensuite notre clé GPG

Copier vers le presse-papierCode BASH :
gpg --gen-key




La console nous demande plusieurs étapes :



Utiliser une clé RSA (choix 1 par défaut)



Copier vers le presse-papierCode :
Sélectionnez le type de clef désiré : 
   (1) RSA et RSA (par défaut) 
   (2) DSA et Elgamal 
   (3) DSA (signature seule) 
   (4) RSA (signature seule) 
Quel est votre choix ? 1 




Utiliser une taille de clé de 2048bits (valeur par défaut)



Copier vers le presse-papierCode :
les clefs RSA peuvent faire entre 1024 et 4096 bits de longueur. 
Quelle taille de clef désirez-vous ? (2048) 
La taille demandée est 2048 bits 




Ensuite, saisir ses informations

Copier vers le presse-papierCode :
Nom réel : Adrien D 
Adresse électronique : adriend@email.com
Commentaire : 
Vous avez sélectionné cette identité : 
    « Adrien D <adriend@email.com> » 

Faut-il modifier le (N)om, le (C)ommentaire, l'(A)dresse électronique 
ou (O)ui/(Q)uitter ? O 




Une phrase de passe est nécessaire pour protéger la clef secrète (c'est une phrase de passe pour la clé privée). La saisir deux fois.



Copier vers le presse-papierCode :
Entrez la phrase de passe :




Et voila, la paire de clés est créée.



Copier vers le presse-papierCode :
gpg: /home/adrien/.gnupg/trustdb.gpg : base de confiance créée 
gpg: clef CC3C29B3 marquée de confiance ultime. 
les clefs publique et secrète ont été créées et signées. 

gpg: vérification de la base de confiance 
gpg: 3 marginale(s) nécessaire(s), 1 complète(s) nécessaire(s), 
     modèle de confiance PGP 
gpg: profondeur : 0  valables :   1  signées :   0 
     confiance : 0 i., 0 n.d., 0 j., 0 m., 0 t., 1 u. 
pub   2048R/CC3C29B3 2014-04-12 
 Empreinte de la clef = 0862 DD52 89A5 B35A F267  E3D4 9DDD 7561 CC3C 29B3 
uid                  Adrien D <adriend@email.com> 
sub   2048R/1B007B0C 2014-04-12 




Il se peut qu'il soit utile de générer de l'entropie :



Copier vers le presse-papierCode :
De nombreux octets aléatoires doivent être générés. Vous devriez faire 
autre chose (taper au clavier, déplacer la souris, utiliser les disques) 
pendant la génération de nombres premiers ; cela donne au générateur de 
nombres aléatoires une meilleure chance d'obtenir suffisamment d'entropie. 

Il n'y a pas suffisamment d'octets aléatoires disponibles. Veuillez faire 
autre chose pour que le système d'exploitation puisse rassembler plus 
d'entropie (186 octets supplémentaires sont nécessaires). 
.....+++++ 
.+++++ 




Si on a besoin de générer de l'entropie, faire dans une autre console

Copier vers le presse-papierCode BASH :
find / -exec md5sum {} \ ;




On exporte ensuite notre clé publique :

Copier vers le presse-papierCode BASH :
gpg --export -a adriend@email.com > pubkey 




On peut exporter aussi notre clé privée, si on souhaite la réimporter sur un autre système :

Copier vers le presse-papierCode BASH :
gpg --export-secret-keys -a adriend@email.com > privkey




Que l'on réimporte ainsi sur le nouveau système :

Copier vers le presse-papierCode BASH :
gpg --import –allow-secret-key-import privkey




On importe notre clé dans la base RPM pour pouvoir signer nos paquets :

Copier vers le presse-papierCode BASH :
su -c 'rpm --import pubkey'






Signature du paquet





On tente donc de signer un de nos RPM ou SRPM :

Copier vers le presse-papierCode BASH :
rpmsign --addsign rpmbuild/SRPMS/coagul-vide-1-3.mga3.src.rpm 




Une erreur nous est retournée :

Vous devez affecter une valeur à "%_gpg_name" dans votre fichier de macros



En effet, il se peut qu'on ait plusieurs clés pour signer. On doit compléter le ~/.rpmmacros avec la clé à utiliser :



Copier vers le presse-papierCode :
%_signature gpg
%_gpg_path /home/adrien/.gnupg
%_gpg_name Adrien D <adriend@email.com>
%_gpgbin /usr/bin/gpg
%packager        Adrien D <adriend@email.com>




Ensuite, on tente de signer à nouveau :



Copier vers le presse-papierCode BASH :
rpmsign --addsign rpmbuild/SRPMS/coagul-vide-1-3.mga3.src.rpm
Entrez la phrase de passe : 
Phrase de passe bonne. 
rpmbuild/SRPMS/coagul-vide-1-3.mga3.src.rpm:  




Et voila, notre RPM est signé.

Copier vers le presse-papierCode BASH :
rpmlint rpmbuild/SRPMS/coagul-vide-1-3.mga3.src.rpm coagul-vide.src: W: 
1 packages and 0 specfiles checked; 0 errors, O warnings. 




Le Warning no-signature a disparu.





Oui, mais faire ça sur tous les RPM et SRPM, c'est relou non ?

On peut signer tous les RPM et SRPM générés via rpmbuild en ajoutant l'option -sign :



Copier vers le presse-papierCode BASH :
rpmbuild -ba -sign rpmbuild/SPECS/coagul-vide.spec 




A la fin de la création du RPM, la phrase de passe nous est demandée et elle va signer tous les paquets :





Copier vers le presse-papierCode :
+ exit 0 
Entrez la phrase de passe : 
Phrase de passe bonne. 
/home/adrien/rpmbuild/SRPMS/coagul-vide-1-3.mga3.src.rpm: 
/home/adrien/rpmbuild/RPMS/x86_64/coagul-vide-1-3.mga3.x86_64.rpm: 




Si on se trompe, on est bon pour recompiler le paquet.





Mettre à disposition sa clé publique dans son dépôt







Maintenant, si on a notre dépôt, avec nos paquets signés, si on essaie de les installer une erreur est retournée :

Copier vers le presse-papierCode :
urpmi coagul-vide 


    http://10.21.27.127/rpm/coagul-vide-1-3.mga3.x86_64.rpm
Le paquetage suivant a une signature invalide:                                 
/var/cache/urpmi/rpms/coagul-vide-1-3.mga3.x86_64.rpm: Media sans clé (OK ((none))) 
Voulez-vous continuer l'installation ? (o/N) 




Pour cela, il suffit de mettre sa clé publique dans le dossier media_info, et que son nom soit pubkey :



Copier vers le presse-papierCode BASH :
ls -c1 media_info/ 
 
pubkey 
changelog.xml.lzma 
files.xml.lzma 
hdlist.cz 
info.xml.lzma 
MD5SUM 
synthesis.hdlist.cz 




La clé s'importe quand le dépôt est ajouté, avec une demande de confirmation.

Si on a déjà configuré notre dépôt et que la clé publique n'était pas présente, le premier paquet à installer nous donnera le message d'avertissement, mais importera la clé au passage.



On peut vérifier que la clé est bien importée dans la Mageia locale :



Copier vers le presse-papierCode BASH :
rpm -qa gpg-pubkey* --last
gpg-pubkey-cc3c29b3-53493ec2                  sam. 12 avril 2014 15:58:56 CEST 
gpg-pubkey-80420f66-4d4fe123                  lun. 07 avril 2014 15:06:07 CEST 




En fonction de la date d'ajout, on regarde le détail de la clé GPG et on retrouve bien notre clé :



Copier vers le presse-papierCode BASH :
rpm -qi gpg-pubkey-cc3c29b3-53493ec2 | more 
 
Name        : gpg-pubkey 
Version     : cc3c29b3 
Release     : 53493ec2 
Architecture: (none) 
Install Date: sam. 12 avril 2014 15:58:56 CEST 
Group       : Public Keys 
Size        : 0 
License     : pubkey 
Build Date  : sam. 12 avril 2014 15:25:22 CEST 
Build Host  : localhost 
Relocations : (not relocatable) 
Packager    : Adrien D <adrien@email.com> 
Summary     : gpg(Adrien D <adrien@email.com>) 
Description : 




Pour les fous de la ligne de commande, qui veulent aller plus vite que taper la référence de la clé GPG en fonction de la dernière ajoutée :



Copier vers le presse-papierCode BASH :
rpm -qi $(rpm -qa gpg-pubkey* --last | head -n1 | cut -d" " -f1 )








Merci de votre attention