
تا حالا برایتان پیش آمده که فضای دیسک سرور مجازی تان خالی باشد، اما نتوانید فایل جدید بسازید؟ خطای عجیبی مثل “No space left on device” میگیرید در حالی که df -h نشان میدهد50 درصد فضا آزاد است. این یکی از گیجکنندهترین تجربهها برای مدیران سیستم است و معمولاً ریشهاش چیزی است که کمتر کسی به آن توجه میکند: اینود یا Inode. در این مقاله توضیح میدهم اینود چیست، چگونه کار میکند، چرا میتواند از فضای دیسک مهمتر باشد و چطور مشکلات مرتبط با آن را تشخیص و برطرف کنید.
Inode چیست؟
اینود یک ساختار داده در سیستم فایلهای یونیکس و لینوکس است که اطلاعات مربوط به یک فایل را نگه میدارد، اما نه نام آن و نه محتوای آن. به زبان ساده، اینود شناسنامه یک فایل است. هر فایل و هر پوشه در لینوکس دقیقاً یک اینود دارد. اینودها در جدولی به نام Inode Table ذخیره میشوند که در ابتدای هر پارتیشن قرار دارد و سیستم فایل آن را مدیریت میکند.
وقتی یک فایل میسازید، سیستم فایل یک Inode آزاد پیدا میکند، اطلاعات فایل را در آن ذخیره میکند و یک نام به آن Inode متصل میکند. وقتی فایل را حذف میکنید، نام حذف میشود و Inode آزاد میشود. بنابراین Inode و نام فایل دو موجودیت جداگانه هستند و همین موضوع یکی از دلایل قدرت و انعطافپذیری سیستم فایل لینوکس است.
داخل اینود چه چیزی ذخیره میشود؟
هر اینود شامل متادیتای فایل است، یعنی اطلاعاتی درباره فایل، نه خود فایل. این اطلاعات شامل موارد زیر است:
-
شماره اینود (Inode Number): یک شناسه یکتا در کل پارتیشن
-
نوع فایل: فایل عادی، پوشه، لینک نمادین، دستگاه کاراکتری یا بلوکی، سوکت یا FIFO
-
مجوزها: ترکیب خواندن، نوشتن و اجرا برای مالک، گروه و دیگران
-
مالک (UID): شناسه کاربر مالک فایل
-
گروه (GID): شناسه گروه مالک فایل
-
اندازه فایل: حجم فایل بر حسب بایت
-
زمانها: زمان ایجاد، آخرین دسترسی، آخرین تغییر محتوا و آخرین تغییر متادیتا
-
شمارنده لینک (Link Count): تعداد نامهایی که به این اینود اشاره میکنند
-
اشارهگرها به بلوکهای داده: آدرس بلوکهایی که محتوای واقعی فایل در آنها ذخیره شده است
-
پرچمها و ویژگیها: مثل immutable یا append-only
نکته مهم این است که نام فایل در Inode ذخیره نمیشود. نام فایل در پوشهای که فایل در آن قرار دارد ذخیره میشود و به شماره Inode اشاره میکند. به همین دلیل است که میتوانید یک فایل را چند نام مختلف بدهید (hard link) و همه آنها به یک Inode اشاره کنند.
جدول محتویات اینود:
| فیلد | توضیح |
|---|---|
Inode Number |
شناسه یکتا |
File Type |
نوع فایل |
Permissions |
مجوزهای دسترسی |
UID |
مالک فایل |
GID |
گروه فایل |
Size |
اندازه فایل |
Timestamps |
زمانهای فایل |
Link Count |
تعداد نامها |
Data Pointers |
آدرس بلوکهای داده |
اینود چگونه با نام فایل ارتباط برقرار میکند؟
وقتی شما فایلی به نام report.txt را باز میکنید، سیستم فایل این مراحل را طی میکند:
-
پوشهای که فایل در آن است را باز میکند (پوشه هم یک اینود دارد).
-
در محتوای پوشه، دنبال نام
report.txtمیگردد. -
کنار نام، شماره اینود فایل را پیدا میکند (مثلاً اینود ۱۲۳۴۵۶).
-
اینود ۱۲۳۴۵۶ را در Inode Table جستجو میکند.
-
مجوزها و مالکیت را بررسی میکند.
-
اگر دسترسی مجاز بود، بلوکهای داده را میخواند و محتوا را برمیگرداند.
این جداسازی بین نام و Inode باعث میشود عملیاتی مثل تغییر نام فایل بسیار سریع باشد. چون فقط نام در پوشه عوض میشود و Inode دست نمیخورد. همچنین hard link فقط یک نام جدید در پوشه ایجاد میکند که به همان Inode اشاره میکند و فضای اضافی اشغال نمیکند.
چرا اینود از فضای دیسک مهمتر است؟
حالا به سوال اصلی میرسیم. چرا اینود میتواند از فضای دیسک مهمتر باشد؟ پاسخ ساده است: تعداد اینودها محدود است، در حالی که فضای دیسک میتواند بزرگتر شود. وقتی سیستم فایل را میسازید (مثلاً با mkfs.ext4)، تعداد ثابتی اینود ایجاد میشود. این تعداد معمولاً بر اساس اندازه پارتیشن محاسبه میشود، اما میتوانید آن را دستی هم تنظیم کنید.
اگر تعداد فایلهای شما از تعداد اینودهای موجود بیشتر شود، حتی اگر صدها گیگابایت فضای خالی داشته باشید، نمیتوانید فایل جدید بسازید. این وضعیت را Inode Exhaustion یا تمام شدن اینود مینامند. سیستم فایل به شما میگوید “No space left on device” در حالی که واقعاً فضا دارد، اما اینود آزاد ندارد.
چرا این اتفاق خطرناک است؟
چون:
-
تشخیص آن سخت است: اکثر افراد فقط
df -hرا چک میکنند که فضای دیسک را نشان میدهد، نه اینودها. -
میتواند سرویسها را از کار بیندازد: اگر یک برنامه نتواند فایل لاگ یا session بسازد، ممکن است crash کند.
-
حل آن دشوار است: بر خلاف فضای دیسک که میتوانید فایلهای بزرگ را حذف کنید، برای آزاد کردن اینود باید تعداد زیادی فایل کوچک را حذف کنید.
-
افزایش تعداد Inode در ext4 ممکن نیست: در ext4 نمیتوانید بعد از ساخت فایلسیستم تعداد اینودها را افزایش دهید. باید فایلسیستم را دوباره بسازید یا به فایلسیستم دیگری مهاجرت کنید.

مقایسه Inode و فضای دیسک
برای درک بهتر تفاوت Inode و فضای دیسک، این جدول را ببینید:
| معیار | فضای دیسک | اینود |
|---|---|---|
| واحد اندازهگیری | بایت، کیلوبایت، گیگابایت | تعداد |
| محدودیت | قابل افزایش با دیسک جدید | ثابت در هر فایلسیستم |
| دستور بررسی | df -h |
df -i |
| مصرفکننده | فایلهای بزرگ | تعداد زیاد فایلهای کوچک |
| راهحل | حذف فایلهای بزرگ | حذف فایلهای کوچک زیاد |
| خطای رایج | Disk full |
No space left on device |
| قابل تغییر بعد از ساخت |
بله (باLVM) |
خیر (درext4) |
نکته جالب: یک فایل ۱ گیگابایتی فقط یک اینود مصرف میکند، اما ۱۰۰۰ فایل ۱ کیلوبایتی 1000 اینود مصرف میکنند. به همین دلیل سرورهای ایمیل، کشها و سیستمهای ذخیرهسازی session بیشتر در معرض خطر تمام شدن اینود هستند.
چگونه مصرف اینود را بررسی کنیم؟
برای دیدن وضعیت اینودها از دستور df -i استفاده کنید:
df -i
خروجی چیزی شبیه این خواهد بود:
| Filesystem | Inodes | IUsed | IFree | IUse% | Mounted on |
|---|---|---|---|---|---|
/dev/sda1 |
6553600 |
623451 |
5930149 |
10% | / |
/dev/sdb1 |
13107200 |
13107200 |
0 |
100% ⚠️ | /var |
ستون IUse% درصد مصرف اینود را نشان میدهد. اگر روی ۱۰۰% باشد، حتی با فضای خالی نمیتوانید فایل بسازید. ستون IFree تعداد اینودهای آزاد را نشان میدهد.
برای پیدا کردن پوشهای که بیشترین تعداد فایل را دارد، از این دستور استفاده کنید:
for i in /var/*; do echo "$i"; find "$i" -xdev -printf '.' | wc -c; done
یا برای پیدا کردن تعداد فایلهای هر پوشه در یک مسیر:
find /var -xdev -type f | cut -d/ -f3 | sort | uniq -c | sort -rn
این دستور تعداد فایلهای هر پوشه سطح اول در /var را به ترتیب نزولی نشان میدهد. معمولاً پوشههایی مثل /var/spool، /var/lib یا /var/cache مقصر هستند.
علل رایج تمام شدن اینود
چند سناریوی رایج که باعث مصرف بیرویه اینود میشوند:
-
session های PHP: اگر
session.save_pathبه درستی پاک نشود، هزاران فایل session کوچک جمع میشوند. -
صف ایمیل: اگر ارسال ایمیل مشکل داشته باشد، فایلهای صف در
/var/spool/mailیا/var/spool/postfixانباشته میشوند. -
لاگهای چرخشی: اگر logrotate به درستی تنظیم نشود، فایلهای لاگ کوچک زیادی ایجاد میشوند.
-
کش برنامهها: برنامههایی مثل Nginx، Varnish یا Redis ممکن است هزاران فایل کش بسازند.
-
فایلهای موقت: اگر
/tmpبه طور دورهای پاک نشود، فایلهای موقت جمع میشوند. -
مخازن کد: پوشه
.gitدر پروژههای بزرگ میتواند دهها هزار فایل کوچک داشته باشد. -
بکاپهای افزایشی: بکاپهایی که هر بار فایلهای کوچک زیادی میسازند.
-
حمله یا باگ: یک اسکریپت معیوب یا حمله DoS میتواند میلیونها فایل خالی بسازد.
جدول علل و راهحلها:
| علت | نشانه | راهحل |
|---|---|---|
جلسههای PHP |
فایلهای زیاد در/var/lib/php/sessions |
تنظیم garbage collector |
| صف ایمیل |
فایلهای زیاد در/var/spool |
بررسی و پاکسازی صف |
| کش برنامه |
رشد سریع اینود در/var/cache |
تنظیم سیاست پاکسازی |
| فایلهای موقت | انباشت در /tmp |
tmpfsیا tmpwatch |
| مخزن Git | پوشه .gitبزرگ |
git gcو shallow clone |
| اسکریپت معیوب | رشد ناگهانی اینود | پیدا و متوقف کردن اسکریپت |
چگونه مشکل اینود را برطرف کنیم؟
وقتی با تمام شدن اینود روبرو میشوید، این مراحل را دنبال کنید:
۱. تشخیص
اول بفهمید کدام پارتیشن پر شده:
df -i
۲. پیدا کردن مقصر
با دستورات زیر پوشههای پر از فایل را پیدا کنید:
find / -xdev -type d -size +100k 2>/dev/null
یا برای پیدا کردن پوشههایی که بیش از ۱۰۰۰۰ فایل دارند:
find / -xdev -type d -printf '%p\n' 2>/dev/null | while read dir; do count=$(find "$dir" -maxdepth 1 -type f | wc -l); if [ "$count" -gt 10000 ]; then echo "$count $dir"; fi; done | sort -rn | head -20
۳. پاکسازی
بعد از پیدا کردن مقصر، فایلهای غیرضروری را حذف کنید:
find /var/spool/postfix -type f -mtime +7 -delete
find /tmp -type f -atime +1 -delete
find /var/lib/php/sessions -type f -mtime +1 -delete
۴. جلوگیری از تکرار
-
logrotate را تنظیم کنید: مطمئن شوید لاگها به موقع چرخش و پاک میشوند.
-
cron job بسازید: یک اسکریپت که هر شب فایلهای قدیمی را پاک کند.
-
tmpfs برای /tmp: اگر رم کافی دارید،
/tmpرا روی tmpfs بگذارید تا با ریبوت پاک شود. -
نظارت بر اینود: یک هشدار در Zabbix یا Prometheus تنظیم کنید که وقتی مصرف اینود از ۸۰% گذشت اطلاع دهد.
-
فایلسیستم مناسب انتخاب کنید: فایلسیستمهایی مثل XFS و Btrfs اینود پویا دارند و این مشکل را ندارند.
۵. افزایش تعداد اینود (اگر ممکن است)
در ext4 نمیتوانید بعد از ساخت، تعداد اینود را افزایش دهید. اما اگر از LVM استفاده میکنید، میتوانید یک فایلسیستم جدید با تعداد اینود بیشتر بسازید و دادهها را منتقل کنید:
mkfs.ext4 -N 10000000 /dev/vg0/newvolume
گزینه -N تعداد اینود دلخواه را تعیین میکند. برای فایلسیستمهایی که فایلهای کوچک زیاد دارند، این کار مفید است.
اینود در فایلسیستمهای مختلف
فایلسیستمهای مختلف رفتار متفاوتی با اینود دارند:
-
ext4: تعداد اینود ثابت در زمان ساخت. پیشفرض یک اینود به ازای هر ۱۶ کیلوبایت فضا.
-
XFS: اینود پویا. هر وقت لازم باشد اینود جدید میسازد، بنابراین مشکل تمام شدن اینود تقریباً وجود ندارد.
-
Btrfs: اینود پویا. مثل XFS.
-
ZFS: اینود پویا و بسیار مقیاسپذیر.
-
tmpfs: اینود بر اساس حافظه موجود.
اگر برنامه شما فایلهای کوچک زیادی میسازد (مثل سرور ایمیل یا کش)، استفاده از XFS یا Btrfs توصیه میشود.
دستورات کاربردی اینود
چند دستور مفید برای کار با اینود:
| دستور | کاربرد |
|---|---|
ls -i file |
نمایش شماره اینود فایل |
df -i |
نمایش وضعیت اینودها |
stat file |
نمایش جزئیات اینود فایل |
find /path -inum 12345 |
پیدا کردن فایل با شماره اینود |
ln file1 file2 |
ساخت hard link (اشتراک اینود) |
debugfs |
بررسی اینودها در ext4 |
tune2fs -l /dev/sda1 |
نمایش تعداد اینودهای فایلسیستم |
مثال stat:
stat report.txt
خروجی شامل شماره Inode ، اندازه، مجوزها، لینکها و زمانهاست.
لینک سخت و لینک نرمادیک: ارتباط با اینود
یکی از مفاهیمی که با اینود گره خورده، لینک سخت (Hard Link) است. وقتی یک hard link میسازید، یک نام جدید به همان اینود اضافه میشود. شمارنده لینک در اینود یک واحد افزایش مییابد. فایل تا زمانی که آخرین لینک حذف شود، روی دیسک باقی میماند. به همین دلیل است که وقتی یک فایل را حذف میکنید، اگر لینک دیگری به آن وجود داشته باشد، دادهها پاک نمیشوند.
لینک نرمادیک یا سمبولیک (Symbolic Link) اما یک فایل جداگانه با Inode خودش است که فقط به مسیر فایل اصلی اشاره میکند. اگر فایل اصلی حذف شود، لینک نرمادیک میشکند.
جدول مقایسه لینکها:
| ویژگی | Hard Link |
Symbolic Link |
|---|---|---|
| اینود | مشترک با فایل اصلی | جداگانه |
| حذف فایل اصلی | فایل باقی میماند | لینک میشکند |
| فضای مصرفی | تقریباً صفر | یک اینود |
| محدودیت فایلسیستم | باید در همان فایلسیستم باشد | میتواند به جای دیگر اشاره کند |
| پوشهها | نمیتوان hard linkساخت |
میتوان symbolic linkساخت |
نکات عملی برای مدیران سیستم
چند توصیه کاربردی برای جلوگیری از مشکلات اینود:
-
همیشه
df -iرا در کنارdf -hبررسی کنید. مانیتورینگ فقط فضای دیسک کافی نیست. -
برای پارتیشنهایی که فایلهای کوچک زیاد دارند، XFS یا Btrfs انتخاب کنید. مثل
/var،/tmpیا پارتیشنهای کش. -
پوشههای موقت را روی tmpfs بگذارید. این کار هم سرعت را بالا میبرد هم با ریبوت پاک میشود.
-
logrotate و سیاستهای پاکسازی را جدی بگیرید. فایلهای لاگ و session را به موقع پاک کنید.
-
هشدار خودکار تنظیم کنید. وقتی مصرف اینود از ۸۰% گذشت، هشدار دریافت کنید.
-
برنامههای خود را بررسی کنید. مطمئن شوید برنامهها فایلهای موقت را پاک میکنند.
-
از inotify استفاده کنید. برای نظارت بر ایجاد فایلهای زیاد در پوشههای حساس.

نتیجهگیری
اینود قلب سیستم فایل لینوکس است. این ساختار داده کوچک اما حیاتی، شناسنامه هر فایل را نگه میدارد و به سیستم اجازه میدهد فایلها را سریع پیدا و مدیریت کند. اما محدودیت تعداد اینود میتواند به یک کابوس تبدیل شود: سیستمی که فضای دیسک فراوان دارد، اما نمیتواند حتی یک فایل کوچک بسازد. به همین دلیل است که میگوییم اینود میتواند از فضای دیسک مهمتر باشد. اگر تعداد اینودهای شما تمام شود، هیچ مقدار فضای خالی نمیتواند مشکل را حل کند.
خبر خوب این است که با نظارت منظم، انتخاب فایلسیستم مناسب و پاکسازی به موقع، میتوانید از این مشکل جلوگیری کنید. دستور df -i را به روتین بررسی روزانه خود اضافه کنید و برای پارتیشنهایی که فایلهای کوچک زیاد دارند، XFS یا Btrfs انتخاب کنید. اگر هنوز از ext4 استفاده میکنید، تعداد اینود را با دقت برنامهریزی کنید و بدانید که بعداً نمیتوانید آن را افزایش دهید. در نهایت، درک اینود نه فقط یک دانستنی فنی، بلکه یک مهارت ضروری برای هر مدیر سیستم و توسعه دهندهای است که با لینوکس کار میکند.