وبلاگ نت‌آرامآموزش، تجربه و راهکارهای زیرساخت

فایل را در لینوکس حذف کردم؛ چرا فضای دیسک آزاد نشد؟

علت تفاوت df و du پس از حذف فایل، پیدا کردن فایل باز با lsof و آزادسازی امن فضا بدون پاک‌کردن اتفاقی اطلاعات.

انتشار:
توسط تیم فنی نت‌آرام
۷ دقیقه زمان مطالعه
۰ دیدگاه
محتوای تخصصی، ساده و کاربردی
هماهنگ با هویت حرفه‌ای نت‌آرام
بازگشت به لیست مقالات
تصویر شاخص مقاله فایل را در لینوکس حذف کردم؛ چرا فضای دیسک آزاد نشد؟ در وبلاگ نت‌آرام
محتوای آموزشی وبلاگ نت‌آرام
یک فایل لاگ چندگیگابایتی را از سرور حذف کرده‌اید، اما دستور نمایش فضای دیسک همچنان همان مقدار مصرف را نشان می‌دهد. آیا حذف انجام نشده است؟ یکی از علت‌های رایج این است که یک برنامه هنوز فایل حذف‌شده را باز نگه داشته است. نام فایل از پوشه حذف می‌شود، اما تا زمانی که آخرین استفاده‌کننده آن را نبندد، فضای مربوط ممکن است آزاد نشود.
این تنها علت اختلاف فضای نمایش‌داده‌شده نیست. در ادامه یاد می‌گیریم اول دیسک درست را شناسایی کنیم، سپس وجود فایل باز را با شواهد تأیید کنیم و بدون بستن ناگهانی یک سرویس مهم، راه امن آزادسازی را انتخاب کنیم. نمونه‌ها برای مدیر مجاز لینوکس هستند؛ روی هاست اشتراکی، بسیاری از دستورها در دسترس نیستند و باید از مسئول سرویس کمک بگیرید.

قبل از هر کار، حذف فایل‌های دیگر را متوقف کنید

وقتی دیسک پر است، حذف تصادفی فایل‌های بیشتر می‌تواند پایگاه داده، بکاپ یا اطلاعات مشتری را از بین ببرد. اگر سایت یا پایگاه داده در حال نوشتن است، ابتدا وضعیت سرویس و نسخه پشتیبان قابل بازیابی را در نظر بگیرید. از اجرای دستورهایی که محتوای یک فایل باز را خالی می‌کنند یا پردازش‌ها را دسته‌جمعی می‌بندند، بدون شناخت نتیجه خودداری کنید.
در مثال‌ها مسیر /var فرضی است؛ ممکن است فایل شما در /home، / یا نقطه اتصال دیگری باشد. با حساب دارای مجوز وارد سرور شوید و اگر نیاز به sudo دارید، فقط از حساب مدیریتی مجاز استفاده کنید. نام فایل‌ها و برنامه‌ها می‌توانند اطلاعات داخلی را آشکار کنند؛ پیش از ارسال خروجی، موارد حساس را حذف کنید.

قدم اول: ببینید دقیقاً کدام سیستم‌فایل پر است

این دستور مصرف سیستم‌فایل مربوط به مسیر نمونه را نشان می‌دهد:
کد / دستورdf -hT /var
ستون نوع، حجم، مقدار استفاده‌شده و محل اتصال را بخوانید. اگر فایل شما جای دیگری بوده، همان مسیر را جایگزین /var کنید. ممکن است /var پوشه‌ای روی سیستم‌فایل ریشه باشد و دیسک جدا نداشته باشد؛ محل اتصال خروجی این موضوع را مشخص می‌کند. این دستور مصرف بلوک‌های سیستم‌فایل را گزارش می‌دهد، نه فهرست فایل‌ها را.
اکنون اندازه محتوای قابل دسترس همان محل اتصال را با احتیاط بسنجید. برای نمونه، اگر طبق خروجی قبل محل اتصال واقعاً /var است:
کد / دستورsudo du -xsh /var
این فرمان جمع تقریبی فایل‌های قابل دسترس زیر آن مسیر را نشان می‌دهد و گزینه -x مانع عبور به سیستم‌فایل‌های دیگر می‌شود. پیمایش پوشه بزرگ می‌تواند زمان و منابع بخواهد؛ در سرور حساس، زمان مناسب انتخاب کنید. اگر محل اتصال / است، با انتخاب مسیر صحیح و درک بار پیمایش عمل کنید. مقایسه زیرپوشه /var با کل فضای / نتیجه معتبری نمی‌دهد.
اختلاف این دو عدد می‌تواند سرنخی برای فایل حذف‌شده باز باشد، اما اثبات قطعی نیست. فضای رزروشده سیستم‌فایل، snapshot، داده خارج از مسیر بررسی‌شده، فایل‌های مخفی زیر mount، روش محاسبه و تغییر هم‌زمان فایل‌ها نیز می‌توانند اختلاف ایجاد کنند. ابتدا مرحله بعد را اجرا کنید.

قدم دوم: فایل‌های حذف‌شده اما باز را پیدا کنید

اگر ابزار lsof نصب است، دستور زیر را اجرا کنید:
کد / دستورsudo lsof +L1
این فرمان فایل‌های باز با شمار پیوند کمتر از یک را فهرست می‌کند. نام برنامه در ستون COMMAND، شناسه پردازش در PID، اندازه تقریبی در ستون SIZE/OFF و نام یا مسیر در NAME دیده می‌شود. ترتیب ستون‌ها بسته به نسخه و عرض صفحه فرق می‌کند. یک فایل ممکن است در چند ردیف برای چند پردازش یا چند شناسه فایل دیده شود؛ اندازه آن ردیف‌ها را بدون بررسی، چند بار جمع نکنید.
به دنبال فایل بزرگی بگردید که روی همان سیستم‌فایل موردنظر بوده و نامش با (deleted) دیده می‌شود. مقدار SIZE/OFF همیشه معادل دقیق بلوک اشغال‌شده روی دیسک نیست؛ فایل sparse، روش ذخیره و وضعیت سیستم‌فایل می‌توانند تفاوت بسازند. بنابراین عدد را با تغییر واقعی df بعد از آزادسازی تأیید کنید. راهنمای lsof معنی گزینه +L1 را توضیح می‌دهد.
اگر فرمان پیدا نشد، ابزار ممکن است نصب نباشد. از مدیر سرور بخواهید با بسته رسمی توزیع و در زمان مناسب آن را فراهم کند؛ نصب از فایل ناشناس یا اجرای اسکریپت اینترنتی برای آزادکردن فضا کار امنی نیست. اگر خروجی خالی است، با مجوز کافی دوباره آن را ببینید و سپس سراغ علت‌های دیگر بروید؛ خالی‌بودن خروجی ثابت نمی‌کند همه مصرف دیسک بی‌علت است.

قدم سوم: پردازش را بشناسید، نه اینکه همان لحظه آن را ببندید

برای مثال اگر lsof شناسه فرضی 1234 را نشان داده، ابتدا جزئیات آن را با شناسه واقعی خودتان ببینید:
کد / دستورps -p 1234 -o pid,ppid,user,cmd
این دستور نام کاربر، والد و فرمان پردازش را نمایش می‌دهد. عدد مثال را بی‌دلیل روی سرور اجرا نکنید؛ شناسه پردازش‌ها در هر سیستم متفاوت است و ممکن است با گذشت زمان دوباره استفاده شود. جزئیات اجرای فرمان گاهی حاوی اطلاعات حساس‌اند.
اکنون مشخص کنید این پردازش به کدام سرویس، کانتینر یا برنامه تعلق دارد و بستن آن چه اثری دارد. ممکن است یک کارگر وب بدون اختلال زیاد جایگزین شود، اما بستن پایگاه داده یا برنامه در حال پردازش سفارش خطر از دست رفتن کار و قطع سرویس دارد. اگر چند پردازش همان فایل را نگه داشته‌اند، بستن یکی از آن‌ها الزاماً فضا را آزاد نمی‌کند.

قدم چهارم: راه امن بستن فایل را انتخاب کنید

برای فایل لاگ، ابتدا مستندات همان برنامه را برای بازکردن دوباره فایل لاگ یا چرخش لاگ بخوانید. بعضی برنامه‌ها یک فرمان یا روش reload مشخص دارند که بدون توقف کامل، فایل قبلی را می‌بندد و فایل جدید را باز می‌کند. دستور و اثر آن برای همه برنامه‌ها یکسان نیست؛ ارسال سیگنال تصادفی به یک PID می‌تواند برنامه را متوقف کند. پس فقط روش تأییدشده همان برنامه و نسخه را به کار ببرید.
اگر بازکردن دوباره پشتیبانی نمی‌شود، مدیر سرویس می‌تواند با توجه به نوع کار، نسخه پشتیبان و زمان مناسب، راه‌اندازی مجدد همان سرویس را برنامه‌ریزی کند. نام سرویس را از سیستم خودتان شناسایی کنید و اثر آن را پیش از اجرا بسنجید. برای پایگاه داده، کار صف یا سیستم فروشگاهی ابتدا از پایان امن تراکنش‌ها و برنامه بازگشت مطمئن شوید. ریستارت کل سرور صرفاً برای بستن یک فایل، آخرین راه و همراه با اختلال است، نه قدم اول.
پس از بسته‌شدن آخرین ارجاع، سیستم می‌تواند فضای فایل حذف‌شده را آزاد کند. طبق راهنمای سیستم‌عامل لینوکس درباره بستن فایل، آزادسازی نهایی به بسته‌شدن آخرین ارجاع بستگی دارد. اگر فایل دیگری هنوز باز است یا مصرف تازه‌ای ایجاد شده، افزایش فضای آزاد ممکن است کمتر از انتظار باشد.

قدم پنجم: نتیجه را واقعاً اندازه بگیرید

دوباره sudo lsof +L1 و سپس df -hT /var را با همان مسیر و شرایط قبلی اجرا کنید. انتظار دارید ردیف مربوط دیگر دیده نشود و اگر عامل اصلی همان فایل بوده، فضای قابل استفاده سیستم‌فایل بیشتر شود. اگر ردیف از بین رفته اما فضا برنگشته، بررسی کنید فایل واقعاً روی همان سیستم‌فایل بوده است یا نه و سایر علت‌ها مانند snapshot، فایل‌های بزرگ دیگر یا فضای رزروشده را بررسی کنید.
اگر خطا درباره تعداد فایل‌هاست، فضای حجمی کافی هم ممکن است کمکی نکند. دستور df -i /var تعداد inodeهای مصرف‌شده را نشان می‌دهد؛ برای این وضعیت راهنمای افزایش تعداد فایل‌های لاگ و پرشدن inode مسیر جداگانه‌ای دارد. اگر خطا quota exceeded است نیز سهمیه کاربر می‌تواند جدا از فضای آزاد کل باشد؛ راهنمای سهمیه دیسک لینوکس را ببینید.
برای جلوگیری از تکرار، چرخش و نگهداری لاگ را مطابق برنامه تنظیم کنید، مصرف همان سیستم‌فایل را پایش کنید و پیش از حذف دستی فایلِ در حال استفاده، روش رسمی برنامه را بشناسید. مشخصات سرور مجازی ایران نت‌آرام در صفحه سرویس آمده است؛ بزرگ‌ترکردن دیسک بدون شناخت روند رشد لاگ، علت اصلی را از بین نمی‌برد.
اشتراک‌گذاری:
لینکدینتلگرامایکس

دیدگاه‌ها (۰)

دیدگاه‌های تاییدشده و پاسخ‌های تیم نت‌آرام