## Introduction

La hiérarchie du système de fichiers Linux est un contrat entre le système d'exploitation, les outils et les humains. Lorsque vous placez les fichiers aux bons endroits, vous obtenez des installations prévisibles, des sauvegardes simplifiées, un débogage facilité et des transferts plus fluides entre les équipes.

Utilisez trois questions pour décider où quelque chose appartient :

- Est-ce statique ou variable ? Le code et les ressources statiques vont sous /usr (ou /usr/local ). Les données variables et les logs vont sous /var .

- Est-ce pour le système ou pour un utilisateur ? Les éléments système se trouvent sous / , /usr , /etc , /var . Les fichiers et réglages utilisateur habitent sous /home/UTILISATEUR .

- Est-ce éphémère ou persistant ? Les fichiers d'exécution temporaires vont dans /run ou /tmp . L'état persistant va sous /var/lib .

Ce guide explique les répertoires majeurs, montre où placer les fichiers d'applications courantes, et détaille une configuration minimale et sûre que vous pouvez tester localement.

## Aperçu du flux de travail

### Ce qui va où (correspondance pratique)

- / (racine) : Le sommet de l'arborescence. Ne dispersez pas les fichiers d'application directement ici.

- /bin , /sbin : Commandes essentielles pour le démarrage et la réparation. Sur les systèmes modernes, ce sont souvent des liens symboliques vers /usr .

- /usr : Code d'application en lecture seule et données partagées gérées par le gestionnaire de paquets du système.

- /usr/bin : Exécutables utilisateur.

- /usr/sbin : Exécutables système.

- /usr/lib ou /usr/lib64 : Bibliothèques.

- /usr/share : Données indépendantes de l'architecture (icônes, locales, pages de manuel).

- /usr/local : Logiciels installés par l'administrateur, non gérés par le gestionnaire de paquets du système. Reproduit la structure de /usr : /usr/local/bin , /usr/local/lib , etc.

- /opt : Applications autonomes, fournies par un vendeur. Idéal pour un runtime groupé ou un arbre de produit unique comme /opt/acme/hello-app .

- /etc : Configuration système (statique ou modifiée par les administrateurs). Aucune application n'y écrit à l'exécution.

- /var : Données variables écrites à l'exécution.

- /var/lib/APP : État durable de l'application (bases de données, métadonnées).

- /var/log/APP : Fichiers de logs.

- /var/cache/APP : Caches reconstruisibles.

- /var/spool/APP : Files d'attente et travail entrant.

- /run : Fichiers d'exécution volatils (tmpfs). PID, verrous, sockets et fichiers de contrôle de courte durée, ex. /run/APP/APP.pid .

- /tmp : Espace de travail temporaire, souvent nettoyé automatiquement. Ne comptez jamais sur la persistance ni la sécurité ici.

- /home/UTILISATEUR : Données et fichiers de configuration utilisateur. Pas pour les services système.

- /root : Répertoire personnel de l'utilisateur root.

- /mnt : Systèmes de fichiers montés par l'administrateur pour usage temporaire ou manuel.

- /media : Média amovibles montés automatiquement (USB, CD).

- /srv : Données servies par les services (ex. contenu web) quand vous voulez une racine de service conventionnelle.

- /dev : Nœuds de périphériques.

- /proc et /sys : Systèmes de fichiers virtuels exposant les informations du noyau et des périphériques.

- /boot : Noyau, initramfs et fichiers du chargeur de démarrage.

### Placement des fichiers d'application courants

- Binaires :

- Depuis les paquets de la distribution : /usr/bin/votreapp (plus libs sous /usr/lib , données sous /usr/share ).

- Installés localement par les admins : /usr/local/bin/votreapp .

- Bundle vendeur : /opt/vendeur/votreapp/bin/votreapp et compagnons sous le même arbre.

- Configuration (système) : /etc/votreapp/

- Exemple : /etc/votreapp/config.yml et /etc/votreapp/env.conf

- État persistant : /var/lib/votreapp/

- Exemple : /var/lib/votreapp/state.db

- Logs : /var/log/votreapp/

- Exemple : /var/log/votreapp/app.log

- Caches : /var/cache/votreapp/

- Files d'attente : /var/spool/votreapp/

- Exécution (volatile) : /run/votreapp/

- Exemple : /run/votreapp/votreapp.pid , /run/votreapp/votreapp.sock

- Fichiers temporaires : /tmp/votreapp-XXXXXX

- Points de montage pour volumes de données : /mnt/data ou un sous-répertoire spécifique à votre équipe, monté via fstab ou systemd.

### Règles rapides pour permissions et appartenance

- Créez un utilisateur et groupe système dédiés pour votre service. Évitez de lancer en root.

- Faites appartenir les répertoires d'exécution et d'état à cet utilisateur:groupe. Appliquez le privilège minimal.

- Modes typiques :

- Config : 640 ou 600 quand des secrets sont présents.

- État et logs : 750 pour les répertoires, 640 pour les fichiers.

- Répertoires d'exécution : 750 pour les répertoires ; fichiers PID et sockets créés par le service.

### Liste de contrôle courte pour nouveaux services

- Choisissez la cible d'installation : /usr (packagé), /usr/local (géré par l'admin), ou /opt (bundle vendeur).

- Placez les configs dans /etc/APP .

- Créez /var/lib/APP , /var/log/APP , /var/cache/APP , /var/spool/APP selon les besoins.

- Créez /run/APP au démarrage du service (systemd peut le gérer) ou assurez-vous que l'application le crée.

- Définissez les appartenances et modes corrects.

- Fournissez une unité de service (ex. systemd) et assurez-vous que les logs sont repérables.

- Documentez les chemins dans le README et les scripts de sauvegarde.

## Plan de test local

Gardez la première implémentation étroite, mesurable et facile à inspecter localement. Voici un petit exemple sûr avec un service fictif nommé hello-app . Adaptez les noms à votre pile.

### 1) Créer un utilisateur de service

sudo useradd --system --no-create-home --shell /usr/sbin/nologin hello 

### 2) Installer le binaire

 Choisissez un style et restez cohérent.

Option A : géré par l'admin sous /usr/local

sudo install -m 0755 ./hello-app /usr/local/bin/hello-app 
 Option B : bundle vendeur sous /opt

sudo mkdir -p /opt/acme/hello-app/bin
sudo install -m 0755 ./hello-app /opt/acme/hello-app/bin/hello-app
# Lien symbolique de commodité optionnel
sudo ln -sf /opt/acme/hello-app/bin/hello-app /usr/local/bin/hello-app 

### 3) Créer la configuration

 sudo mkdir -p /etc/hello-app
printf '%s\n' \
 'listen_addr=127.0.0.1:8080' \
 'log_level=info' \
 'data_dir=/var/lib/hello-app' | sudo tee /etc/hello-app/hello.conf >/dev/null
sudo chmod 640 /etc/hello-app/hello.conf
sudo chown root:hello /etc/hello-app/hello.conf 

### 4) Créer les répertoires d'état, logs, cache et exécution

 sudo mkdir -p /var/lib/hello-app /var/log/hello-app /var/cache/hello-app /var/spool/hello-app
sudo chown -R hello:hello /var/lib/hello-app /var/log/hello-app /var/cache/hello-app /var/spool/hello-app
sudo chmod 750 /var/lib/hello-app /var/log/hello-app /var/cache/hello-app /var/spool/hello-app

# Laissez le gestionnaire de service créer /run/hello-app, ou pré-créez pour le test
sudo mkdir -p /run/hello-app
sudo chown hello:hello /run/hello-app
sudo chmod 750 /run/hello-app 

### 5) Ajouter une unité systemd minimale (si votre distribution utilise systemd)

 Créez /etc/systemd/system/hello-app.service avec le contenu suivant :

[Unit]
Description=Service Hello App
After=network.target

[Service]
User=hello
Group=hello
EnvironmentFile=-/etc/hello-app/hello.conf
ExecStart=/usr/local/bin/hello-app --config /etc/hello-app/hello.conf --data-dir ${data_dir:-/var/lib/hello-app} --listen ${listen_addr:-127.0.0.1:8080}
WorkingDirectory=/
RuntimeDirectory=hello-app
RuntimeDirectoryMode=0750
Restart=on-failure

[Install]
WantedBy=multi-user.target 
 Activez et lancez :

sudo systemctl daemon-reload
sudo systemctl enable --now hello-app
sudo systemctl status hello-app --no-pager 

### 6) Valider le comportement

- Le binaire est dans le PATH :

 command -v hello-app 

- Le service écoute localement :

 ss -lntp | grep 8080
# Si ss n'est pas disponible, essayez :
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN 

- Les logs sont où prévu :

 ls -l /var/log/hello-app
sudo journalctl -u hello-app --no-pager | tail -n 50 

- Le répertoire d'état change à l'utilisation :

 ls -l /var/lib/hello-app 

- Les fichiers d'exécution existent pendant le fonctionnement :

 ls -l /run/hello-app 

### 7) Ajouter un volume de données (optionnel, local)

 Si votre application a besoin de gros volumes, montez-les sous /mnt . Exemple avec un fichier loopback pour test local :

sudo mkdir -p /mnt/hello-data
# En supposant /dev/loop10 préparé et formaté
sudo mount /dev/loop10 /mnt/hello-data
sudo chown hello:hello /mnt/hello-data 
 Documentez le montage dans /etc/fstab seulement après test.

### 8) Nettoyer proprement

sudo systemctl disable --now hello-app
sudo rm -f /etc/systemd/system/hello-app.service
sudo systemctl daemon-reload
sudo userdel hello
sudo rm -rf /etc/hello-app /var/lib/hello-app /var/log/hello-app /var/cache/hello-app /var/spool/hello-app /run/hello-app /usr/local/bin/hello-app /opt/acme/hello-app 

## Exemples pratiques pour piles courantes

### Exemple 1 : Binaire unique Go ou Rust (installé par l'admin)

- Binaire : /usr/local/bin/logship

- Config : /etc/logship/config.yml

- État : /var/lib/logship/

- Logs : /var/log/logship/

- Exécution : /run/logship/

- Temporaire : /tmp/logship-*

- Service : /etc/systemd/system/logship.service

 Extrait d'installation :

sudo install -m 0755 ./logship /usr/local/bin/logship
sudo mkdir -p /etc/logship /var/lib/logship /var/log/logship /run/logship
sudo chown -R logship:logship /var/lib/logship /var/log/logship /run/logship 

### Exemple 2 : Application Python bundle vendeur sous /opt

- Bundle : /opt/vendeur/insight-app/{bin,lib,...}

- Lien symbolique pour commodité : /usr/local/bin/insight -> /opt/vendeur/insight-app/bin/insight

- Config : /etc/insight-app/

- État : /var/lib/insight-app/

- Logs : /var/log/insight-app/

### Exemple 3 : Contenu web servi depuis /srv

- Racine web : /srv/www/site

- Logs : /var/log/nginx/site/

- Cache : /var/cache/nginx/

- Config : /etc/nginx/sites-available/site

## Astuces pour dépannage et maintenance

- Si une application se plaint de permissions d'écriture manquantes, vérifiez si elle essaie d'écrire dans /etc ou /usr . Redirigez les écritures vers /var/lib ou /run .

- Gardez les secrets hors des chemins lisibles par tous. Utilisez 600 ou 640 avec un groupe dédié.

- Faites pivoter les logs dans /var/log avec la configuration logrotate de votre distribution.

- Sauvegardez /etc et /var/lib . Recréez /var/cache et /run à la demande.

- Utilisez find et du pour auditer l'espace :

 sudo du -sh /var/lib/* | sort -h | tail
sudo find /var/log -type f -mtime +14 -print 

## Conclusion

 Maîtriser la hiérarchie du système de fichiers Linux rend vos services prévisibles et faciles à exploiter. Commencez petit avec un test local qui place binaires, configs, état, logs, caches et fichiers d'exécution dans les bons répertoires. Utilisez des utilisateurs dédiés, des permissions strictes, et une correspondance claire pour chaque artefact. Comme prochaine étape, packagerez votre application pour des installations reproductibles, ajoutez des sauvegardes pour /etc et /var/lib , configurez la rotation des logs, et surveillez l'utilisation disque sous /var .