آزاد کردن فضای دیسک در سرور لینوکس (وقتی دیسک پر شده)

دیسک پر می‌تواند دیتابیس را متوقف و سایت را از دسترس خارج کند. راه درست این است که اول پیدا کنید فضا کجا رفته و بعد فقط همان را پاک کنید؛ نه اینکه کورکورانه فایل حذف کنید.

دیسک و ذخیره‌سازیمقدماتی8 دقیقه

۱کدام دیسک پر است؟

مصرف فایل‌سیستم‌ها را ببینید. همچنین اینود (inode) را هم چک کنید؛ گاهی فضا هست ولی اینود تمام شده است.

bash
df -h
df -i

۲پیدا کردن بزرگ‌ترین پوشه‌ها

از ریشه شروع کنید و عمیق‌تر بروید. -x از عبور به فایل‌سیستم دیگر جلوگیری می‌کند.

bash
sudo du -xh / --max-depth=1 2>/dev/null | sort -rh | head -15
sudo du -xh /var --max-depth=1 2>/dev/null | sort -rh | head -10

۳روش تعاملی با ncdu

ابزاری راحت‌تر: با فلش‌ها بین پوشه‌ها بروید.

bash
sudo apt install -y ncdu
sudo ncdu -x /

۴پیدا کردن فایل‌های بزرگ

فایل‌های بزرگ‌تر از ۱۰۰ مگابایت.

bash
sudo find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20

۵پاک کردن کش و لاگ‌های سیستم

این موارد امن هستند: کش بسته‌ها و لاگ‌های journald قدیمی.

bash
sudo apt-get clean
sudo apt-get autoremove -y
sudo journalctl --vacuum-size=200M
sudo journalctl --vacuum-time=14d

۶پاک کردن لاگ‌های بزرگ بدون حذف فایل

اگر فایل لاگی چند گیگابایتی است و برنامه هنوز رویش باز است، rm فضا را آزاد نمی‌کند. با truncate خالی‌اش کنید.

bash
sudo ls -lhS /var/log | head
sudo truncate -s 0 /var/log/nginx/access.log

اول مطمئن شوید نیازی به آن لاگ ندارید. logrotate را هم درست تنظیم کنید تا دوباره پر نشود.

۷فایل‌های حذف‌شده‌ای که هنوز فضا اشغال کرده‌اند

اگر du مقدار کمی و df مقدار زیادی نشان می‌دهد، فایل‌های حذف‌شده‌ای هستند که برنامه هنوز بازشان دارد. با lsof پیدایشان کنید و برنامه را ریستارت کنید.

bash
sudo lsof +L1 | head
sudo systemctl restart nginx

۸پاک‌سازی Docker

Docker با ایمیج‌ها، کانتینرهای متوقف و کش ساخت به‌سرعت چندین گیگابایت مصرف می‌کند.

bash
docker system df
docker system prune -f
docker image prune -a -f
docker builder prune -f

از --volumes استفاده نکنید مگر مطمئن باشید داده‌های ماندگار (دیتابیس) داخل volume ها ندارید.

۹جلوگیری از تکرار

چرخش لاگ، محدودیت لاگ داکر و هشدار وقتی دیسک ۸۰٪ پر شد.

bash
# هشدار ساده در cron: اگر مصرف > 85%
0 * * * * [ $(df / --output=pcent | tail -1 | tr -dc '0-9') -gt 85 ] && echo "Disk almost full on $(hostname)" | mail -s "DISK ALERT" admin@example.com

پرسش‌های پرتکرار دربارهٔ آزاد کردن فضای دیسک در سرور لینوکس (وقتی دیسک پر شده)

با df می‌گویند پر است ولی du جمع کمتری می‌دهد، چرا؟

معمولاً فایل‌های حذف‌شده‌ای وجود دارد که یک پردازش هنوز آن‌ها را باز نگه داشته (lsof +L1) یا فضای رزرو ext4 (۵٪ برای root) در محاسبه است. ریستارت پردازش فضا را آزاد می‌کند.