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
/runou/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/libou/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./procet/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/votreappet compagnons sous le même arbre. - Configuration (système) :
/etc/votreapp/ - Exemple :
/etc/votreapp/config.ymlet/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/dataou 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 :
640ou600quand des secrets sont présents. - État et logs :
750pour les répertoires,640pour les fichiers. - Répertoires d'exécution :
750pour 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/APPselon les besoins. - Créez
/run/APPau 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
/etcou/usr. Redirigez les écritures vers/var/libou/run. - Gardez les secrets hors des chemins lisibles par tous. Utilisez
600ou640avec un groupe dédié. - Faites pivoter les logs dans
/var/logavec la configuration logrotate de votre distribution. - Sauvegardez
/etcet/var/lib. Recréez/var/cacheet/runà la demande. - Utilisez
findetdupour 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.