لینوکس یک سیستم‌عامل همه‌منظوره است. «درواقع برای رسیدن به این هدف هسته لینوکس به‌طور پیوسته در حال گسترش است تا بتواند از عملکردهای بیشتری پشتیبانی کند.» سؤالی که پیش می‌آید این است که «آیا یک kernel به‌تنهایی می‌تواند محدوده وسیعی از شرایط و موارد استفاده را به‌صورت بهینه هندل کند؟»

نکته جالب‌تر اینجاست که در حال حاضر برای برخی کاربردها، هسته لینوکس مشکل‌ساز می‌شود! برای نمونه در کاربردهایی که به I/O با کارایی بالا نیاز است از چارچوب‌هایی مثل DPDK و SPDK استفاده می‌شود. این چارچوب‌ها kernel را دور زده (bypass) و مستقیم به سخت‌افزار دسترسی پیدا می‌کنند!

از زاویه‌ای دیگر اگر به مسئله نگاه کنیم غالباً سرورهایی که راه می‌اندازیم، تک کاربردی هستند. به این معنی که سرور من فقط قرارِ وب سرور، سرور ایمیل، سرور FTP و … باشه. برای همین بر روی یک سرور اختصاصی چندین سرور مجازی بارگذاری می‌کنیم. (اصلاً یکی از دلایل به وجود آمدن Container ها همینه) به‌خصوص «در سیستم‌های ابری برای رعایت نکات امنیتی برنامه‌های کاربر در درون یک ماشین مجازی اختصاصی اجرا می‌شود» غالباً (و به‌طور روزافزون) این «برنامه‌ها به‌صورت تک پردازه‌ای و در عوض به‌صورت موازی در VMهای مجزا اجرا می‌شوند.»

در پاسخ به این مسائل پژوهش‌ها پیرامون ایده Library OS یا همان unikernelها از سر گرفته‌شده است. unikernel مدلی است که در آن برنامه کاربردیِ هدف با kernel ویژه‌ای لینک می‌شود و به‌طور مستقیم بر روی سخت‌افزار فیزیکی یا مجازی مستقر می‌شود. از مزایای unikernelها می‌توان به موارد زیر اشاره کرد:

  1. سرعت بوت بسیار بالا – بیشتر به دلیل حجم image بسیار پایین
  2. امنیت – به دلیل isolation ای که VM ها دارند
  3. بهره برداری از منابع
  4. کارایی بالا I/O – برای مثال دور زدن kernel و انجام I/O در فضای کاربر

مشخصات مقاله

نوع: کنفرانس (HotOS19)
نویسندگان: Ali Raza, Parul Sohal, James Cadden, Jonathan Appavoo, Ulrich Drepper, Richard Jones, Orran Krieger, Renato Mancuso, Larry Woodman
لینک دانلود مقاله: اینجا

مسئله

در حال حاضر ساخت یک unikernel به دو روش امکان‌پذیر است. در روش اول (clean slate) هسته از ابتدا ساخته می‌شود (مثل MirageOS) و در روش دوم (strip down) هسته موجود تکه‌تکه شده و عملکردهای اضافی آن حذف می‌شود (مثل RumpRun که نسخه بسیار کوچک‌شده NetBSD است). از طریق روش اول می‌توان به ماکزیمم بهینه‌سازی رسید ولی در سازگاری برنامه‌های کاربردی موجود با یک هسته سفارشی به مشکل می‌خوریم. در عوض مزیت روش دوم این است که انتقال برنامه‌های کاربردی موجود به unikernel راحت‌تر قابل انجام است. سؤال اینجاست که آیا می‌شود از لینوکس یک unikernel ساخت؟

نوآوری

اهداف در این کار عبارت است از:

  • اغلب برنامه ها و کتابخانه های سطح کاربر باید قابلیت لینک شدن به این unikernel را داشته باشد.
  • سربار ring transition (جابجایی میان لایه های حفاظت) حذف شود.
  • امکان بهینه سازی کد هسته و برنامه کاربردی به طور همزمان
  • حداقل تغییرات در کد منبع لینوکس ایجاد شود. (طبق چیزی که در مقاله ادعا شده برای تبدیل هسته لینوکس به unikernel تنها ۱۱ خط از کد هسته تغییر و ۲۰ خط جدید به آن اضافه شده است)

فرایند ساخت UKL (Unikernel Linux) شامل چهار گام است:

  1. کامپایل glibc برای بدست آوردن فایل های Object بدون لینک کردن (۲ دقیقه روی یک لپ تاپ معمولی)
  2. کامپایل برنامه کاربردی برای بدست آوردن فایل های Object بدون لینک کردن
  3. کامپایل کتابخانه UKL به فایل Object
  4. ساخت هسته لینوکس با انتخاب گزینه UKL در پیکربندی (با این کار کلیه Object های تولید شده با هم لینک می شوند.)

تحلیل

خوب به‌سلامتی لینوکس هم می‌تونیم به‌صورت Unikernel داشته باشیم! ظاهراً چالش‌هایی در رابطه با امنیت در مورد unikernel وجود دارد (نیاز به مطالعه بیشتر دارم) ولی حداقل الان می‌توانیم برنامه‌های کاربردی تحت Linux را به‌راحتی در قالب Unikernel ارائه کنیم.

هرچند هدف نویسنده مقاله تنها بهبود کارایی نبوده ولی در یک مورد آزمایشی که در مقاله بررسی‌شده (یک Echo Server ساده) ۵۰ درصد میانگین تأخیر پاسخگویی و ۴۱ درصد تأخیر انتهایی (Tail Latency – راجع بهش در پست دیگه ای صحبت می‌کنم) بهبودیافته است.

توزیع احتمال تجمعی برای یک Echo Server سطح کاربر و UKL

این مقاله دو روش برای رفع مشکل ring transition مطرح کرده است. یکی ترکیب برنامه با هسته به‌عنوان ماژول هسته (Kernel Module) و دیگری این‌که به برنامه کاربردی اجازه دهد در ring صفر کنار دست هسته اجرا شود. هر دو این روش‌ها بخصوص دومی نیاز به بررسی امنیتی و پایداری بیشتر دارد.

مقاله از هیچ‌کدام از این دو روش استفاده نکرده است و روش سومی ارائه داده که به نظرم خیلی بیشتر نیازمند توجه و بررسی امنیتی است. در این روش هسته به‌صورت ایستا به برنامه کاربردی لینک شده و تنها آن را اجرا می‌کند.

پ.ن. ۱: تصویر پست مربوط به ابزاری است برای ساخت Unikernel؛

بررسی دیگران

مطالب مرتبط

بررسی مقاله: My VM is Lighter (and Safer) than your Container – ویدیو

مراجع مهم

۱. Paul Barham, Boris Dragovic, Keir Fraser, Steven Hand, Tim Harris, Alex Ho, Rolf Neugebauer, Ian Pratt, and Andrew Warfield. Xen and the Art of Virtualization. In Proceedings of the Nineteenth ACM Symposium on Operating Systems Principles, SOSP ’۰۳, pages 164–۱۷۷, New York, NY, USA, 2003. ACM.

۲. Alfred Bratterud, Alf-Andre Walla, Hårek Haugerud, Paal E Engelstad, and Kyrre Begnum. IncludeOS: A Minimal, Resource Efficient Unikernel for Cloud Services. In Cloud Computing Technology and Science (CloudCom), 2015 IEEE 7th International Conference on, pages 250–۲۵۷. IEEE, 2015

۳. Ricardo Koller and Dan Williams. Will Serverless End the Dominance of Linux in the Cloud? In Proceedings of the 16th Workshop on Hot Topics in Operating Systems, pages 169–۱۷۳. ACM, 2017.

۴. Dan Schatzberg, James Cadden, Han Dong, Orran Krieger, and Jonathan Appavoo. EbbRT: A Framework for Building Per-Application Library Operating Systems. In Operating Systems Design and Implementation, volume 16, pages 671–۶۸۸, ۲۰۱۶.

۵. Liang Wang, Mengyuan Li, Yinqian Zhang, Thomas Ristenpart, and Michael Swift. Peeking Behind the Curtains of Serverless Platforms. In Proceedings of the 2018 USENIX Conference on Usenix Annual Technical Conference, USENIX ATC ’۱۸, pages 133–۱۴۵, Berkeley, CA, USA, 2018. USENIX Association.

۶. Dan Williams, Ricardo Koller, Martin Lucina, and Nikhil Prakash. Unikernels As Processes. In Proceedings of the ACM Symposium on Cloud Computing, SoCC ’۱۸, pages 199–۲۱۱, New York, NY, USA, 2018. ACM.