آموزش ساخت فایل تستی با حجم دلخواه در لینوکس

در بسیاری از مواقع هنگام مدیریت سرور لینوکس لازم است یک فایل با حجم مشخص ایجاد کنیم. برای مثال ممکن است بخواهیم سرعت نوشتن روی دیسک را بررسی کنیم، فضای دیسک را تا یک مقدار مشخص پر کنیم، یک فایل بزرگ برای تست نرم‌افزار ایجاد کنیم یا رفتار یک برنامه را در مقابل فایل‌های حجیم بررسی کنیم.

برای این کار نیازی نیست یک فایل واقعی با محتوای مشخص داشته باشیم. لینوکس ابزارهایی مانند dd، fallocate و truncate در اختیار ما قرار می‌دهد که هرکدام روش متفاوتی برای ایجاد فایل با حجم دلخواه دارند.

ساخت فایل تستی با dd

یکی از شناخته‌شده‌ترین روش‌ها برای ساخت فایل با حجم مشخص در لینوکس استفاده از دستور dd است.

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

در این دستور:

  • if فایل یا منبع ورودی را مشخص می‌کند.
  • of نام فایل خروجی است.
  • bs اندازه هر بلوک خواندن و نوشتن را تعیین می‌کند.
  • count تعداد بلوک‌هایی است که باید نوشته شوند.
  • dev/zero/ منبعی است که داده‌های صفر تولید می‌کند.

در مثال بالا، 100 بلوک یک مگابایتی نوشته می‌شود و در نتیجه فایلی با حجم 100 مگابایت ایجاد خواهد شد.

ساخت فایل یک گیگابایتی

برای ایجاد یک فایل 1 گیگابایتی می‌توانیم بنویسیم:

یا به شکل ساده‌تر:

اگر فایل بزرگی ایجاد می‌کنید، گزینه status=progress امکان مشاهده میزان پیشرفت عملیات را فراهم می‌کند:

مزیت مهم dd این است که داده واقعا روی دیسک نوشته می‌شود. بنابراین این روش برای تست عملکرد نوشتن دیسک مناسب است، چون عملیات واقعی I/O انجام می‌شود.

ساخت سریع فایل با fallocate

اگر فقط به یک فایل با حجم مشخص نیاز دارید و محتوای فایل برایتان اهمیتی ندارد، fallocate معمولا گزینه سریعتری است.

برای ایجاد فایل 1 گیگابایتی:

برای فایل 500 مگابایتی:

مزیت اصلی fallocate سرعت بالای آن است. این دستور به جای نوشتن تک‌تک داده‌ها، فضای موردنیاز فایل را در سطح فایل‌سیستم رزرو می‌کند. به همین دلیل ایجاد فایل‌های حجیم با آن بسیار سریع‌تر از dd انجام می‌شود.

پس اگر هدف شما ایجاد سریع یک فایل بزرگ برای تست برنامه، دیسک یا فضای ذخیره‌سازی است و نیازی به پر شدن فایل با داده واقعی ندارید، fallocate انتخاب مناسبی است.

البته پشتیبانی از تخصیص فضا به این روش به فایل‌سیستم بستگی دارد. در برخی محیط‌ها ممکن است با خطای زیر مواجه شوید:

در چنین شرایطی می‌توان از dd استفاده کرد.

ساخت فایل حجیم با truncate

روش سوم استفاده از دستور truncate است:

این دستور از نظر سرعت بسیار سریع است، اما یک تفاوت مهم با dd و fallocate دارد.

truncate فقط اندازه فایل را در متادیتای فایل‌سیستم تنظیم می‌کند و حتما فضای واقعی دیسک را برای کل فایل رزرو نمی‌کند. به این نوع فایل، Sparse File یا فایل تنک گفته می‌شود.

برای مثال:

ممکن است ls فایل را 10 گیگابایتی نشان دهد، اما فضای واقعی بسیار کمتری از دیسک اشغال شده باشد.

برای بررسی فضای واقعی مصرف‌شده می‌توان از du استفاده کرد:

بنابراین truncate برای زمانی مناسب است که فقط به یک فایل با اندازه مشخص نیاز دارید و محتوای واقعی یا رزرو فضای دیسک برایتان مهم نیست.

تفاوت dd، fallocate و truncate چیست؟

تفاوت این سه دستور را می‌توان به شکل ساده این‌طور در نظر گرفت:

دستور dd

داده واقعی روی دیسک نوشته می‌شود.

مناسب برای:

  • تست سرعت نوشتن دیسک
  • ایجاد فایل با داده واقعی
  • ساخت فایل Swap
  • تست عملکرد ذخیره‌سازی
  • محیط‌هایی که fallocate پشتیبانی نمی‌شود

fallocate

فضای فایل‌سیستم برای فایل رزرو می‌شود، بدون اینکه تمام محتوای فایل به صورت معمول نوشته شود.

مناسب برای:

  • ایجاد سریع فایل‌های حجیم
  • فایل‌های تستی
  • فایل‌های Image ماشین مجازی
  • رزرو فضای دیسک
  • ایجاد فایل‌های از پیش اندازه‌گذاری‌شده

truncate

اندازه فایل تنظیم می‌شود، اما فایل می‌تواند Sparse باشد و تمام فضای آن از ابتدا روی دیسک اختصاص پیدا نکند.

مناسب برای:

  • فایل‌های آزمایشی
  • تست نرم‌افزار
  • ایجاد فایل‌های Placeholder
  • افزایش یا کاهش اندازه فایل

چگونه حجم فایل را بررسی کنیم؟

بعد از ایجاد فایل می‌توان با دستور زیر اندازه آن را مشاهده کرد:

برای مشاهده اندازه دقیق فایل بر حسب بایت نیز می‌توان از stat استفاده کرد:

در خروجی stat مقدار Size اندازه فایل و مقدار Blocks تعداد بلوک‌های واقعا تخصیص‌یافته روی دیسک را نشان می‌دهد. این تفاوت برای فایل‌های Sparse اهمیت زیادی دارد.

برای مقایسه فضای واقعی مصرف‌شده می‌توان از دستور زیر استفاده کرد:

به عنوان مثال ممکن است فایل ایجادشده با truncate اندازه 1 گیگابایت داشته باشد، اما مقدار بسیار کمتری از فضای واقعی دیسک را مصرف کند.

یک تست ساده برای مقایسه ابزارها

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

ابتدا با fallocate:

سپس با dd:

در روش اول سیستم‌عامل فضای موردنیاز را تخصیص می‌دهد، اما در روش دوم داده واقعی نوشته می‌شود. به همین دلیل زمان اجرای آنها می‌تواند تفاوت قابل‌توجهی داشته باشد.

بعد می‌توان میزان فضای مصرفی را بررسی کرد:

این آزمایش روش خوبی برای درک تفاوت بین نوشتن واقعی داده، تخصیص فضای دیسک و فایل Sparse در لینوکس است.

برای ساخت فایل Swap از کدام روش استفاده کنیم؟

اگر هدف ساخت فایل Swap است، نباید از truncate استفاده کرد، چون فایل Sparse برای Swap مناسب نیست.

یک روش رایج استفاده از dd است:

سپس مجوز فایل را محدود می‌کنیم:

فایل را به عنوان Swap آماده می‌کنیم:

و در نهایت آن را فعال می‌کنیم:

برای فعال ماندن Swap بعد از ریستارت هم باید آن را در etc/fstab/ تعریف کرد. انتخاب روش ساخت Swap به فایل‌سیستم و شرایط سرور بستگی دارد، اما truncate گزینه مناسبی برای این کار نیست.

جمع‌بندی

انتخاب دستور مناسب برای ایجاد فایل تست در لینوکس به هدف شما بستگی دارد. اگر قصد دارید نوشتن واقعی داده روی دیسک و عملکرد I/O را آزمایش کنید، dd گزینه مناسبی است. برای ایجاد سریع یک فایل بزرگ و تخصیص فضای آن روی دیسک، می‌توانید از fallocate استفاده کنید و اگر فقط به فایلی با اندازه مشخص نیاز دارید و مصرف واقعی فضای دیسک اهمیت ندارد، truncate انتخاب مناسبی خواهد بود. توجه به این تفاوت‌ها در مدیریت سرور اهمیت دارد، زیرا اندازه ظاهری یک فایل حتما برابر با فضای واقعی تخصیص‌یافته روی دیسک نیست.