439 lines
9 KiB
Markdown
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**
|