از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
آزاد کردن فضای دیسک Thin در ESx ( لینوکس و ویندوز )
سرفصلهای مطلب
وقتی ماشین های مجازی داشته باشید که دیسک آنها بصورت thin باشد ( Thin Provisioned Disks ) احتما توجه کردهاید که سایز آنها همیشه با افزایش داده ها رشد میکند اما با پاک کردن اطلاعات مجدد کوچک نمیشود ! در حال حاظر vmware روش خودکاری برای Space Reclamation یا آزاد سازی مجدد فضا ندارد اما خوشبختانه ابزارهایی وجود دارند که با استفاده از آنها میتوانید فضای آزاد شده روی دیسک سرور مجازی را مجدد به فضای استفاده نشده Datastore خود اضافه کنید،
بروزرسانی : در نسخه 6 ESX دستوری به نام unmap به مجموعه دستورات esxcli اضافه شده است که به شما امکان صدور دستور آزاد سازی فضا در کل یک volume را میدهد
یکی از نقاط منفی روش ذکر شده در این مطلب این است که باید ماشین مجازی مد نظر را خاموش کنید ( که البته فکر نمیکنم راه دیگری در حال حاظر وجود داشته باشد)
فرمت کلی این کار و دستورات لازم به شکل زیر است که در مطلب دیگری به آن خواهم پرداخت ، البته بصورت پیشفرض در صورتی که سرور جدید نصب کرده باشید و نسخه VMFS6 باشد آزاد سازی خودکار فضا با اولویت پائین ( 25MB تا 50MB در ثانیه ) می باشد که البته در CLI میتوانید آن را تا 3 برابر ( high ) افزایش بدهید
esxcli storage vmfs unmap
خوب برای شروع باید فضای آزاد روی دیسک های ماشین مجازی را با 0 پر کنیم ، اما ابتدا اطلاعاتی در خصوص محیط سرور و volume ها نیاز داریم
گام یکم : بررسی و جمع آوری اطلاعات دیسکها
دستور زیر را برای بررسی اطلاعات datasoreای که ماشین روی آن در حال اجراست بدست بیاوریم ، اطلاعات اصلی که ممکن است نیاز داشته باشیم را bold کرده ام .
# esxcli storage core device list –d naa.60a98000572d54724a346a6170627a52n
aa.60a98000572d54724a346a6170627a52 Display Name: Hitachi Fibre Channel Disk (naa.60a98000572d54724a346a6170627a52) Has Settable Display Name: true Size: 51200 Device Type: Direct-Access Multipath Plugin: NMP Devfs Path: /vmfs/devices/disks/naa.60a98000572d54724a346a6170627a52 Vendor: HITACHI Model: LUN
Revision: 8020
SCSI Level: 4 Is Pseudo: false Status: on Is RDM Capable: true Is Local: false Is Removable: false Is SSD: false Is Offline: false Is Perennially Reserved: false
Thin Provisioning Status: yes
Attached Filters: VAAI_FILTER VAAI Status: supported Other UIDs: vml.020033000060a98000572d54724a346a6170627a524c554e202020
همانطور که مشاهده میکنید این Device برای Thin بودن ست شده و VAAI هم پشتیبانی می کند . حالا میتوانیم دستوری که برای بدست آوردن پارامترهای VAAI در کنترلر دیسک ها اجرا کنیم ، بصورت کلی با اجرای این دستور باید ببینم آیا کنترل دیسک از UNMAP کردن پشتیبانی می کند و متیواند فضاهای مرده را مجدد آزاد کند
esxcli storage core device vaai status get -d <naa>
naa.60a98000572d54724a346a6170627a52
VAAI Plugin Name: VMW_VAAIP_HDS
ATS Status: supported
Clone Status: supported
Zero Status: supported
Delete Status: supported
همانطور که مشاهده میکنید Device از حذف Delete پشتیبانی میکند بنابران قابلیت ارسال دستورات UNMAP SCSI را زمانی که عملیات آزاد سازی فضا درخواست شود دارد
گام دوم : “واقعا ” فضای خالی را پاک کنید
آزاد سازی فضای دیسک در فایل سیستم ها زمانی میتواند اتفاق بی افتد که دیسک های مجازی واقعا خالی باشند ، همانطور که میدانید پاک کردن داده فقط اطلاعات آن را از file allocation table پاک میکند ، اما بلاک آزاد شده را 0 نمیکند .در نتیجه ESXi همچنان فکر میکند که آن بلوک داده همچنان در حال استفاده است .
برای آزاد کردن فضا ( نوشتن ضفر روی دیسک ) در ویندوز و لینوکس ابزارهایی وجود دارد
Zero کردن فضای خالی دیسک ماشین مجازی در Windows
برنامه SDelete را دانلود کنید ، این دستور امکانات قدرتمندی دارد که میتواند فضای های خالی را ردیابی و پاک سازی کند ، شما متوجه فضای قابل استفاده در داخل VM خود نمی شوید ، اما این به vmware این قابلیت را میدهد که فضای های بلااستفاده را شناسایی کرده و فضای های بلا استفاده را آزاد کند و مجدد در datastore قابل استفاده کند
CMD را As Administrator (elevated) اجرا کنید و Sdelete را اجرا کنید
sdelete.exe -z [drive:]
عبارت [drive:] را با پارتیشن مد نظر خود جایگزین کنید ، توجه کنید که شما میتوانید روی یک دیسک چندین پارتیشن داشته باشید ، و باید این عملیات را برای همهپارتیشن ها اجرا کنید تا بصورت کامل موثر باشد.
Zero کردن فضای خالی دیسک ماشین مجازی Linux
لینوکس روش متفاوتی برای دستیابی به هدف فوق دارد ، بسته به فایل سیستمی که داریم ابزارهای متفاوتی برای این کار وجود دارد اما یکی از آنها که همیشه برای خالی کردن فضا با یک فایل پر از صفر کار خواهد کرد dd است !
ابتدا مطمئن شوید که همه سرویس هایی که ممکن است اطلاعاتی روی دیسک بنویسند را متوقف کنید تا مشکلی به جهت پر شدن کامل آن پارتیشن ایجاد نشود ، سپس مطابق دستور زیر از dd استفاده کنید تا کل فضا را با صفر پر کنید
$ dd if=/dev/zero of=/[mounted-volume]/zeroes && rm -f /[mounted-volume]/zeroes
عبارت [mounted-volume] را با مسیر مانت شده دیسک خود جایگزین کنید مثلا / یا /home ، و باز مانند ویندوز اگر روی فقط یک دیسک جنیدن پارتیشن دارید باید برای همه آنها دستور را اجرا کنید، در غیر این صورت همه بلوک ها با صفر پر نخواهند شد و نتیجه دلخواه و کامل حاصل نمی شود .
گام سوم : reclaim و آزاد کردن فضای دیسک در ESX
برای خالی کردن فضا و آزاد شدن آن در Datastore لازفرض بر این است که نوع دیسک شما Thin است و سپس دستورات ذکر شده در این بخش را اجرا کنید.
وقتی که فایل پر شده با صفر را پاک کردید ( مطمئن شوید فایل پاک شده و در سیستم عامل ماشین فضای آزاد را به شکل واقعی می بینید ) حالا وقت آن است که واقعا آنرا خالی کنیم ، این کار با پانج کردن صفرهای دیسک روی فایل VMDK انجام میشود.
ابتدا ماشین مجازی مد نظر را خاموش کنید و با ssh به کنسول سرور ESXi خود متصل شوید ، سپس با دستور cdبه مسیر و سپس دستور vmkfstools را با پارامترهای زیر اجرا کنید
vmkfstools -K [disk].vmdk
عبارت [disk] را با اسم فایل دیسک ماشین مجازی خود جایگرین کنید ، این فایل معمولا flat VMDK آدرس دهی میشود ، شما باید فایل Descriptor را که بدون -flat است را قرار بدهید یعنی اگر اسم دیسک شما هست
rasanegar-vm-flat.vmdk باید فایل rasanegar-vm.vmdk را در آدرس فوق قرار بدهید
با اجرای دستور فوق خروجی مانند زیر شروع به نمایش مقدار پیشرفت میکند که بسته به حجم دیسک و سرعت Storage شما می تواند چند دقیقه تا چندین ساعت ، حتی روز ! طول بکشد.
vmkfstools -K rasanegar-vm.vmdk vmfsDisk: 1, rdmDisk: 0, blockSize: 1048576 Hole Punching: 100% done.
نکته مهم :
همانطور که حتما متوجه شده اید ، اقدامات فوق روی دیسک های ایجاد شده بصورت thin کار میکند و در صورتی که دیسکی را بصورت Thick ایجاد کرده باشید با خطای زیر مواجه خواهید شد
Hole Punching: 0% done.Could not punch hole in disk 'rasanegar-vm2.vmdk': Function not implemented
موفق باشید