حذف فایل های اضافه لینوکس

برای حذف فایل‌های اضافه در لینوکس و آزادسازی فضای دیسک، هیچ‌وقت از حذف کردن شروع نکنید؛ اول با df -h ببینید کدام پارتیشن پر شده و بعد با du یا ncdu دقیقاً پیدا کنید چه چیزی آن فضا را گرفته است. مقصر معمولاً یکی از چند متهم همیشگی است: لاگ‌های رشدکرده، بکاپ‌های قدیمی، کش بسته‌های سیستم‌عامل، محتوای /tmp، ایمیج‌ها و والیوم‌های بلااستفاده داکر، و فایل‌هایی که پاک شده‌اند ولی هنوز یک پروسه آن‌ها را باز نگه داشته است. و اگر کار به جایی رسیده که خود کنترل‌پنل هم بالا نمی‌آید و WHM پیام کمبود فضا نشان می‌دهد، آن حالت را جداگانه پایین‌تر توضیح داده‌ایم.

چرا «حذف کورکورانه» بدترین کار ممکن است

رایج‌ترین اشتباهی که باعث از کار افتادن سرور می‌شود این است که کاربر با دیدن پیام No space left on device شروع به پاک کردن پوشه‌هایی می‌کند که نامشان آشنا نیست. در لینوکس بسیاری از فایل‌هایی که «اضافه» به نظر می‌رسند در واقع سوکت، فایل موقت پایگاه داده یا کش فعال یک سرویس هستند و حذفشان سرویس را از کار می‌اندازد. تشخیص درست چند دقیقه بیشتر طول نمی‌کشد ولی جلوی ساعت‌ها خرابی را می‌گیرد.

نکته دوم این است که پر شدن دیسک همیشه مشکل «فایل زیادی» نیست. اگر سرویس‌ها خطا می‌دهند اما df -h فضای خالی نشان می‌دهد، احتمالاً inodeها تمام شده‌اند؛ یعنی تعداد فایل‌ها به سقف رسیده، نه حجمشان. هر سروری که انبوه فایل‌های ریز کش، سشن یا صف ایمیل تولید می‌کند در معرض این حالت است، از یک ماشین مجازی داخل ایران گرفته تا یک سرور بزرگ. بررسی‌اش یک دستور است:

df -ih

گام اول: اندازه‌گیری دقیق

ابتدا وضعیت کلی پارتیشن‌ها را ببینید:

df -h

سپس از ریشه شروع کنید و لایه به لایه پایین بروید. سوئیچ -x باعث می‌شود ابزار وارد پارتیشن‌های دیگر نشود و آمار را خراب نکند:

du -xh --max-depth=1 / | sort -h

هر پوشه‌ای که حجم غیرعادی داشت را با همان الگو باز کنید، مثلاً du -xh --max-depth=1 /var | sort -h و همین‌طور جلو بروید تا به پوشه مقصر برسید. اگر ابزار ncdu نصب باشد، همین کار را تعاملی و بسیار سریع‌تر انجام می‌دهد:

ncdu -x /

برای پیدا کردن تک‌فایل‌های بزرگ هم این دستور کافی است:

find / -xdev -type f -size +500M -exec ls -lh {} ;

اگر تازه با خط فرمان لینوکس کار می‌کنید، پیش از ادامه نگاهی به چند دستور کاربردی در لینوکس بیندازید تا با دستورهای پایه‌ای مثل ls و rm راحت باشید.

متهم‌های همیشگی و روش امن پاک‌سازی

ترتیب زیر را رعایت کنید؛ از کم‌ریسک‌ترین به پرریسک‌ترین:

۱. لاگ‌های systemd. اول حجمشان را ببینید، بعد کوتاهشان کنید. این کار فایل‌ها را حذف نمی‌کند بلکه فقط قدیمی‌ها را هرس می‌کند:

journalctl --disk-usage
journalctl --vacuum-time=7d

۲. کش بسته‌ها. این فایل‌ها هر لحظه قابل بازسازی هستند و حذفشان کاملاً بی‌خطر است. روی خانواده رد هت (AlmaLinux، Rocky Linux) از dnf استفاده کنید و روی دبیان و اوبونتو از apt. فقط حواستان باشد apt autoremove برخلاف clean بسته حذف می‌کند، پس فهرستی را که پیش از تأیید نشان می‌دهد بخوانید:

dnf clean all
apt clean && apt autoremove

۳. لاگ‌های چرخش‌خورده. فایل‌های فشرده قدیمی در /var/log معمولاً بی‌مصرف‌اند. اول فهرست بگیرید و فقط وقتی خروجی را دیدید حذف کنید:

find /var/log -type f -name "*.gz" -mtime +30

و پس از تأیید فهرست، -delete را به انتهای همان دستور اضافه کنید. هرگز خود پوشه /var/log یا زیرپوشه‌های آن را پاک نکنید؛ سرویس‌ها انتظار دارند آن مسیرها وجود داشته باشند.

۴. فایل لاگ فعال و بزرگ. اگر یک فایل لاگ در حال استفاده چند گیگابایت شده، آن را با rm حذف نکنید. خالی کردنش امن‌تر است چون فایل و دسترسی پروسه دست‌نخورده می‌ماند:

truncate -s 0 /var/log/example.log

۵. بکاپ‌های قدیمی و فایل‌های دانلودی. بکاپ‌های محلی سریع‌ترین راه پر کردن دیسک‌اند. بکاپ روی همان سروری که از آن بکاپ می‌گیرید عملاً بکاپ نیست؛ نسخه‌ها را بیرون ببرید. روی سرورهای cPanel هم مقصد بکاپ محلی که در بخش Backup Configuration تعیین شده، یکی از پرتکرارترین دلایل پر شدن پارتیشن ریشه است. اگر کارتان توزیع فایل حجیم است، نگه داشتن آن‌ها روی سرور اصلی اشتباه است و بهتر است روی هاست دانلود جدا نگهداری شوند که برای ذخیره‌سازی و ارائه فایل‌های حجیم طراحی شده است.

۶. داکر. ایمیج‌ها و والیوم‌های بلااستفاده حجم زیادی می‌گیرند. اول گزارش بگیرید:

docker system df

و بعد با احتیاط پاک‌سازی کنید. توجه کنید که docker system prune -a همه ایمیج‌های بدون کانتینر فعال را حذف می‌کند و اگر رجیستری در دسترس نباشد بازسازی‌شان دردسر دارد.

فایل را پاک کردم ولی فضا آزاد نشد

این کلاسیک‌ترین حالت گیج‌کننده است: فایل چند گیگابایتی را حذف کرده‌اید، du کاهش را نشان می‌دهد اما df همچنان دیسک را پر گزارش می‌کند. علت این است که یک پروسه هنوز آن فایل را باز نگه داشته و لینوکس تا بسته شدن آن دسترسی، فضا را آزاد نمی‌کند. برای دیدن این فایل‌ها:

lsof +L1

راه‌حل، ریستارت کردن همان سرویسی است که فایل را باز نگه داشته (مثلاً systemctl restart nginx). ریستارت کل سرور لازم نیست.

WHM بالا نمی‌آید و پیام کمبود فضای دیسک می‌دهد

روی سرورهایی که cPanel/WHM دارند، پر شدن پارتیشن ریشه فقط سرویس‌ها را از کار نمی‌اندازد؛ خود کنترل‌پنل هم عمداً خودش را قفل می‌کند تا در شرایط بی‌فضایی، داده اکانت‌ها خراب نشود. پیامی که هنگام ورود می‌بینید چیزی شبیه این است:

Sorry for the inconvenience!
The filesystem mounted at / on this server is running out of disk space. cPanel operations have been temporarily suspended to prevent something bad from happening. Please ask your system admin to remove any files not in use on that partition.

دو نکته را از همین متن بردارید: اول اینکه پیام دقیقاً می‌گوید کدام فایل‌سیستم پر شده (در نمونه بالا /)، پس سراغ همان بروید نه هر پارتیشن دیگری؛ دوم اینکه بسته شدن دسترسی به پنل فقط یک علت ندارد و اگر پیام شما این نیست، بقیه حالت‌ها را در خطای Connection to server failed در cPanel بررسی کرده‌ایم.

چرا بعد از آزاد کردن فضا هم پیام باقی می‌ماند

شکایت رایج این است که فضا آزاد شده اما WHM هنوز همان پیام را نشان می‌دهد. دلیلش ساده است: cPanel برای اینکه به ازای هر درخواست دستور df اجرا نکند، خروجی آن را در یک فایل کش نگه می‌دارد و تا وقتی آن کش تازه نشده، همان تصویر قدیمی و «دیسک پر» را باور می‌کند. این کش در مسیر /root/.cpanel/datastore/ قرار دارد. مثل همیشه، اول فهرست بگیرید:

ls -la /root/.cpanel/datastore/

نام فایل‌های این پوشه از روی خود دستوری ساخته می‌شود که خروجی‌اش کش شده؛ بنابراین دنبال ورودی مربوط به df بگردید. نام رایج آن _bin_df_-P_-k_-l است، اما چون این نام بین نسخه‌های cPanel فرق می‌کند، به جای کپی کردن کورکورانه دقیقاً همان چیزی را که در خروجی ls دیدید حذف کنید:

rm -f /root/.cpanel/datastore/_bin_df_-P_-k_-l

سپس دوباره وارد WHM شوید. این فایل صرفاً کش است و cPanel در اولین بررسی بعدی خودش دوباره می‌سازدش؛ چیزی از پیکربندی یا اکانت‌ها با حذف آن از بین نمی‌رود.

ترتیب کار را جابه‌جا نکنید. اول واقعاً فضا آزاد کنید (همان مراحل اندازه‌گیری و پاک‌سازی بالا)، بعد کش را پاک کنید. اگر بدون آزاد کردن فضا فقط کش را حذف کنید، cPanel در همان بررسی بعدی دوباره می‌بیند دیسک پر است و پیام برمی‌گردد؛ در این حالت کش مقصر نبوده و شما فقط چند دقیقه وقت خریده‌اید. و اگر مطمئنید فضا واقعاً آزاد شده ولی پیام باز هم برمی‌گردد، دو چیز را چک کنید: فایل‌های حذف‌شده‌ای که هنوز یک پروسه بازشان نگه داشته (بخش قبل، با lsof +L1) و تمام شدن inodeها با df -ih.

اگر دیسک این سرور مدام و بی‌دلیل پر می‌شود، پاک‌سازی دوره‌ای درمان نیست و باید سراغ ریشه بروید؛ معمولاً یکی از سایت‌ها یا سرویس‌ها بیش از سهمش منابع مصرف می‌کند که راه‌های شناسایی‌اش را در مصرف زیاد منابع هاست یا سرور نوشته‌ایم. روی سرورهای cPanel، بعد از /home (که فضای اکانت‌هاست) بیشترین حجم معمولاً مال بکاپ‌های محلی و لاگ‌هاست.

دستورهایی که هرگز نباید اجرا کنید

وقتی با کاربر روت روی یک سرور اختصاصی با دسترسی کامل مدیریتی یا هر سرور دیگری کار می‌کنید، هیچ لایه محافظی جلوی اشتباه شما را نمی‌گیرد و سطل بازیافتی هم در کار نیست. این موارد را جدی بگیرید؛ هیچ‌کدام قابل بازگشت نیستند:

  • rm -rf / و rm -rf /* — کل سیستم را نابود می‌کنند. همچنین مراقب متغیر خالی باشید: اگر در اسکریپت بنویسید rm -rf $DIR/ و DIR خالی باشد، همان فاجعه رخ می‌دهد. همیشه از rm -rf "${DIR:?}/" استفاده کنید.
  • اجرای مستقیم اسکریپت از اینترنت با الگوی curl ... | sh — شما محتوایی را با دسترسی روت اجرا می‌کنید که ندیده‌اید. آموزش‌های قدیمی «پاک‌سازی خودکار» معمولاً همین الگو را پیشنهاد می‌دادند و امروز نه امن است و نه آن آدرس‌ها دیگر بالا می‌آیند. اگر لازم شد، اول فایل را دانلود کنید، بخوانید و بعد اجرا کنید.
  • حذف پوشه‌های /var/lib، /etc، /usr و /boot برای آزادسازی فضا — این‌ها فایل اضافه نیستند.
  • find با -delete بدون اینکه اول خروجی بدون آن سوئیچ را دیده باشید.
  • حذف دستی فایل‌های دیتابیس (مثل فایل‌های ib_logfile یا بایناری‌لاگ‌ها) از مسیر داده — بایناری‌لاگ را باید از داخل خود دیتابیس و با در نظر گرفتن وضعیت replication هرس کرد.
  • روی سرور cPanel، پاک کردن پوشه‌های /var/cpanel یا /usr/local/cpanel برای آزاد کردن فضا — این‌ها خود کنترل‌پنل و پیکربندی اکانت‌ها هستند، نه فایل اضافه. کش datastore که بالاتر گفتیم هم اصلاً در این مسیرها نیست؛ جای آن /root/.cpanel/datastore/ است.

پیشگیری بهتر از پاک‌سازی اضطراری است

پر شدن دیسک تقریباً همیشه قابل پیش‌بینی است. سه کار ساده جلوی تکرارش را می‌گیرد: تنظیم درست logrotate برای لاگ‌های اپلیکیشن، سقف گذاشتن روی حجم ژورنال با SystemMaxUse در فایل /etc/systemd/journald.conf، و مهم‌تر از همه یک هشدار ساده که پیش از پر شدن کامل دیسک به شما خبر بدهد (آستانه‌اش را خودتان انتخاب کنید؛ خیلی‌ها روی هشتاد درصد می‌گذارند تا فرصت واکنش بماند). روی سرورهایی که چند سرویس سنگین کنار هم اجرا می‌کنند، جدا کردن پارتیشن داده از پارتیشن سیستم هم کمک می‌کند تا پر شدن یکی، کل سیستم‌عامل را زمین نزند.

و اگر ترجیح می‌دهید درگیر این نگهداری دوره‌ای نشوید، سراغ گزینه‌های سرور مدیریت‌شده بروید که در آن‌ها نصب و پیکربندی کنترل‌پنل، عیب‌یابی نرم‌افزارها و پشتیبانی فنی بر عهده تیم آنلاین سرور است. در هر صورت، قاعده طلایی را فراموش نکنید: اول اندازه بگیر، بعد پاک کن.