خطای «No space left on device» در حالی که دیسک خالی است
سایت از کار افتاده، لاگ اپلیکیشن پر از خطای No space left on device است، ولی df -h نشان میدهد ۶۰ درصد دیسک خالی است. این سناریوی کلاسیک تمام شدن inode است. پیش از هر اقدامی، یک دستور بزنید تا مطمئن شوید:
df -i /
ستون IUse% را ببینید. اگر عددی بالای ۹۰ بود، مشکل از inode است. حالا سؤال اصلی: چه چیزی اینقدر inode مصرف کرده و چطور باید آن را پیدا کرد؟
inode چیست و دقیقاً چه چیزی یک واحد از آن را مصرف میکند
هر فایل، دایرکتوری، symlink، socket و pipe در فایلسیستم لینوکس یک inode دارد. فایلهای خالی هم inode مصرف میکنند. یک فایل ۰ بایتی دقیقاً به اندازه یک فایل ۱۰ گیگابایتی inode مصرف میکند. این نکتهای است که خیلیها را غافلگیر میکند.
وقتی میگوییم «تعداد فایلها»، در عمل منظور تعداد inodeهای استفادهشده است. هر بار که یک فایل جدید میسازید، یک inode از استخر آزاد کم میشود. حذف فایل هم آن را برمیگرداند. پس محدودیت inode در هاست اشتراکی یعنی سقف تعداد فایلهایی که میتوانید داشته باشید، نه حجم آنها.
چهار موردی که بیشتر از همه در هاست اشتراکی inode میسوزانند:
- کشهای فریمورک — لاراول در
storage/framework/viewsبرای هر view کامپایلشده یک فایل میسازد. وردپرس با کشهای صفحهسازها مثل Elementor هم همینطور. - صندوق پستی ایمیل — هر ایمیل در فایلسیستم یک فایل جداگانه است. یک صندوق با ۵۰ هزار ایمیل قدیمی، ۵۰ هزار inode مصرف کرده.
- فایلهای سشن — در
/tmpیاsession.save_path، هر سشن باز یک فایل میسازد. سشنهای منقضینشده روی سایت پرترافیک بهسرعت انباشته میشوند. - بکاپهای تکهتکه — بکاپگیری که هر جدول دیتابیس را در یک فایل جدا میریزد، بهجای یک فایل فشرده واحد.
اینجا اشتباه میکنند: پاک کردن فایلهای حجیم
وقتی خطای inode میبینید، اولین واکنش این است که بروید سراغ بزرگترین فایلها. این کار هیچ اثری ندارد. حذف یک فایل ۲ گیگابایتی فقط یک inode آزاد میکند. مشکل از تعداد است، نه حجم. علامت این اشتباه: df -h نشان میدهد ۱۰ گیگ فضا آزاد شده، ولی df -i هنوز ۹۹ درصد پر است و سایت همچنان خطا میدهد.
روش دقیق شمارش inode در هاست اشتراکی
در هاست اشتراکی با cPanel یا DirectAdmin، معمولاً یک بخش «File Usage» یا «inode Usage» در خود پنل هست که آمار را نشان میدهد. اما اگر به عدد دقیق و تفکیک پوشهها نیاز دارید، از SSH استفاده کنید. اگر هاست شما SSH ندارد، از File Manager پنل استفاده کنید و پوشهها را یکییکی باز کنید — روش کند ولی کارا.
دستور اصلی برای شمارش inode در یک پوشه:
find /home/username -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20
این دستور ۲۰ پوشهای که بیشترین تعداد فایل را دارند نشان میدهد. فلگ -xdev جلوی عبور از مرز فایلسیستم را میگیرد تا پوشههای مجازی مثل /proc و /sys در نتیجه نیایند. خروجی را ببینید؛ معمولاً یک یا دو پوشه سهم ۸۰ درصدی دارند.
برای شمارش کل فایلهای یک پوشه خاص:
find /home/username/public_html -type f | wc -l
و برای دیدن تعداد فایلهای یک دایرکتوری بههمراه زیرپوشههای بلافصل آن:
for d in /home/username/public_html/*/; do echo "$(find "$d" -type f | wc -l) $d"; done | sort -rn | head
پوشههایی که معمولاً بیشترین سهم را دارند
بر اساس تجربه روی هاستهای مشتریان، این پنج مورد تقریباً همیشه در صدر فهرستاند:
| پوشه | دلیل مصرف | راهکار |
|---|---|---|
mail/ یا etc/ | انباشت ایمیلهای قدیمی | حذف ایمیلهای قدیمی از وبمیل یا تنظیم خودکار پاکسازی |
public_html/wp-content/cache/ | کشهای منقضینشده | پاک کردن کش با افزونه یا دستی |
public_html/wp-content/uploads/ | تصاویر ریسایزشده توسط وردپرس | حذف سایزهای اضافه با افزونه |
tmp/ یا session/ | سشنهای منقضینشده | تنظیم session.gc_maxlifetime روی مقدار کمتر |
logs/ | لاگهای چرخشنخورده | فعال کردن logrotate |
بعد از شناسایی، فایلهای اضافی را حذف کنید و دوباره df -i بزنید. اگر عدد پایین نیامد، احتمالاً فرآیندی مثل cron یا کارگر صف (queue worker) مدام فایل جدید میسازد. در این حالت lsof +L1 را اجرا کنید تا فایلهای حذفشده ولی هنوز باز را ببینید — اینها inode را قفل کردهاند و تا وقتی فرآیند بسته نشود آزاد نمیشوند.
وقتی تعداد فایلها ذاتاً زیاد است
گاهی مشکل از بینظمی نیست؛ ساختار پروژه طوری است که دهها هزار فایل لازم دارد. فروشگاههای اینترنتی با دهها هزار تصویر محصول، سرویسهای ایمیل با حجم بالای پیام، یا پروژههایی که node_modules و vendor را در هاست نگه میدارند — همه اینها سریع به سقف میرسند.
در این حالت دو راه دارید. اول: فایلهای غیرضروری را از هاست بردارید و در سرویس ذخیرهسازی جدا نگه دارید. تصاویر محصول را به CDN منتقل کنید و فقط نسخههای کوچکشده را روی هاست نگه دارید. دوم: اگر تعداد فایلها واقعاً بخشی از ماهیت کار شماست، به سرور اختصاصی مهاجرت کنید. در سرور اختصاصی، شما هنگام پارتیشنبندی دیسک تصمیم میگیرید چند درصد فضا به inode اختصاص یابد. فرمت ext4 بهطور پیشفرض به ازای هر ۱۶ کیلوبایت فضا یک inode میسازد؛ با فلگ -i در mkfs.ext4 میتوانید این نسبت را تغییر دهید:
mkfs.ext4 -i 8192 /dev/sdb1
این دستور به ازای هر ۸ کیلوبایت یک inode میسازد — دو برابر حالت پیشفرض. هزینهاش این است که فضای قابل استفاده دیسک کمی کمتر میشود، چون متادیتای بیشتری ذخیره میکنید. برای دیسکهای NVMe امروزی این هزینه معمولاً ناچیز است، ولی اگر فایلهای حجیم و تعداد کم دارید، نسبت پیشفرض بهینهتر است.
پیشگیری: عددها را از قبل بدانید
در هاست اشتراکی، سقف inode را از صفحه مشخصات سرویس یا از پشتیبانی بپرسید. این عدد معمولاً بین ۵۰ هزار تا ۵۰۰ هزار است. بعد یک خط cron بگذارید که هر هفته وضعیت را چک کند و اگر از ۸۰ درصد گذشت به شما ایمیل بزند:
df -i / | awk 'NR==2 {if ($5+0 > 80) print "inode usage: " $5}' | mail -s "inode Alert" you@example.com
اگر روی هاست لینوکس هستید و به SSH دسترسی ندارید، از ابزارهای موجود در پنل یا فایلهای گزارش استفاده کنید. نکته مهم این است که منتظر خطا نمانید؛ وقتی خطا رخ میدهد، سایت از دسترس خارج شده و هر دقیقه توقف، هزینه دارد.
همچنین اگر وردپرس دارید، افزونههای کش را طوری تنظیم کنید که فایلهای قدیمی را خودکار پاک کنند. افزونههایی مثل WP Rocket گزینه «Clear cache after…» دارند. و اگر از صفحهسازها استفاده میکنید، کش CSS و JS را روی حالت فشرده نگه دارید نه حالت فایلهای جدا.
پرسشهای پرتکرار
محدودیت inode در هاست اشتراکی چقدر است؟
عدد دقیق به شرکت هاستینگ و پلن شما بستگی دارد و معمولاً بین ۵۰ هزار تا ۵۰۰ هزار inode متغیر است. این عدد را از صفحه مشخصات سرویس یا با پرسش از پشتیبانی به دست آورید. در سرور اختصاصی، خودتان هنگام پارتیشنبندی این عدد را تعیین میکنید.
چطور بفهمم کدام پوشه بیشترین inode را مصرف کرده؟
اگر SSH دارید، دستور find /home/username -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20 را اجرا کنید. خروجی، پوشهها را به ترتیب تعداد فایلها نشان میدهد. بدون SSH، از File Manager پنل استفاده کنید و پوشههای اصلی مثل mail، public_html و tmp را بررسی کنید.
آیا حذف فایلهای حجیم inode آزاد میکند؟
فقط یک inode به ازای هر فایل حذفشده آزاد میشود، صرفنظر از حجم فایل. اگر مشکل از تعداد فایلهای کوچک است، حذف فایلهای حجیم تأثیر ناچیزی دارد. ابتدا پوشههایی با تعداد فایل بالا را شناسایی کنید، نه پوشههایی با حجم بالا.
فرق inode با مصرف دیسک چیست؟
مصرف دیسک بر حسب بایت یا گیگابایت اندازهگیری میشود و به حجم دادهها مربوط است. inode تعداد فایلها و دایرکتوریها را میشمارد. یک فایل ۱۰ گیگابایتی یک inode مصرف میکند و ۱۰ هزار فایل خالی هم ۱۰ هزار inode — در حالی که حجم دیسک تقریباً صفر است. هر دو محدودیت مستقل از هم عمل میکنند.