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

ساخت فایل تستی در لینوکس

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

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

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

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

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

dd if=/dev/zero of=testfile.img bs=1M count=100

در این دستور:

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

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

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

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

dd if=/dev/zero of=testfile.img bs=1M count=1024

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

dd if=/dev/zero of=testfile.img bs=1G count=1

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

dd if=/dev/zero of=bigfile.img bs=1M count=4096 status=progress

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

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

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

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

fallocate -l 1G largefile.img

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

fallocate -l 500M testfile.img

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

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

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

fallocate: fallocate failed: Operation not supported

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

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

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

truncate -s 1G testfile.img

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

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

برای مثال:

truncate -s 10G testfile.img

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

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

du -sh testfile.img

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

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

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

دستور dd

dd if=/dev/zero of=testfile.img bs=1M count=1024

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

مناسب برای:

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

fallocate

fallocate -l 1G testfile.img

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

مناسب برای:

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

truncate

truncate -s 1G testfile.img

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

مناسب برای:

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

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

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

ls -lh testfile.img

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

stat testfile.img

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

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

du -sh testfile.img

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

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

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

ابتدا با fallocate:

time fallocate -l 1G test1.img

سپس با dd:

time dd if=/dev/zero of=test2.img bs=1M count=1024

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

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

du -sh test1.img test2.img

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

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

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

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

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

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

sudo chmod 600 /swapfile

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

sudo mkswap /swapfile

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

sudo swapon /swapfile

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

جمع‌بندی

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

نوشتن نظر

نوشتن دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *