GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer un package RPM Linux

Cet article vous montre comment empaqueter un script dans un fichier RPM pour faciliter l'installation, la mise à jour et la suppression de vos systèmes Linux. Avant d'entrer dans les détails, je vais vous expliquer ce qu'est un package RPM et comment vous pouvez l'installer, l'interroger, le supprimer et, surtout, en créer un vous-même.

Cet article couvre :

  • Qu'est-ce qu'un package RPM ?
  • Comment créer un package RPM.
  • Comment installer, interroger et supprimer un package RPM.

Qu'est-ce qu'un package RPM ?

RPM signifie Red Hat Package Manager . Il a été développé par Red Hat et est principalement utilisé sur les systèmes d'exploitation Linux basés sur Red Hat (Fedora, CentOS, RHEL, etc.).

Un package RPM utilise le .rpm extension et est un ensemble (une collection) de différents fichiers. Il peut contenir les éléments suivants :

  • Fichiers binaires, également appelés exécutables (nmap , stat , xattr , ssh , sshd , et ainsi de suite).
  • Fichiers de configuration (sshd.conf , updatedb.conf , logrotate.conf , etc.).
  • Fichiers de documentation (README , TODO , AUTHOR , etc.).

Le nom d'un package RPM suit ce format :

<name>-<version>-<release>.<arch>.rpm

Un exemple :

bdsync-0.11.1-1.x86_64.rpm

Certains packages incluent également une version abrégée de la distribution pour laquelle ils ont été créés, par exemple :

bdsync-0.11.1-1.el8.x86_64.rpm

[ Vous pourriez également apprécier : la gestion des packages Linux avec YUM et RPM ]

Comment créer un package RPM

Vous aurez besoin des composants suivants pour créer un package RPM :

  • Un poste de travail ou une machine virtuelle exécutant une distribution basée sur RPM, telle que RHEL ou Fedora.
  • Logiciel pour créer le package.
  • Code source à empaqueter.
  • Fichier SPEC pour construire le RPM.

Installation du logiciel requis

Les packages suivants doivent être installés pour créer le package RPM :

$ sudo dnf install -y rpmdevtools rpmlint

Après avoir installé rpmdevtools , créez l'arborescence de fichiers dont vous avez besoin pour créer des packages RPM :

$ rpmdev-setuptree

Vous construisez des packages RPM en tant qu'utilisateur normal (pas root), donc votre environnement de construction est placé dans votre répertoire personnel. Il contient cette structure de répertoire :

rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
  • La CONSTRUCTION est utilisé pendant le processus de construction du package RPM. C'est là que les fichiers temporaires sont stockés, déplacés, etc.
  • Le RPMS répertoire contient les packages RPM construits pour différentes architectures et noarch si spécifié dans .spec fichier ou pendant la construction.
  • Les SOURCES Le répertoire, comme son nom l'indique, contient les sources. Cela peut être un simple script, un projet C complexe qui doit être compilé, un programme pré-compilé, etc. Habituellement, les sources sont compressées en .tar.gz ou .tgz fichiers.
  • La SPEC répertoire contient le .spec des dossiers. Le .spec Le fichier définit comment un package est construit. Plus d'informations à ce sujet plus tard.
  • Le SRPMS répertoire contient le .src.rpm paquets. Un package Source RPM n'appartient pas à une architecture ou à une distribution. Le .rpm réel la construction du paquet est basée sur le .src.rpm paquet.

Un .src.rpm est très flexible, car il peut être construit et reconstruit sur toutes les autres distributions et architectures basées sur RPM.

Vous savez maintenant ce que contient chaque répertoire, alors créez maintenant un script simple à distribuer :

$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF

Cela crée un script shell appelé hello.sh , qui imprime "Hello world" sur le terminal. C'est simple, mais c'est suffisant pour démontrer l'emballage.

Placez le script dans le répertoire désigné

Pour créer un package pour votre script, vous devez placer votre script dans le répertoire dans lequel le système de génération RPM s'attend à ce qu'il se trouve. Créez un répertoire pour celui-ci, en utilisant la gestion sémantique des versions comme le font la plupart des projets, puis déplacez hello.sh dedans :

$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1

La plupart du code source est distribué sous forme d'archive, utilisez donc la commande tar pour créer un fichier d'archive :

$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1

Déplacez ensuite l'archive que vous venez de créer dans les SOURCES répertoire :

$ mv hello-0.0.1.tar.gz SOURCES

Créer un fichier .spec

Un package RPM est défini par un .spec dossier. La syntaxe d'un .spec file est strict, mais rpmdev peut générer un fichier passe-partout pour vous :

$ rpmdev-newspec hello

Cela génère un fichier appelé hello.spec , que vous devez déplacer dans le SPECS annuaire. Exécutez tree ~/rpmbuild pour voir à quoi ressemble la structure du répertoire :

/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

Le hello.spec généré Le fichier fournit un bon point de départ, mais il ne contient aucune information spécifique sur ce que vous construisez. Le .spec généré suppose que je vais compiler et construire un logiciel.

Vous empaquetez un script Bash, il y a donc une simplification que vous pouvez faire. Par exemple, il n'y a pas de Build processus car il n'y a pas de code à compiler. J'ai ajouté BuildArch :noarch car ce package est valide pour 32 bits, 64 bits, Arm et toute autre architecture de processeur exécutant Bash.

J'ai également ajouté Nécessite :bash afin que le package s'assure que Bash est installé. Ce simple script "hello world" s'exécute sur n'importe quel shell, bien sûr, mais ce n'est pas vrai pour tous les scripts, c'est donc un bon moyen de démontrer les dépendances.

Name:           hello
Version:        0.0.1
Release:        1%{?dist}
Summary:        A simple hello world script
BuildArch:      noarch

License:        GPL
Source0:        %{name}-%{version}.tar.gz

Requires:       bash

%description
A demo RPM build

%prep
%setup -q

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%{_bindir}/%{name}.sh

%changelog
* Sun Nov  18 2020 Valentin Bajrami <[email protected]> - 0.0.1
- First version being packaged

Comme vous pouvez le constater, il existe de nombreux raccourcis dans .spec des dossiers. On les appelle des macros, et il existe une excellente liste de ce qui est disponible dans la documentation de l'empaquetage de Fedora. Il est important d'utiliser des macros dans votre .spec des dossiers. Ils aident à assurer la cohérence entre tous les systèmes RPM, ils vous aident à éviter les erreurs dans les noms de fichiers et la numérotation des versions, et ils facilitent la mise à jour du .spec fichier lorsque vous publiez une nouvelle version de votre script.

Par exemple, il est nécessaire que vous spécifiiez exactement quels fichiers sont installés sous %files section. Ici, j'ai explicitement mis la ligne suivante :

%files
%{_bindir}/%{name}.sh

Cela fonctionne parce que je veux que le script aille à %{_bindir} (qui est une macro qui se traduit par /usr/bin par défaut, mais est configurable lorsque les utilisateurs souhaitent installer à un emplacement différent, tel que /usr/local/bin ). Vous pouvez vérifier les valeurs des macros en exécutant :

$ rpm --eval '%{_bindir}'
/usr/bin

Autres macros utiles :

  • %{name} nom du package (tel que défini dans le Nom : champ)
  • %{version} version du package (telle que définie dans la section Version : champ)
  • %{_datadir} données partagées (/usr/sbin par défaut)
  • %{_sysconfdir} répertoire de configuration (/etc par défaut)

Vérification du fichier .spec en cas d'erreur (rpmlint)

Le rpmlint la commande peut trouver des erreurs dans .spec fichiers :

$ rpmlint ~/rpmbuild/SPECS/hello.spec
SPECS/hello.spec: W: no-%build-section
SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 2 warnings.

Il y a 2 erreurs signalées, mais elles sont toutes les deux acceptables. Il n'y a pas de code à construire, donc il n'y a pas besoin d'un %build section, et l'archive source est un fichier local et n'a pas d'URL réseau.

Tout a l'air bien.

Construire le paquet (rpmbuild)

Pour construire le package RPM, utilisez le rpmbuild commande. Plus tôt dans ce tutoriel, j'ai mentionné la différence entre le .src.rpm (paquet source RPM) et le .rpm paquet.

Pour créer le .src package rpm :

$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec

Les drapeaux -bs ont les significations suivantes :

  • -b :construire
  • -s :source

Pour créer le package binaire .rpm :

$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec

Les drapeaux -bb ont les significations suivantes :

  • -b :construire
  • -b :binaire

Utilisez -ba pour construire les deux.

Une fois le processus de construction terminé, vous avez la structure de répertoires suivante :

$ tree ~/rpmbuild/
/home/tux/rpmbuild/
├── BUILD
│   └── hello-0.0.1
│       ├── hello.sh
├── BUILDROOT
├── RPMS
│   └── noarch
│       └── hello-0.0.1-1.el8.noarch.rpm
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

Installation du package RPM

Après une construction réussie du paquet, vous pouvez installer le paquet RPM en utilisant le dnf commande :

$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

Il peut alternativement être installé avec le rpm commande directement :

$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

Vérifiez que le package a été installé

Pour vérifier que le package a été correctement installé, exécutez la commande suivante :

$ rpm -qi hello
Name        : hello
Version     : 0.0.1
Release     : 1
Architecture: noarch
Install Date: Mon 09 Nov 2020 01:29:51 AM CET
Group       : Unspecified
Size        : 294
License     : GPL
Signature   : (none)
Source RPM  : hello-0.0.1-1.el8.src.rpm
Build Date  : Mon 09 Nov 2020 01:08:14 AM CET
Build Host  : slimmerAI
Summary     : A simple hello world script
Description : A demo RPM build

Le %changelog l'entrée d'un package peut également être visualisée :

$ rpm -q hello --changelog
* Sun Nov 08 2020 Valentin Bajrami <[email protected]> - 0.1
- First version being packaged

Découvrez ce qu'il y a dans le package RPM

Il est facile de voir quels fichiers contient un package RPM :

$ rpm -ql hello
/usr/bin/hello.sh

Suppression du package RPM

La suppression du package du système est aussi simple que son installation. Vous pouvez utiliser le dnf commande :

$ sudo dnf remove hello

Ou le rpm commande directement :

$ sudo rpm --verbose --erase hello

Réflexions finales

Dans ce document, j'ai couvert les bases de l'empaquetage, y compris comment construire, installer et supprimer un paquet RPM de votre système. Le .spec peut devenir très compliqué à mesure que vous créez des logiciels plus avancés, mais vous pouvez lire des exemples concrets sur des référentiels de logiciels publics, tels que src.fedoraproject.org, pour en savoir plus.

[ Cours en ligne gratuit :Présentation technique de Red Hat Enterprise Linux. ] 


Linux
  1. Comment empaqueter des applications Python pour Linux

  2. Comment répertorier les fichiers installés à partir d'un package RPM ou DEB sous Linux

  3. Comment créer un script d'une commande Linux

  4. Comment créer un swap sous Linux

  5. Comment vérifier l'intégrité du package rpm sous Linux

Comment créer un fichier sous Linux

Comment créer des raccourcis sur le bureau Linux

Comment créer un alias SSH sous Linux

Comment créer un alias sous Linux

Comment créer un package RPM à partir d'une archive tar

Comment créer un package dans WHM ?