guides/serveur/diagnostic-espace-disque.md
2026-02-03 09:48:16 +01:00

439 lines
9 KiB
Markdown

# Guide de diagnostic d'espace disque Linux
Guide complet pour identifier et résoudre les problèmes d'espace disque sur un serveur Linux.
## 1. Vue d'ensemble : quel disque est plein ?
```bash
df -h
```
**Cherche :**
- La ligne `/dev/sda1` (ou `/dev/nvme0n1p1`, `/dev/vda1`) montée sur `/`
- Si `Use%` > 80% → Problème
**Exemple :**
```
/dev/sda1 59G 57G 171M 100% / ← PROBLÈME ICI
```
**Comprendre la sortie :**
| Colonne | Signification |
|---------|---------------|
| Filesystem | Nom du disque/partition |
| Size | Capacité totale |
| Used | Espace utilisé |
| Avail | Espace disponible |
| Use% | Pourcentage d'utilisation |
| Mounted on | Point de montage (où le disque est accessible) |
---
## 2. Niveau 1 : Identifier les gros dossiers à la racine
```bash
sudo du -sh /* 2>/dev/null | sort -h
```
**Explication :**
- `du` : **D**isk **U**sage (utilisation disque)
- `-s` : **S**ummary (résumé total)
- `-h` : **H**uman-readable (Go, Mo au lieu d'octets)
- `/*` : Tous les dossiers à la racine
- `2>/dev/null` : Masque les erreurs de permission
- `sort -h` : Trie par taille humaine (comprend que 10G > 2G)
**Résultat typique :**
```
4.0K /mnt
128M /boot
2.1G /usr
15G /var
40G /home ← SUSPECT
```
---
## 3. Niveau 2 : Descendre dans le dossier suspect
**Si `/home` est gros :**
```bash
sudo du -sh /home/* | sort -h
```
**Si `/var` est gros :**
```bash
sudo du -sh /var/* | sort -h
```
**Continue à descendre dans l'arborescence :**
```bash
# Exemple : /var/lib est gros
sudo du -sh /var/lib/* | sort -h
# Puis /var/lib/docker est gros
sudo du -sh /var/lib/docker/* | sort -h
```
**Astuce :** Garde seulement les 10 plus gros avec `tail -10` :
```bash
sudo du -sh /var/* | sort -h | tail -10
```
---
## 4. Trouver les plus gros fichiers (top 20)
```bash
sudo find /home -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h | tail -20
```
**Explication :**
- `find /home` : Cherche dans /home (change le path selon besoin)
- `-type f` : Seulement les fichiers (pas les dossiers)
- `-size +100M` : Fichiers de plus de 100 MB
- `-exec ls -lh {} \;` : Affiche les détails de chaque fichier trouvé
- `sort -k5 -h` : Trie par la 5ème colonne (taille) en mode humain
- `tail -20` : Garde les 20 derniers (= les plus gros)
**Variantes :**
| Taille | Option |
|--------|--------|
| Plus de 100 MB | `-size +100M` |
| Plus de 500 MB | `-size +500M` |
| Plus de 1 GB | `-size +1G` |
| Plus de 10 GB | `-size +10G` |
---
## 5. Cas particuliers
### A. Fichiers supprimés mais encore ouverts (fantômes)
Les fichiers supprimés mais encore ouverts par un processus continuent d'occuper l'espace disque jusqu'à ce que le processus se termine.
**Identifier les fichiers fantômes :**
```bash
sudo lsof +L1 | grep deleted
```
**Calculer l'espace total occupé :**
```bash
sudo lsof +L1 | grep deleted | awk '{sum+=$7} END {print "Space: " sum/1024/1024/1024 " GB"}'
```
**Solution :** Redémarre le service qui garde les fichiers ouverts :
```bash
# Identifier le processus
sudo lsof +L1 | grep deleted
# Redémarrer le service (exemple avec Docker)
docker restart container_name
# Ou redémarrer un service système
sudo systemctl restart service_name
```
### B. Logs système volumineux
Les logs système peuvent grossir indéfiniment et remplir le disque.
**Vérifier la taille des logs :**
```bash
sudo journalctl --disk-usage
```
**Nettoyer les logs (garder seulement 500M) :**
```bash
sudo journalctl --vacuum-size=500M
```
**Nettoyer les logs de plus de 7 jours :**
```bash
sudo journalctl --vacuum-time=7d
```
### C. Docker qui prend trop de place
Docker accumule des images, conteneurs, volumes et cache de build.
**Voir l'utilisation Docker :**
```bash
docker system df
```
**Exemple de sortie :**
```
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 3 2.935GB 2.719GB (92%)
Containers 3 2 110.1MB 0B (0%)
Local Volumes 1 0 0B 0B
Build Cache 35 0 108.7MB 108.7MB
```
**Nettoyer Docker :**
⚠️ **ATTENTION :** Cette commande supprime :
- Toutes les images non utilisées
- Tous les conteneurs arrêtés
- Tous les volumes non utilisés
- Tout le cache de build
```bash
docker system prune -a --volumes
```
**Nettoyage conservateur (seulement les ressources danglings) :**
```bash
docker system prune
```
### D. Cache APT (paquets téléchargés)
Les paquets `.deb` téléchargés par APT sont conservés dans le cache.
**Taille du cache :**
```bash
sudo du -sh /var/cache/apt
```
**Nettoyer :**
```bash
sudo apt clean
```
---
## 6. Méthodologie complète (étape par étape)
Voici la séquence complète pour diagnostiquer un problème d'espace disque :
```bash
# 1. Vue globale - quel disque est plein ?
df -h
# 2. Identifier les gros dossiers à la racine
sudo du -sh /* 2>/dev/null | sort -h | tail -10
# 3. Descendre dans le dossier suspect (exemple : /home)
sudo du -sh /home/* | sort -h | tail -10
# 4. Descendre encore plus profond (exemple : /home/debian)
sudo du -sh /home/debian/* | sort -h | tail -10
# 5. Trouver les gros fichiers individuels
sudo find /home/debian -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 6. Vérifier les fichiers fantômes (supprimés mais ouverts)
sudo lsof +L1 | grep deleted
# 7. Vérifier les logs système
sudo journalctl --disk-usage
# 8. Vérifier Docker
docker system df
```
---
## 7. Outil interactif : ncdu (recommandé)
`ncdu` est un outil interactif qui permet d'explorer visuellement l'espace disque, comme un explorateur de fichiers en mode texte.
**Installation :**
```bash
sudo apt install ncdu
```
**Utilisation :**
```bash
# Scanner un dossier
sudo ncdu /home
# Scanner depuis la racine (lent sur gros disques)
sudo ncdu /
```
**Navigation :**
- `↑` `↓` : Se déplacer dans la liste
- `Entrée` : Entrer dans un dossier
- `←` : Remonter au dossier parent
- `d` : Supprimer le fichier/dossier (⚠️ ATTENTION !)
- `g` : Afficher en graphique
- `?` : Aide
- `q` : Quitter
---
## 8. Mémo rapide (cheat sheet)
À garder sous la main pour un diagnostic rapide :
```bash
# Vue globale
df -h
# Top 10 gros dossiers dans un path
sudo du -sh /path/* | sort -h | tail -10
# Top 20 gros fichiers dans un path
sudo find /path -type f -size +100M -exec ls -lh {} \; 2>/dev/null | tail -20
# Fichiers fantômes (supprimés mais ouverts)
sudo lsof +L1 | grep deleted
# Logs système
sudo journalctl --disk-usage
sudo journalctl --vacuum-size=500M
# Docker
docker system df
docker system prune -a --volumes
# Cache APT
sudo apt clean
# Outil interactif
sudo ncdu /
```
---
## 9. Exemples de problèmes courants
### Problème 1 : Cache d'archives Git (Forgejo/GitLab)
**Symptôme :**
```
/home/user/forgejo/data/gitea/repo-archive → 48G
```
**Solution :**
```bash
# Supprimer le cache d'archives
sudo rm -rf /home/user/forgejo/data/gitea/repo-archive/*
# Configurer une expiration automatique dans app.ini
[repository.local]
ARCHIVE_EXPIRY = 604800 # 7 jours
# Ajouter un cron de nettoyage quotidien
sudo crontab -e
# Ajouter : 0 3 * * * find /path/to/repo-archive -type f -mtime +1 -delete
```
### Problème 2 : Logs Docker volumineux
**Symptôme :**
```
/var/lib/docker/containers/.../container-json.log → 10G
```
**Solution :**
```bash
# Limiter la taille des logs Docker
sudo nano /etc/docker/daemon.json
```
Ajouter :
```json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
```
```bash
# Redémarrer Docker
sudo systemctl restart docker
```
### Problème 3 : Base de données SQLite gonflée
**Symptôme :**
```
/var/lib/app/database.db → 5G
```
**Solution :**
```bash
# Vacuum (compacter) la base de données
sqlite3 /var/lib/app/database.db "VACUUM;"
```
---
## 10. Prévention
**Meilleures pratiques pour éviter les disques pleins :**
1. **Rotation des logs**
- Configurer `logrotate` pour limiter la taille des logs
- Utiliser `journalctl --vacuum-size=500M`
2. **Nettoyage automatique**
- Ajouter des crons pour nettoyer les caches/tmp
- Docker auto-prune régulier
3. **Monitoring**
- Alertes quand le disque dépasse 80%
- Vérifier régulièrement `df -h`
4. **Limites de taille**
- Configurer `max-size` pour les logs Docker
- Limiter les caches applicatifs
5. **Stockage externe**
- Monter les gros volumes sur des disques séparés
- Utiliser du stockage objet (S3) pour les archives
---
## Ressources complémentaires
**Commandes utiles :**
```bash
# Voir les inodes (nombre de fichiers)
df -i
# Trouver les dossiers avec beaucoup de petits fichiers
sudo find / -type d -exec sh -c 'echo "$(find "$1" -maxdepth 1 | wc -l) $1"' _ {} \; 2>/dev/null | sort -n | tail -20
# Voir l'espace utilisé par utilisateur
sudo du -sh /home/* | sort -h
# Monitoring en temps réel
watch -n 5 'df -h'
```
**Pages man utiles :**
- `man df` - Afficher l'espace disque
- `man du` - Calculer l'utilisation disque
- `man find` - Rechercher des fichiers
- `man lsof` - Lister les fichiers ouverts
---
**Guide créé le 2026-02-03**