−25%

روی پرداخت سالانه Windows، تا ۳۱ اکتبر. مشاهده پلن‌ها

EQVPS
شروع کنید

توضیح ساده دربارهٔ Firecracker microVM: یک ماشین مجازی واقعی که در کسری از ثانیه بوت می‌شود

18 مهر 1405 · 5 دقیقه مطالعه · EQVPS Team

اگر دربارهٔ اجرای امن کدی که هوش مصنوعی تولید کرده چیزی خوانده باشید، واژهٔ microVM را دیده‌اید، معمولاً کنار Firecracker. معمولاً یا به‌عنوان «ماشین مجازی سبک» توضیح داده می‌شود (درست، ولی بی‌فایده) یا با نموداری از درونیات هسته. این نسخهٔ میانه است.

دو گزینهٔ قدیمی‌تر، و چرا هیچ‌کدام مناسب نیست

از دو چیزی شروع کنید که microVM بینشان قرار می‌گیرد.

کانتینر گروهی از فرایندهای معمولی روی ماشین شماست که هسته پذیرفته به آن‌ها «دروغ بگوید». namespaces به آن‌ها فایل‌سیستم، فهرست فرایندها و شبکهٔ مخصوص خودشان را نشان می‌دهند؛ cgroups مقدار CPU و حافظه‌ای را که می‌توانند مصرف کنند محدود می‌کند. در چند میلی‌ثانیه راه می‌افتد چون هیچ چیز تازه‌ای بوت نمی‌شود. اما همهٔ کانتینرهای یک میزبان با یک هستهٔ واحد حرف می‌زنند. باگی در هسته که از داخل یک کانتینر در دسترس باشد، راه خروج از همهٔ آن‌هاست.

ماشین مجازی هستهٔ خودش را می‌آورد. CPU میزبان از طریق مجازی‌سازی سخت‌افزاری (KVM در Linux) مهمان را طوری اجرا می‌کند که انگار رایانهٔ خودش را دارد. مرز، هایپروایزر است که بسیار کمتر از صدها فراخوانی سیستمی هسته را در معرض قرار می‌دهد. بهای آن، سنگینی است. یک ماشین مجازی کلاسیک کل یک PC را شبیه‌سازی می‌کند: فرم‌ور، گذرگاه PCI، کنترلرهای USB، کارت گرافیک و گاهی کارت صدا. از میان همهٔ این‌ها بوت می‌شود، از چند ثانیه تا چند دقیقه طول می‌کشد، و هر نمونه ده‌ها یا صدها مگابایت سربار با خود دارد.

تشبیهی که نسبتاً خوب جواب می‌دهد: کانتینرها آپارتمان‌های یک ساختمان‌اند که پی، لوله‌کشی و سیم‌کشی مشترک دارند. ماشین‌های مجازی خانه‌های جدا هستند. خانه‌ها همسایه‌های امن‌تری‌اند، اما هیچ‌کس برای دیداری ۲۰ ثانیه‌ای خانه نمی‌سازد.

چه چیزهایی را Firecracker حذف می‌کند

‏Firecracker یک virtual machine monitor است (برنامه‌ای که ماشین مجازی را روی KVM آماده و اجرا می‌کند)، به زبان Rust نوشته شده و از سال ۲۰۱۸ متن‌باز است. برای یک کار ساخته شد: اجرای شمار عظیمی از بارهای کاری کوتاه‌عمر و بی‌اعتماد به یکدیگر روی سخت‌افزار مشترک. بیشتر با حذف کردن چیزها به این هدف می‌رسد:

  • نه فرم‌ور، نه شناسایی سخت‌افزار. هسته مستقیم در حافظه بارگذاری و اجرا می‌شود. هیچ‌چیز دنبال دستگاه‌هایی که وجود ندارند نمی‌گردد.
  • مدل دستگاه بسیار کوچک. یک کارت شبکه، یک دستگاه بلوکی، یک کنسول سریال و چند مورد دیگر، همه از نوع virtio (دستگاه‌هایی که برای ماشین‌های مجازی طراحی شده‌اند، نه تقلید دستگاه‌های فیزیکی). نه USB، نه گرافیک، نه PCI.
  • کدپایهٔ کوچک و ایمن از نظر حافظه. کد کمتر برای شبیه‌سازی دستگاه‌ها یعنی جای کمتر برای باگی که به مهمان اجازه دهد به میزبان برسد.
  • قفسی دور خودِ VMM. هر فرایند Firecracker داخل یک chroot اجرا می‌شود، با فیلترهای seccomp روی فراخوانی‌های سیستمی خودش و cgroups روی منابعش. اگر چیزی هم از مهمان فرار کند، در قفس می‌افتد، نه روی میزبان.

اعدادی که خود پروژه منتشر کرده: رسیدن به فضای کاربر در تنها ۱۲۵ میلی‌ثانیه و سربار حافظهٔ کمتر از ۵ MiB برای هر microVM. این‌ها بهترین اعداد آزمایشگاهی‌اند؛ یک سندباکس واقعی به آماده‌سازی دیسک و شبکه و عاملی در داخل که آمادهٔ دریافت دستور باشد هم نیاز دارد، به همین دلیل سندباکس ما در حدود یک ثانیه آماده می‌شود. این هنوز آن‌قدر به سرعت کانتینر نزدیک است که بتوانید برای هر کار یکی بسازید و بعد دورش بیندازید.

کانتینر در برابر microVM، در عمل

کانتینر‏Firecracker microVM
هستهمشترک با میزبانمستقل
مرز با میزبانفراخوانی سیستمی به هستهٔ مشترکهایپروایزر + VMM کوچک
زمان راه‌اندازیمیلی‌ثانیه~0.1–1 ث
سربار هر نمونهبسیار کمچند MiB
دستگاه‌هاهرچه میزبان در معرض بگذاردشبکه، دیسک، کنسول
GPUممکنخیر
مناسب برایکد مورد اعتماد، بسته‌بندی برنامه‌هاکد نامطمئن، بارهای کاری چندمستأجری

ردیفی که اهمیت دارد، ردیف دوم است. با کانتینر، پرسش «آیا این کد می‌تواند فرار کند؟» تبدیل می‌شود به «آیا جایی در هستهٔ میزبان باگی در دسترس هست؟». با microVM تبدیل می‌شود به «آیا در هایپروایزر یا چند دستگاه مجازی انگشت‌شمار باگی هست؟». سطح دوم بسیار کوچک‌تر است، و همان سطحی است که پلتفرم‌های ابری همین حالا برای میزبانی چندمستأجری خودشان از آن دفاع می‌کنند.

از چه چیزی می‌گذرید

یک microVM ارتقای رایگان نیست.

  • نه GPU، نه نمایشگر. برای اجرای کد است، نه برای دسکتاپ یا بارهای کاری گرافیکی.
  • دستگاه کمتر، انعطاف کمتر. هر چیزی که سخت‌افزار واقعی یا فهرست بلندی از ماژول‌های هسته انتظار دارد، این‌جا راحت نخواهد بود.
  • مرزها همچنان به سیاست نیاز دارند. microVM با خروجی باز همچنان می‌تواند ترافیکی بفرستد که نمی‌خواهید؛ اگر کلیدهای API شما داخلش باشد، همچنان می‌تواند آن‌ها را نشت دهد. جداسازی میزبان را از مهمان محافظت می‌کند، نه رازهای شما را از کدی که آن‌ها را به دستش داده‌اید.

سندباکس‌های ما چطور از آن استفاده می‌کنند

هر سندباکس EQVPS یک Firecracker microVM با هستهٔ مستقل است، از 0.25 vCPU و 512 MB تا 8 vCPU و 16 GB. با Python 3.12، Node.js 22، bash، git و curl می‌آید، اینترنت خروجی دارد و هیچ پورت ورودی ندارد. سندباکس‌های موقت پس از پایان کار حذف می‌شوند؛ سندباکس‌های persistent دیسک خود را نگه می‌دارند، و توقف موقت (pause) یک اسنپ‌شات از microVM روی دیسک می‌نویسد تا تا زمان ادامه هیچ هزینه‌ای نداشته باشد. اسنپ‌شات‌های متوقف ۱۴ روز نگه داشته می‌شوند. پس از آن سندباکس حذف می‌شود و شناسه‌اش 410 sandbox_deleted برمی‌گرداند.

ما به یک دلیل microVM را به کانتینر ترجیح دادیم: کدی که در سندباکس اجرا می‌شود، ذاتاً کدی است که هیچ‌کس بازبینی‌اش نکرده. خروجی یک عامل هوش مصنوعی، pull request یک غریبه، بنچمارکی از هزار برنامهٔ نوشته‌شده توسط مدل. برای این‌ها، هستهٔ مستقل همان مرزی است که ارزش پرداخت دارد. جزئیات آنچه دور آن گذاشته‌ایم — تعرفه‌ها، سهمیه‌ها، محدودیت ۵۵ ثانیه‌ای دستورهای همگام — در مستندات سندباکس‌ها آمده است.

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

سؤالات متداول

آیا microVM یک کانتینر است؟

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

چرا این‌قدر سریع بوت می‌شود؟

نه BIOS هست و نه شناسایی سخت‌افزار. VMM هسته را مستقیم بارگذاری می‌کند و فقط چند دستگاه مجازی انگشت‌شمار ارائه می‌دهد: شبکه، ذخیره‌سازی بلوکی، کنسول سریال و چند مورد دیگر. هرچه چیز کمتری برای شبیه‌سازی باشد، چیز کمتری هم برای راه‌اندازی هست.

یک microVM چه کارهایی نمی‌تواند بکند؟

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

آیا از کانتینر امن‌تر است؟

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

آیا می‌توانم Docker را داخل microVM اجرا کنم؟

از نظر فنی microVM می‌تواند هر چیزی را که هسته‌اش پشتیبانی کند اجرا کند، اما سندباکس‌های ما Docker ندارند. اگر بار کاری‌تان به کانتینر نیاز دارد، آن را روی VPS اجرا کنید.

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.