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

در این بخش مقدمه‌ای بر نظریه مجازی سازی ارائه‌شده است. در این متن هایپروایزر به نرم‌افزاری اطلاق می‌شود که مسئول ساخت، مدیریت و زمان‌بندی ماشین‌های مجازی (Virtual Machines – VM) است.

چرا مجازی سازی مهم است؟

از فناوری مجازی سازی به‌طور وسیعی استفاده می‌شود. شالوده تقریباً تمامی سامانه‌های محاسبات ابری و زیرساخت‌های تجاری، مجازی سازی است. اجرای چند سیستم‌عامل به‌طور هم‌زمان بر روی یک ماشین از طریق مجازی‌سازی امکان‌پذیر است. مجازی‌سازی امکان اجرا و تست نرم‌افزارها را بدون مواجه با مخاطره آسیب‌رسانی به ماشین اصلی به دست می‌دهد.

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

جداسازی

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

دسترس پذیری بالا

مجازی‌سازی امکان مهاجرت شفاف بار کاری میان ماشین‌های فیزیکی را به دست می‌دهد. از این تکنیک برای انتقال بار کاری از سخت‌افزار دچار خرابی به سخت‌افزار سالم برای تعمیر و جایگزینی استفاده می‌شود. (البته مسئله به این سادگی‌ها هم نیست؛ صرف مجازی سازی امکان HA به شما نمی‌دهد و نیاز به تجهیزات نرم‌افزار و پیکربندی بیشتری است)

توزان بارکاری

برای بهینه‌سازی استفاده از سخت‌افزار و سهمیه مصرف توان مرکز داده، مهم است که بتوان از سخت‌افزار تا حد امکان استفاده کرد. این مهم نیز از طریق مهاجرت ماشین‌های مجازی میان ماشین‌های فیزیکی و یا میزبانی ماشین‌های مجازی با بار کاری مناسب در یک ماشین فیزیکی حاصل می‌شود. به این وسیله از حداکثر ظرفیت ماشین فیزیکی می‌توان استفاده کرد و تأمین‌کنندگان مراکز داده می‌توانند بهترین کارایی را به مشتریان خود ارائه دهند. (می‌خواهیم سخت‌افزار هیچ‌وقت بیکار نباشد. برای همین هم ماشین مجازی‌های کم‌کار را کنار هم در یک ماشین راه‌اندازی می‌کنیم تا از منابع سخت‌افزاری حداکثر استفاده را داشته باشیم.)

جعبه شن

از ماشین‌های مجازی می‌توان به‌عنوان جعبه شن (sandbox) برای اجرای برنامه‌های کاربردی دیگر بدون ایجاد مزاحمت برای برنامه‌های دیگر در حال اجرا بر روی آن استفاده کرد. به‌عنوان نمونه می‌توان به برنامه‌های کاربردی قدیمی و یا نرم‌افزارهای درحال‌توسعه اشاره کرد. اجرای چنین برنامه‌هایی در ماشین مجازی از بروز اختلال در عملکرد سایر برنامه‌ها در سیستم در اثر باگ و یا رفتارهای مخرب برنامه، جلوگیری می‌کند.

هایپروایزهای مستقل و میزبانی شده

هایپروایزها به دو دسته عمده تقسیم می شوند. هایپروایزرهای مستقل یا نوع ۱ (Type 1) و هایپروایزرهای میزبانی شده یا نوع ۲ (Type 2).

ابتدا نگاهی به هایپروایزرهای میزبانی‌شده (نوع ۲) بیاندازیم. در پیکربندی هایپروایزر نوع ۲، سیستم‌عامل میزبان کنترل کامل بر روی پلتفرم سخت‌افزار و تمامی منابع آن (شامل CPU و حافظه اصلی) را در دست دارد. دیاگرام زیر هایپروایزر میزبانی‌شده (نوع ۲) را نشان می‌دهد.

مجازی سازی هایپروایزر نوع 2 (میزبانی شده)
هایپروایزر میزبانی شده (نوع ۲)

نرم‌افزارهایی نظیر VirtualBox یا VMWare Workstation در دسته هایپروایزرهای میزبانی‌شده محسوب می‌شوند. سیستم‌عامل که به آن سیستم‌عامل میزبان گفته می‌شود بر روی سخت‌افزار نصب می‌شود. هایپروایزر بر روی سیستم‌عامل میزبان نصب‌شده و از امکانات آن برای مدیریت سخت‌افزار استفاده می‌کند. هایپروایزر میزبان ماشین‌های مجازی می‌شود. بر روی ماشین‌های مجازی سیستم‌عامل مهمان نصب و اجرا می‌شود.

حال نگاهی به هایپروایزر مستقل (نوع ۱) بیاندازیم.

مجازی سازی هایپروایزر نوع 1 (مستقل)
هایپروایزر مستقل (نوع ۱)

همان‌طور که در تصویر بالا پیداست هیچ سیستم‌عامل میزبانی وجود ندارد. هایپروایزر مستقیماً بر روی سخت‌افزار اجراشده و کنترل کامل پلتفرم سخت‌افزاری و منابع آن را (شامل CPU و حافظه اصلی) در دست دارد. مشابه هایپروایزر میزبانی‌شده، هایپروایزر مستقل می‌تواند میزبان ماشین‌های مجازی باشد. بر روی ماشین‌های مجازی سیستم‌عامل‌های مهمان نصب و اجرا می‌شوند.

دو هایپروایزر متن‌باز و پراستفاده پلتفرم‌های ARM، هایپروایزر Xen (مستقل، نوع ۱) و KVM (میزبانی‌شده، نوع ۲) هستند. ما از این دو هایپروایزر برای تشریح برخی نکات در این متن استفاده می‌کنیم. علاوه بر این دو هایپروایزرهای دیگری نیز برای ARM وجود دارد.

مجازی سازی کامل و para-virtualization

طبق تعریف کلاسیک، ماشین مجازی یک محیط جدا و ایزوله محاسباتی است که از ماشین فیزیکی واقعی قابل‌تشخیص نباشد. بااینکه شبیه‌سازی کامل یک ماشین واقعی بر روی سیستم مبتنی بر ARM امکان‌پذیر است، اما این روش غالباً کارایی لازم را ندارد. بنابراین این نوع شبیه‌سازی غالباً انجام نمی‌شود. به‌عنوان‌مثال شبیه‌سازی یک دستگاه Ethernet واقعی کند است، چراکه هر دسترسی به ثبات شبیه‌سازی‌شده به‌وسیله سیستم‌عامل مهمان باید از طریق هایپروایزر انجام شود. این کار هزینه بیشتری نسبت به دسترسی به ثبات‌های دستگاه واقعی دارد.

جایگزین مناسب‌تری که معمولاً از آن برای بهبود کارایی استفاده می‌شود، دادن آگاهی به سیستم‌عامل مهمان است. درصورتی‌که سیستم‌عامل مهمان بداند بر روی ماشین مجازی اجراشده است و با ارائه دستگاه‌های مجازی که برای کارایی خوب طراحی و در هایپروایزر شبیه‌سازی‌شده‌اند می‌توان به کارایی خوبی دست‌یافت.

اگر بخواهیم دقیق صحبت کنیم، مجازی‌سازی کامل سیستم یک ماشین فیزیکی واقعی را شبیه‌سازی می‌کند. در مقابل پروژه متن‌باز Xen مفهوم Para-Virtualization را معرفی می‌کند. در این نوع مجازی‌سازی بخش‌های مرکزی سیستم‌عامل مهمان دست‌کاری می‌شوند (بخشی از کد سیستم‌عامل مهمان را تغییر می‌دهند. سیستم عامل ها معمولا چند نسخه ارائه می دهند یک نسخه برای نصب مستقیم بر روی سخت افزار و نسخه های دیگر هم دستکاری شده برای هایپروایزرهای مختلف) تا بتوان آن‌ها را بجای ماشین فیزیکی بر روی یک ماشین مجازی اجرا کرد. این دست‌کاری عهده‌دار بهبود کارایی می‌شود. (البته انواع دیگر مجازی‌سازی هم وجود دارد. در این متن تنها به این دو مجازی‌سازی اشاره‌شده است اگر فرصتی پیش آمد در مورد انواع دیگر مجازی‌سازی هم‌صحبت خواهیم کرد)

امروزه، در اغلب معماری‌ها که از مجازی سازی به‌صورت سخت‌افزاری پشتیبانی می‌کنند (مثل ARM)، سیستم‌عامل مهمان در غالب عملکرد خود بدون دست‌کاری اجرا می‌شوند. (عملکردهایی که سیستم را به مخاطره نمی‌اندازند) سیستم‌عامل مهمان فکر می‌کند که بر روی یک سخت‌افزار واقعی اجرا می‌شود مگر برای درایورهای دستگاه‌های I/O جانبی نظیر شبکه و دستگاه‌های ذخیره‌سازی؛ در این موارد سیستم‌عامل مهمان از درایورها و دستگاه‌ها مجازی سازی شده (paravirtualized) استفاده می‌کند. به‌عنوان نمونه از این دستگاه‌های مجازی می‌توان به Virtio و Xen PV Bus اشاره کرد.

ماشین های مجازی و پردازنده های مجاری

مهم است که تفاوت میان ماشین مجازی (Virtual Machine – VM) و پردازنده مجازی (Virtual CPU – vCPU) مشخص شود. ماشین مجازی شامل یک یا تعداد بیشتری پردازنده مجازی است. این مفهوم در تصویر زیر نشان داده‌شده است:

مجازی سازی VM و vCPU
ماشین مجازی و پردازنده مجازی

تمییز میان VM و vCPU زمانی مهم می‌شود که به موضوعات دیگری در این سری از پست‌ها برسیم. برای مثال یک صفحه (page) از حافظه را می‌توان به یک ماشین مجازی تخصیص داد و از این طریق برای تمامی پردازنده‌های مجازی درون ماشین مجازی در دسترس خواهد بود. هرچند یک وقفه مجازی که در یک پردازنده مجازی هدف‌گذاری شده، تنها به همان پردازنده مجازی می‌رود.

پایان قسمت اول

مطالب مرتبط:
بررسی مقاله: Unikernels: The Next Stage of Linux’s Dominance
بررسی مقاله: My VM is Lighter (and Safer) than your Container – ویدیو