Logs
Consultez les logs.
OK
Liste des données
Consultez la liste des données.
OK
Loading...
Formulaire
Saisissez vos données.
Enregistrer
Annuler

Apprendre Linux

Vues
113

Introduction


Linux est un système d'exploitation utilisé en général pour gérer les serveurs applicatifs. A chaque distribution Linux, correspond un gestionnaire de packages dédié qui automatise le processus d'installation et de mises à jours des packages. 


### Travailler avec DPKG


DPKG est un gestionnaire de packages d'installation. Il permet de manipuler un package d'installation en offrant la possibilité de le créer, de l'installer, de le mettre à jour ou de le supprimer.


Installer les dépendances


Quelques dépendances sont nécessaires avant de créer un package (.deb). L'extension (DEB) pour la distribution DEBIAN et compatible avec la distribution Ubuntu.

// Terminal-Ubuntu (Installer les dépendances)
...
sudo apt install -y dpkg-dev gp
...


Créer un fichier exécutable


Le fichier exécutable correspond à l'application qui doit être packagé. Il peut être développé dans n'importe lequel des langages de programmation.

// rdvdeb (Définir le fichier exécutable)
...
echo "[rdvdeb] Démarrage du package DEB..."
...

image.png

// Terminal-Ubuntu (Rendre le fichier exécutable)
...
chmod a+x ./rdvdeb
...

// Terminal-Ubuntu (Tester le fichier exécutable)
...
./rdvdeb
..

image.png


Déterminer l'architecture du système


Un package DEB peut cibler toutes les architectures (all) ou une architecture en particulier (amd64, arm64).

// Terminal-Ubuntu (Déterminer l'architecture du système)
...
# Déterminer l'architecture du système
dpkg-architecture -q DEB_BUILD_ARCH
...

image.png

// Terminal-Ubuntu (Déterminer l'architecture du système)
...
# Déterminer l'architecture du système
dpkg --print-architecture
...

image.png


Créer un répertoire de package DEB


Un répertoire de package DEB est utilisé pour contenir l'ensemble des binaires et des ressources du package.

// Terminal-Ubuntu (Créer un répertoire de package DEB)
...
# Créer un répertoire de package DEB
mkdir -p ./pkg/rdvdeb_1.0-1_arm64
...

image.png

// Terminal-Ubuntu (Créer le répertoire des binaires du package)
...
# Créer le répertoire des binaires du package
mkdir -p ./pkg/rdvdeb_1.0-1_arm64/usr/bin
...

image.png

// Terminal-Ubuntu (Copier les binaires du package)
...
# Copier les binaires du package
cp ./src/rdvdeb ./pkg/rdvdeb_1.0-1_arm64/usr/bin/.
...

image.png


Créer un fichier de contrôle


Un répertoire DEBIAN est utilisé pour contenir les fichiers de mise en place du package DEB. Un fichier de contrôle permet définir les informations sur le package. C'est un fichier texte nommé (control) et situé dans le répertoire DEBIAN du package.

// Terminal-Ubuntu (Créer un répertoire DEBIAN du package)
...
# Créer un répertoire DEBIAN du package
mkdir -p ./pkg/rdvdeb_1.0-1_arm64/DEBIAN
...

image.png

// Terminal-Ubuntu (Créer un fichier de contrôle du package)
...
# Créer un fichier de contrôle du package
touch ./pkg/rdvdeb_1.0-1_arm64/DEBIAN/control
...

image.png

// DEBIAN/control (Editer le fichier de contrôle du package)
...
Package: rdvdeb
Version: 1.0
Maintainer: ReadyDev <youremail@readydev.com>
Architecture: arm64
Homepage: https://readydev.ovh/home
Description: Apprendre à créer un package DEB
...

image.png


Créer un fichier de post installation


Un fichier de post installation permet de réaliser certaines actions après l'installation du package. C'est un fichier exécutable nommé (postinst) et situé dans le répertoire DEBIAN du package.

// Terminal-Ubuntu (Créer un fichier de post installation)
...
# Créer un fichier de post installation
touch ./pkg/rdvdeb_1.0-1_arm64/DEBIAN/postinst
...

// Terminal-Ubuntu (Rendre le fichier exécutable)
...
# Rendre le fichier exécutable
chmod a+x ./pkg/rdvdeb_1.0-1_arm64/DEBIAN/postinst
...

image.png

// DEBIAN/postinst (Editer le fichier de post installation)
...
echo "[rdvdeb] Démarrage de la post installation..."
...

// Terminal-Ubuntu (Tester la post installation)
...
./DEBIAN/postinst
...

image.png


Créer un package


La création d'un package génère un fichier (.deb) qui contient l'ensemble des binaires et des ressources du package.

// Terminal-Ubuntu (Créer un package)
...
dpkg-deb --build [nom-repertoire-package] 
...
dpkg-deb --build ./rdvdeb_1.0-1_arm64 
...

image.png

image.png


Afficher les information d'un package


Les informations d'un package peuvent être consultées.

// Terminal-Ubuntu (Afficher les informations d'un package)
...
dpkg-deb --info [nom-repertoire-package].deb 
...
dpkg-deb --info ./rdvdeb_1.0-1_arm64.deb
...

image.png


Afficher le contenu d'un package


Le contenu d'un package peut être consulté.

// Terminal-Ubuntu (Afficher le contenu d'un package)
...
dpkg-deb --contents [nom-repertoire-package].deb 
...
dpkg-deb --contents ./rdvdeb_1.0-1_arm64.deb
...

image.png


Installer un package


L'installation du package déploie l'ensemble des binaires et des ressources du package (.deb) et exécuter le fichier de post installation (postint).

// Terminal-Ubuntu (Installer un package)
...
dpkg -i [nom-repertoire-package].deb 
...
sudo dpkg -i ./rdvdeb_1.0-1_arm64.deb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
whereis rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
rdvdeb
...

image.png


Supprimer un package sans ses dépendances


Un package peut être supprimé sans ses dépendances.

// Terminal-Ubuntu (Supprimer un package sans ses dépendances)
...
sudo dpkg -r [nom-package]
...
sudo dpkg -r rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier la suppression du package)
...
rdvdeb
...

image.png


Supprimer un package avec ses dépendances


Un package peut être supprimé avec ses dépendances.

// Terminal-Ubuntu (Supprimer un package avec ses dépendances) 
...
sudo dpkg -P [nom-package]
...
sudo dpkg -P rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier la suppression du package)
...
rdvpkg.exe
...

image.png


Comprendre le format d'un fichier de contrôle


Un fichier de contrôle permet définir les informations sur le package. C'est un fichier texte nommé (control) et situé dans le répertoire DEBIAN du répertoire de package.

// DEBIAN/control (Structure d'un fichier de contrôle)
...
Package...........: [nom du package: rdvdeb]
Version...........: [version du package: 1.0]
Maintainer........: [nom de l'auteur du package: Prénom NOM <email@dom.com>]
Depends...........: [liste des dépendances du package]
Architecture......: [architecture supporté par le package: all arm64 amd64]
Homepage..........: [documentation sur le package: https://doc/package/]
Description.......: [description du package]
...


Comprendre le format d'un fichier de post installation


Un fichier de post installation permet de réaliser certaines actions après l'installation du package. C'est un fichier exécutable nommé (postinst) et situé dans le répertoire DEBIAN du package.

// DEBIAN/postinst (Format d'un fichier de post installation)
...
# Editer l'ensemble des commandes
# à exécuter après l'installation du package
...
commande-01
commande-02
commande-03
...


Comprendre le format d'un répertoire de package


Le nom du répertoire d'un package suit une structure bien défini.

// Notes (Structure d'un répertoire de package)
...
[nom-package]_[version]-[numero-release]_[architecture]
...
[nom-package]......: [nom du package: rdvdeb] 
[version]..........: [version du package: 1.0]
[numero-release]...: [numero de release du package: 1]
[architecture].....: [nom de l'architecture: all arm64 amd64]
...
# Exemples de répertoire de package
rdvdeb_1.0-1_all
rdvdeb_1.0-1_arm64
rdvdeb_1.0-1_amd64
...


### Travailler avec APT


APT est un gestionnaire de packages. Il permet de manipuler un package en offrant la possibilité de l'installer, de le mettre à jour ou de le supprimer.


Installer un package DEB


Un package DEB peut être installé avec le gestionnaire de packages APT.

// Terminal-Ubuntu (Installer un package DEB)
...
# Installer un package DEB
sudo apt install -f [nom-repertoire-package].deb
...
# Installer un package DEB
sudo apt install -f ./rdvdeb_1.0-1_arm64.deb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
whereis rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
rdvdeb
...

image.png


Supprimer un package DEB sans ses dépendances


Un package DEB peut être supprimé sans ses dépendances avec le gestionnaire de packages APT.

// Terminal-Ubuntu (Supprimer un package DEB sans dépendances)
...
# Supprimer un package DEB sans dépendances
sudo apt remove [nom-package]
...
# Supprimer un package DEB sans dépendances
sudo apt remove rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier la suppression du package)
...
rdvdeb
...

image.png


Supprimer un package DEB avec ses dépendances


Un package DEB peut être supprimé avec ses dépendances avec le gestionnaire de packages APT.

// Terminal-Ubuntu (Supprimer un package DEB sans dépendances)
...
# Supprimer un package DEB sans dépendances
sudo apt purge [nom-package]
...
# Supprimer un package DEB sans dépendances
sudo apt purge rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier la suppression du package)
...
rdvdeb
...

image.png


Créer un répertoire racine d'un référentiel APT


Un répertoire racine est nécessaire pour la mise en place d'un référentiel de packages APT. Il contient un répertoire des packages DEB et un répertoire des binaires DEB.

// Terminal-Ubuntu (Créer un répertoire racine d'un référentiel APT)
...
# Créer un répertoire racine d'un référentiel APT
mkdir -p ./rdvapt
...

image.png


Créer un répertoire de packages DEB


Un répertoire des packages DEB est nécessaire pour la mise en place d'un référentiel de packages APT. Il contient l'ensemble des packages DEB.

// Terminal-Ubuntu (Créer un répertoire de packages DEB)
...
# Créer un répertoire des packages DEB
mkdir -p ./rdvapt/pool/main
...

image.png

// Terminal-Ubuntu (Copier tous les packages DEB)
...
# Copier tous les packages DEB
./rdvapt/pool/main/[package-deb-01]
./rdvapt/pool/main/[package-deb-02]
./rdvapt/pool/main/[package-deb-03]
...
# Copier tous les packages DEB
./rdvapt/pool/main/rdvdeb_1.0-1_arm64.deb
...

image.png


Créer un répertoire de binaires DEB


Un répertoire des binaires DEB est nécessaire pour la mise en place d'un référentiel de packages APT. Il contient la liste des binaires des packages DEB.

// Terminal-Ubuntu (Créer un répertoire des binaires DEB)
...
# Créer un répertoire des binaires DEB
mkdir -p ./rdvapt/dists/stable/main/binary-arm64
...

image.png

// Terminal-Ubuntu (Créer la liste des packages DEB)
...
# Créer la liste des packages DEB
cd ./rdvapt
dpkg-scanpackages --arch arm64 ./pool/ > ./dists/stable/main/binary-arm64/Packages
cd ..
...

image.png

image.png

// Terminal-Ubuntu (Afficher la liste des packages DEB)
...
# Afficher la liste des packages DEB
cat ./rdvapt/dists/stable/main/binary-arm64/Packages
...

image.png

// Terminal-Ubuntu (Compresser la liste des packages DEB)
...
# Compresser la liste des packages DEB
cat ./rdvapt/dists/stable/main/binary-arm64/Packages | gzip -9 > ./rdvapt/dists/stable/main/binary-arm64/Packages.gz
...

image.png


Créer un fichier Release


Un fichier Release est nécessaire pour la mise en place d'un référentiel de packages APT. Il contient les informations sur le référentiel APT.

// Terminal-Ubuntu (Créer un générateur de fichier Release)
...
# Créer un générateur de fichier Release
touch ./rdvapt/generate-release.sh
...

// Terminal-Ubuntu (Rendre le fichier exécutable)
...
# Rendre le fichier exécutable
chmod a+x ./rdvapt/generate-release.sh
...

image.png

// generate-release.sh (Editer le générateur de fichier Release)
...
#!/bin/sh
set -e

do_hash() {
    HASH_NAME=$1
    HASH_CMD=$2
    echo "${HASH_NAME}:"
    for f in $(find -type f); do
        f=$(echo $f | cut -c3-)
        if [ "$f" = "Release" ]; then
            continue
        fi
        echo " $(${HASH_CMD} ${f}  | cut -d" " -f1) $(wc -c $f)"
    done
}

cat << EOF
Origin: Apprendre à créer un référentiel APT
Label: rdvapt
Suite: stable
Codename: stable
Version: 1.0
Architectures: arm64
Components: main
Description: |
    Le but de ce référentiel est d'apprendre
    à créer un référentiel APT
Date: $(date -Ru)
EOF
do_hash "MD5Sum" "md5sum"
do_hash "SHA1" "sha1sum"
do_hash "SHA256" "sha256sum"
...

// Terminal-Ubuntu (Générer un fichier Release)
...
# Générer un fichier Release
cd ./rdvapt/dists/stable
../../generate-release.sh > Release
cd ../../..
...

image.png

// Terminal-Ubuntu (Afficher le contenu du fichier Release)
...
# Afficher le contenu du fichier Release
cat ./rdvapt/dists/stable/Release
...

// Release (Contenu du fichier Release)
...
Origin: Apprendre à créer un référentiel APT
Label: rdvapt
Suite: stable
Codename: stable
Version: 1.0
Architectures: arm64
Components: main
Description: |
    Le but de ce référentiel est d'apprendre
    à créer un référentiel APT
Date: Fri, 07 Mar 2025 14:35:01 +0000
MD5Sum:
 542f0a441fbdfced17310f0ca113b3ed 403 main/binary-arm64/Packages
 e2f3e100788aadd399713e661a93a4c9 325 main/binary-arm64/Packages.gz
SHA1:
 54ed314f88882d9eb50d16f2c6bb38ef75f59b73 403 main/binary-arm64/Packages
 44c8554e1ad062379d237c2c664baf940b3a8697 325 main/binary-arm64/Packages.gz
SHA256:
 20dccae10557c9169e7358e6e4182191c593b225b9a1c87a6a2957adc67e6708 403 main/binary-arm64/Packages
 2ba6cd9dfd732e4b3865b72dbe75848e356d4053389d80f2a534e65a470bb2a0 325 main/binary-arm64/Packages.gz
...


Démarrer un serveur du référentiel APT


Le référentiel APT doit être hébergé sur un serveur afin d'être accessible à distance. Python permet de fournir très facilement un serveur (HTTP) sur le port (8000).

// Terminal-Ubuntu (Démarrer un serveur du référentiel APT)
...
# Démarrer un serveur du référentiel APT
python3 -m http.server
...

image.png

// Google Chrome (Accéder au référentiel APT)
...
http://localhost:8000/
...

image.png

image.png


Configurer les sources d'un référentiel APT


La configuration des sources d'un référentiel APT consiste à indiquer l'URL d'accès au référentiel dans la liste des sources APT du système.

// Terminal-Ubuntu (Configurer les sources d'un référentiel APT)
...
# Configurer les sources d'un référentiel APT
echo "deb [arch=arm64] http://127.0.0.1:8000/rdvapt stable main" | sudo tee /etc/apt/sources.list.d/rdvapt.list
...

image.png

// Terminal-Ubuntu (Lister les sources des référentiels APT)
...
# Lister les sources des packages APT
ll /etc/apt/sources.list.d
...

image.png

// Terminal-Ubuntu (Afficher les sources du référentiel APT)
...
# Lister les sources des packages APT
cat /etc/apt/sources.list.d/rdvapt.list
...

image.png


Autoriser les packages non authentifiés


L'autorisation des packages non authentifiés est réalisée lors de la mise des packages APT du système en indiquant l'option correspondante à cet effet. Cela permet de télécharger des packages à partir d'un dépôt personnalisé non officiel configuré sur le système.

// Terminal-Ubuntu (Autoriser les packages non authentifiés)
...
# Autoriser les packages non authentifiés
sudo apt update --allow-insecure-repositories
...

image.png

image.png


Installer un package APT (non signé)


Les packages du référentiels APT peuvent être installés sur le système.

// Terminal-Ubuntu (Installer un package APT) 
...
# Installer un package APT
sudo apt install rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
whereis rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
rdvdeb
...

image.png


Générer une pair de clés PGP


PGP est un gestionnaire de signature. Il permet de signer un message ou un document et de vérifier que la signature provient de la personne à qui appartient le message ou le document.

// Terminal-Ubuntu (Créer un modèle de pair de clé PGP)
...
mkdir -p ./rdvapt/cmd
touch ./rdvapt/cmd/template-pgp-key.batch
...

// template-pgp-key.batch (Editer un modèle de pair de clé PGP)
...
%echo Génération d'une clé PGP
Key-Type: RSA
Key-Length: 4096
Name-Real: rdvapt
Name-Email: youremail@readydev.com
Expire-Date: 0
%no-ask-passphrase
%no-protection
%commit
...

RSA est un gestionnaire de chiffrement. Il permet de chiffrer un message avec une clé publique qui peut être partagée ouvertement. 

// Terminal-Ubuntu (Générer une pair de clés PGP)
...
export GNUPGHOME="$(mktemp -d ./rdvapt/cmd/pgpkeys-XXXXXX)"
gpg --no-tty --batch --gen-key ./rdvapt/cmd/template-pgp-key.batch
...

image.png

image.png

// Terminal-Ubuntu (Afficher la liste des clés PGP)
...
gpg --list-keys
...

image.png

// Terminal-Ubuntu (Exporter la clé publique)
...
gpg --armor --export rdvapt > ./rdvapt/cmd/pgp-key.public
...

// Terminal-Ubuntu (Afficher la clé publique)
...
cat ./rdvapt/cmd/pgp-key.public
...

image.png

// Terminal-Ubuntu (Vérifier la présence d'un paquet unique de clé publique)
...
cat ./rdvapt/cmd/pgp-key.public | gpg --list-packets
...

image.png

// Terminal-Ubuntu (Exporter la clé privée)
...
gpg --armor --export-secret-keys rdvapt > ./rdvapt/cmd/pgp-key.private
...

// Terminal-Ubuntu (Afficher la clé privée)
...
cat ./rdvapt/cmd/pgp-key.private
...

Vous ne devez jamais partager la clé privée.

image.png


Importation de la clé privée PGP


PGP est un gestionnaire de signature. Il permet de signer un message ou un document et de vérifier que la signature provient de la personne à qui appartient le message ou le document.

// Terminal-Ubuntu (Générer un répertoire temporaire)
...
export GNUPGHOME="$(mktemp -d ./rdvapt/cmd/pgpkeys-XXXXXX)"
...

// Terminal-Ubuntu (Vérifier que le répertoire temporaire est vide)
...
gpg --list-keys
...

image.png

// Terminal-Ubuntu (Importer la clé privée)
...
cat ./rdvapt/cmd/pgp-key.private | gpg --import
...

image.png

// Terminal-Ubuntu (Vérifier l'importation de la clé privée)
...
gpg --list-keys
...

image.png


Signer le fichier Release avec la clé privée


Lors que le système effectue une mise à jour des packages APT, il récupère à la fois le fichier Release et sa signature Release.gpg afin de vérifier que la signature est valide.

// Terminal-Ubuntu (Signer le fichier Release avec la clé privée)
...
cat ./rdvapt/dists/stable/Release | gpg --default-key rdvapt -abs > ./rdvapt/dists/stable/Release.gpg
...

image.png

// Terminal-Ubuntu (Afficher la signature du fichier Realease)
...
cat ./rdvapt/dists/stable/Release.gpg
...

image.png

Le fichier InRelease est une combinaison du fichier Release et sa signature Release.gpg afin d'augmenter la vitesse de validation de la signature. 

// Terminal-Ubuntu (Créer le fichier de combinaision InRelease)
...
cat ./rdvapt/dists/stable/Release | gpg --default-key rdvapt -abs --clearsign > ./rdvapt/dists/stable/InRelease
...

image.png

// Terminal-Ubuntu (Créer le fichier de combinaision InRelease)
...
cat ./rdvapt/dists/stable/InRelease
...

image.png


Installer un package APT (signé)


Les packages APT signés permettent de télécharger des packages à partir d'un dépôt personnalisé au même titre que les packages officiels, après la validation des signatures des packages.

// Terminal-Ubuntu (Copier la clé publique dans le répertoire APT)
...
sudo cp /home/.../rdvapt/cmd/pgp-key.public /etc/apt/keyrings/.
...

// Terminal-Ubuntu (Indiquer la clé publique dans les sources APT)
...
echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/pgp-key.public] http://127.0.0.1:8000/rdvapt stable main" | sudo tee /etc/apt/sources.list.d/rdvapt.list
...

image.png

// Terminal-Ubuntu (Mettre à jour les packages APT)
...
sudo apt clean
sudo apt update
...

image.png

// Terminal-Ubuntu (Installer le package)
...
sudo apt install rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
whereis rdvdeb
...

image.png

// Terminal-Ubuntu (Vérifier le déploiement du package)
...
rdvdeb
...

image.png


Comprendre le format d'un fichier Release


Un fichier Release est nécessaire pour la mise en place d'un référentiel de packages APT.

// Terminal-Ubuntu (Comprendre le format d'un fichier Release)
...
Origin: [origine-package]
Label: rdvapt
Suite: stable
Codename: stable
Version: 1.0
Architectures: arm64
Components: main
Description: [description-package]
Date: Fri, 07 Mar 2025 14:08:48 +0000
MD5Sum:
 542f0a441fbdfced17310f0ca113b3ed 403 main/binary-arm64/Packages
 e2f3e100788aadd399713e661a93a4c9 325 main/binary-arm64/Packages.gz
SHA1:
 54ed314f88882d9eb50d16f2c6bb38ef75f59b73 403 main/binary-arm64/Packages
 44c8554e1ad062379d237c2c664baf940b3a8697 325 main/binary-arm64/Packages.gz
SHA256:
 20dccae10557c9169e7358e6e4182191c593b225b9a1c87a6a2957adc67e6708 403 main/binary-arm64/Packages
 2ba6cd9dfd732e4b3865b72dbe75848e356d4053389d80f2a534e65a470bb2a0 325 main/binary-arm64/Packages.gz
...

// Terminal-Ubuntu (Rendre le fichier exécutable)
...
[Origin]...........: [origine du référentiel en une seule ligne]
[Label]............: [nom du référentiel: rdvapt]
[Suite]............: [définit la suite du référentiel: stable]
[Codename].........: [nom de code du référentiel: stable]
[Version]..........: [version du référentiel: 1.0]
[Architectures]....: [architectures supportées par le référentiel: arm64 amd64]
[Components].......: [composants du référentiel: main]
[Description]......: [description du référentiel]
[Date].............: [date de création du référentiel]
[MD5Sum]...........: [empreinte md5 pour la vérification de l'intégrité des packages]
[SHA1].............: [empreinte sha1 pour la vérification de l'intégrité des packages]
[SHA256]...........: [empreinte sha256 pour la vérification de l'intégrité des packages]
...