Conférence COAGUL : Initiation à la mise en paquet RPM
Table des matières
Avoir accès à Internet (ou à la copie locale des miroirs Mageia 3)
Une machine virtuelle Mageia3 (32bits) (ou récupérer l'image OVA fabriquée) en pont.
Avoir Virtualbox installé sur son PC
Avoir à disposition le script d'ajout de miroir local (si dans 1. la copie locale est utilisée)
Distribuer la machine virtuelle.
Montrer comment importer. (Réinitialiser l'adresse MAC ! )
Ajouter processeurs /2.
Mettre ~2Go de RAM à la machine, pas plus de 50 % de la RAM.
Être en interface par pont sur la carte Ethernet.
Clic droit sur le net applet, Configurer le réseau. Filaire (Ethernet) => Suivant tout le temps.
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"
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} )
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
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 paquetage source contient le code source de l'application, les éventuels patchs, et le fichier SPEC.
La création d'un paquet binaire consiste à compiler le programme sur une machine, à partir du code source. Nécessite bien souvent de connaitre 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.
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 : Facultatif pour COAGUL, mais 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 l'arborescence :
mkdir -p ~/rpmbuild/{BUILD,RPMS/{i586,noarch,x86_64},SOURCES,SRPMS,SPECS}
Vérifier :
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)
Créer un fichier spec : test.spec
Pour plus de simplicité (et fichier pré-rempli) :
rpmdev-newspec test
Décortiquer les sections SPEC :
%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 (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) un rm -rf $RPM_BUILD_ROOT est exécuté pour « nettoyer » un dossier éventuellement encore plein)
%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 :
%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 <[email protected]> version-revision.mga3
+ Revision: 1
- New RPM Package
%{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
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 :
%distsuffix = .coagul
Création d'un fichier coagul-vide.spec
rpmdev-newspec coagul-vide
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
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):
Group : Sciences/Other
On en profite pour augmenter la révision de 1 :
Release: %mkrel 1
Et on renseigne le changelog
* 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
%packager Adrien.D <[email protected]>
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 :
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
Fichier task-coagul.spec final :
Name: task-coagul
Version: 1
Release: %mkrel 1
License: GPLv2
URL: http://www.coagul.org
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
On ne fait que l'étape %prep (~/rpmbuild/BUILD)
rpmbuild -bp pxz.spec
On fait%prep et %build (~/rpmbuild/BUILD)
rpmbuild -bc pxz.spec
On fait%prep et %build et %install (~/rpmbuild/BUILDROOT)
rpmbuild -bi pxz.spec
On regarde les fichiers qui sont à installer, puis on les note dans la section %file
Fichier pxz.spec final :
%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: http://jnovy.fedorapeople.org/pxz
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
Pour plus de simplicité et de rapidité, le tout a été soigneusement mis sur le FTP.
On récupère le RPM SOURCE de SMPlayer : 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.
Version: 0.8.6
Release: %mkrel 1
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 :
BuildRequires: qt4-devel >= 4:4.2.0
On tente de fabriquer le paquet.
sudo urpmi –buildrequires smplayer.spec
rpmbuild -ba smplayer.spec
Le paquet ne parvient pas à se créer, nous avons une erreur :
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.
%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
rpmbuild -ba smplayer.spec
On télécharge la source sur le site : pigz-2.3.tar.gz
On se créé un SPEC.
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 :
rpmbuild -bp pigz.spec
RAS.
On tente la compilation du programme :
rpmbuild -bc pigz.spec
Erreur :
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 (car 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
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
$(CC) -o pigz $^ -lpthread -lz -lm
On créé notre patch :
diff -rus Makefile.ori Makefile > ../pigz-2.3-fix-lz.patch
cd ..
rm -rf pigz-2.3
On ajoute notre patch dans le SPEC :
Patch0: pigz-2.3-fix-lz.patch
Et dans la section %prep, on ajoute notre action de patcher :
%patch0 -p0
On vérifie que notre patch s'applique bien :
rpmbuild -bp pigz.spec
On relance la compilation :
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
%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 :
%files
%{_bindir}/%{name}
%{_bindir}/unpigz
%{_datadir}/man/man1/%{name}.*
Et on lance la compilation de la totale :
rpmbuild -ba pigz.spec
Voila à la fin le SPEC
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
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 :
rm -rf c-scripts
On fait ensuite notre SPEC.
(On se fait une instruction BASH dans la section %install pour le fun)
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
http://linuxtricks.asso-linux-online.fr/wiki/creer-son-propre-depot-rpm-pour-mageia
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 :
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 déjà installer un serveur FTP:
urpmi vsftpd
vim /etc/vsftpd/vsftpd.conf
On commente ipv6 et on active ipv4
listen=YES
listen_ipv6=NO
On démarre le service vsftpd :
systemctl start vsftpd.service
On vérifie qu'il est lancé :
systemctl status vsftpd
on déplace nos RPM's dans le FTP :
cd /var/ftp/pub/
cp /home/coagul/rpmbuild/RPMS/*/*.rpm .
On génère les médias :
genhdlist2 --xml-info --allow-empty-media .
On ajoute notre dépôt :
urpmi.addmedia COAGUL ftp://127.0.0.1/pub/
ajout du média « COAGUL »
ftp://127.0.0.1/pub/media_info/synthesis.hdlist.cz
On urpmise un paquet du dépôt.
On les voit aussi dans le CCM
Faire une MàJ d'un paquet, le déplacer dans /var/ftp/pub/ et régénérer les médias.
Tester la mise à jour et voir que notre paquet se met à jour.
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
urpmi sshfs-fuse
On monte notre répertoire distant dans notre arborescence locale
mkdir ~/sshfs
sshfs adrien@monserveur:/home/ftp/pub ~/sshfs
Une fois terminé, on démonte notre sshfs :
fusermount -u /home/adrien/sshfs
Pour signer ses paquets, on doit créer une paire de clés avec GPG.
On regarde dans un premier temps si le paquet gnupg est installé :
rpm -qa gnupg
S'il n'y est pas, on l'installe
urpmi gnupg
On créé ensuite notre clé GPG
gpg --gen-key
La console nous demande plusieurs étapes :
Utiliser une clé RSA (choix 1 par défaut)
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)
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
Nom réel : Adrien D
Adresse électronique : [email protected]
Commentaire :
Vous avez sélectionné cette identité :
« Adrien D <[email protected]> »
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.
┌─────────────────────────────────────────────────────────────────────┐
│ Entrez la phrase de passe │
│ C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C │
│ │
│ Phrase de passe *****************__________________________________ │
│ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────────────────────┘
Et voila, la paire de clés est créée.
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 <[email protected]>
sub 2048R/1B007B0C 2014-04-12
Il se peut qu'il soit utile de générer de l'entropie :
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
find / -exec md5sum {} \ ;
On exporte ensuite notre clé publique :
gpg --export -a [email protected] > pubkey
On peut exporter aussi notre clé privée, si on souhaite la réimporter sur un autre système :
gpg --export-secret-keys -a [email protected] > privkey
Que l'on réimporte ainsi sur le nouveau système :
gpg --import –allow-secret-key-import privkey
On importe notre clé dans la base RPM pour pouvoir signer nos paquets :
su -c 'rpm --import pubkey'
On tente donc de signer un de nos RPM ou SRPM :
rpmsign --addsign rpmbuild/SRPMS/coagul-vide-1-2.mga4.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 :
%_signature gpg
%_gpg_path /home/adrien/.gnupg
%_gpg_name Adrien D <[email protected]>
%_gpgbin /usr/bin/gpg
%packager Adrien D <[email protected]>
Ensuite, on tente de signer à nouveau :
rpmsign --addsign rpmbuild/SRPMS/coagul-vide-1-2.mga4.src.rpm
Entrez la phrase de passe :
Phrase de passe bonne.
rpmbuild/SRPMS/coagul-vide-1-2.mga4.src.rpm:
Et voila, notre RPM est signé.
rpmlint rpmbuild/SRPMS/coagul-vide-1-2.mga4.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 :
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 :
+ exit 0
Entrez la phrase de passe :
Phrase de passe bonne.
/home/adrien/rpmbuild/SRPMS/coagul-vide-1-2.mga4.src.rpm:
/home/adrien/rpmbuild/RPMS/x86_64/coagul-vide-1-2.mga4.x86_64.rpm:
Si on se trompe, on est bon pour recompiler le paquet.
Maintenant, si on a notre dépôt, avec nos paquets signés, si on essaie de les installer une erreur est retournée :
urpmi coagul-vide
http://10.21.27.127/rpm/coagul-vide-1-2.mga4.x86_64.rpm
Le paquetage suivant a une signature invalide:
/var/cache/urpmi/rpms/coagul-vide-1-2.mga4.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 :
[adrien@localhost sshfs]$ 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é.
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 :
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é :
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 <[email protected]>
Summary : gpg(Adrien D <[email protected]>
Description :
Pour les fous de la ligne de commande, qui veulent aller plus vite que taper la référence de la clé GPG :
rpm -qi $(rpm -qa gpg-pubkey* --last | head -n1 | cut -d" " -f1 )
Prérequis pour l'atelier
Avoir accès à Internet (ou à la copie locale des miroirs Mageia 3)
Une machine virtuelle Mageia3 (32bits) (ou récupérer l'image OVA fabriquée) en pont.
Avoir Virtualbox installé sur son PC
Avoir à disposition le script d'ajout de miroir local (si dans 1. la copie locale est utilisée)
Préparer la VirtualBox
Distribuer la machine virtuelle.
Montrer comment importer. (Réinitialiser l'adresse MAC ! )
Ajouter processeurs /2.
Mettre ~2Go de RAM à la machine, pas plus de 50 % de la RAM.
Être en interface par pont sur la carte Ethernet.
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 connaitre 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 : Facultatif pour COAGUL, mais 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 :
mkdir -p ~/rpmbuild/{BUILD,RPMS/{i586,noarch,x86_64},SOURCES,SRPMS,SPECS}
Vérifier :
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) :
rpmdev-newspec test
Décortiquer les sections SPEC :
%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 (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) un rm -rf $RPM_BUILD_ROOT est exécuté pour « nettoyer » un dossier éventuellement encore plein)
%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 :
%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 <[email protected]> version-revision.mga3
+ Revision: 1
- New RPM Package
Quelques macros utiles
%{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 :
%distsuffix = .coagul
Création d'un paquet vide
Création d'un fichier coagul-vide.spec
rpmdev-newspec coagul-vide
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
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):
Group : Sciences/Other
On en profite pour augmenter la révision de 1 :
Release: %mkrel 1
Et on renseigne le changelog
* 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
%packager Adrien.D <[email protected]>
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 :
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 :
Name: task-coagul
Version: 1
Release: %mkrel 1
License: GPLv2
URL: http://www.coagul.org
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)
rpmbuild -bp pxz.spec
On fait%prep et %build (~/rpmbuild/BUILD)
rpmbuild -bc pxz.spec
On fait%prep et %build et %install (~/rpmbuild/BUILDROOT)
rpmbuild -bi pxz.spec
On regarde les fichiers qui sont à installer, puis on les note dans la section %file
Fichier pxz.spec final :
%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: http://jnovy.fedorapeople.org/pxz
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 sur le FTP.
On récupère le RPM SOURCE de SMPlayer : 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.
Version: 0.8.6
Release: %mkrel 1
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 :
BuildRequires: qt4-devel >= 4:4.2.0
On tente de fabriquer le paquet.
sudo urpmi –buildrequires smplayer.spec
rpmbuild -ba smplayer.spec
Le paquet ne parvient pas à se créer, nous avons une erreur :
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.
%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
rpmbuild -ba smplayer.spec
PAQUET : pigz (avec patch)
On télécharge la source sur le site : pigz-2.3.tar.gz
On se créé un SPEC.
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 :
rpmbuild -bp pigz.spec
RAS.
On tente la compilation du programme :
rpmbuild -bc pigz.spec
Erreur :
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 (car 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
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
$(CC) -o pigz $^ -lpthread -lz -lm
On créé notre patch :
diff -rus Makefile.ori Makefile > ../pigz-2.3-fix-lz.patch
cd ..
rm -rf pigz-2.3
On ajoute notre patch dans le SPEC :
Patch0: pigz-2.3-fix-lz.patch
Et dans la section %prep, on ajoute notre action de patcher :
%patch0 -p0
On vérifie que notre patch s'applique bien :
rpmbuild -bp pigz.spec
On relance la compilation :
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
%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 :
%files
%{_bindir}/%{name}
%{_bindir}/unpigz
%{_datadir}/man/man1/%{name}.*
Et on lance la compilation de la totale :
rpmbuild -ba pigz.spec
Voila à la fin le SPEC
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 :
rm -rf c-scripts
On fait ensuite notre SPEC.
(On se fait une instruction BASH dans la section %install pour le fun)
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
http://linuxtricks.asso-linux-online.fr/wiki/creer-son-propre-depot-rpm-pour-mageia
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 :
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 déjà installer un serveur FTP:
urpmi vsftpd
vim /etc/vsftpd/vsftpd.conf
On commente ipv6 et on active ipv4
listen=YES
listen_ipv6=NO
On démarre le service vsftpd :
systemctl start vsftpd.service
On vérifie qu'il est lancé :
systemctl status vsftpd
on déplace nos RPM's dans le FTP :
cd /var/ftp/pub/
cp /home/coagul/rpmbuild/RPMS/*/*.rpm .
On génère les médias :
genhdlist2 --xml-info --allow-empty-media .
On ajoute notre dépôt :
urpmi.addmedia COAGUL ftp://127.0.0.1/pub/
ajout du média « COAGUL »
ftp://127.0.0.1/pub/media_info/synthesis.hdlist.cz
On urpmise un paquet du dépôt.
On les voit aussi dans le CCM
Faire une MàJ d'un paquet, le déplacer dans /var/ftp/pub/ et régénérer les médias.
Tester la mise à jour et voir que notre paquet se met à jour.
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
urpmi sshfs-fuse
On monte notre répertoire distant dans notre arborescence locale
mkdir ~/sshfs
sshfs adrien@monserveur:/home/ftp/pub ~/sshfs
Une fois terminé, on démonte notre sshfs :
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é :
rpm -qa gnupg
S'il n'y est pas, on l'installe
urpmi gnupg
On créé ensuite notre clé GPG
gpg --gen-key
La console nous demande plusieurs étapes :
Utiliser une clé RSA (choix 1 par défaut)
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)
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
Nom réel : Adrien D
Adresse électronique : [email protected]
Commentaire :
Vous avez sélectionné cette identité :
« Adrien D <[email protected]> »
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.
┌─────────────────────────────────────────────────────────────────────┐
│ Entrez la phrase de passe │
│ C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C │
│ │
│ Phrase de passe *****************__________________________________ │
│ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────────────────────┘
Et voila, la paire de clés est créée.
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 <[email protected]>
sub 2048R/1B007B0C 2014-04-12
Il se peut qu'il soit utile de générer de l'entropie :
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
find / -exec md5sum {} \ ;
On exporte ensuite notre clé publique :
gpg --export -a [email protected] > pubkey
On peut exporter aussi notre clé privée, si on souhaite la réimporter sur un autre système :
gpg --export-secret-keys -a [email protected] > privkey
Que l'on réimporte ainsi sur le nouveau système :
gpg --import –allow-secret-key-import privkey
On importe notre clé dans la base RPM pour pouvoir signer nos paquets :
su -c 'rpm --import pubkey'
Signature du paquet
On tente donc de signer un de nos RPM ou SRPM :
rpmsign --addsign rpmbuild/SRPMS/coagul-vide-1-2.mga4.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 :
%_signature gpg
%_gpg_path /home/adrien/.gnupg
%_gpg_name Adrien D <[email protected]>
%_gpgbin /usr/bin/gpg
%packager Adrien D <[email protected]>
Ensuite, on tente de signer à nouveau :
rpmsign --addsign rpmbuild/SRPMS/coagul-vide-1-2.mga4.src.rpm
Entrez la phrase de passe :
Phrase de passe bonne.
rpmbuild/SRPMS/coagul-vide-1-2.mga4.src.rpm:
Et voila, notre RPM est signé.
rpmlint rpmbuild/SRPMS/coagul-vide-1-2.mga4.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 :
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 :
+ exit 0
Entrez la phrase de passe :
Phrase de passe bonne.
/home/adrien/rpmbuild/SRPMS/coagul-vide-1-2.mga4.src.rpm:
/home/adrien/rpmbuild/RPMS/x86_64/coagul-vide-1-2.mga4.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 :
urpmi coagul-vide
http://10.21.27.127/rpm/coagul-vide-1-2.mga4.x86_64.rpm
Le paquetage suivant a une signature invalide:
/var/cache/urpmi/rpms/coagul-vide-1-2.mga4.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 :
[adrien@localhost sshfs]$ 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é.
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 :
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é :
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 <[email protected]>
Summary : gpg(Adrien D <[email protected]>
Description :
Pour les fous de la ligne de commande, qui veulent aller plus vite que taper la référence de la clé GPG :
rpm -qi $(rpm -qa gpg-pubkey* --last | head -n1 | cut -d" " -f1 )