آینده در حال حاضر اینجاست یا مستقیماً در مرورگر کد کنید

من در مورد یک موقعیت خنده دار که برای من اتفاق افتاده است، و اینکه چگونه می توانم در یک پروژه معروف مشارکت کنم، به شما خواهم گفت.

چندی پیش داشتم ایده ای را سرهم می کردم: بوت کردن لینوکس مستقیماً از UEFI...
این ایده جدید نیست و تعدادی راهنما در مورد این موضوع وجود دارد. می توانید یکی از آنها را ببینید اینجا

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

ماهیت UEFI-Boot این است که پارتیشن ESP (EFI System Partition) با دایرکتوری boot / ترکیب می شود. آن ها تمام کرنل ها و تصاویر بوت استرپ (initrd) روی یک پارتیشن قرار دارند که UEFI می تواند فایل های اجرایی و به ویژه بوت لودرهای سیستم را راه اندازی کند. اما خود هسته لینوکس در بسیاری از توزیع‌ها قبلاً با گزینه UEFISTUB مونتاژ شده است، که اجازه می‌دهد خود هسته از UEFI راه‌اندازی شود.

این راه حل یک لحظه ناخوشایند دارد - پارتیشن ESP در FAT32 فرمت شده است که ایجاد پیوندهای سخت (که سیستم به طور مرتب هنگام به روز رسانی initrd ایجاد می کند) غیرممکن است. و هیچ چیز مجرمانه خاصی در این مورد وجود ندارد، اما دیدن هشدارهای سیستم هنگام به روز رسانی اجزای هسته چندان خوشایند نیست ...

راه دیگری هم وجود دارد.

مدیر بوت UEFI (همان جایی که باید بوت لودر سیستم عامل را ثبت کنید) می تواند علاوه بر بوت لودرها/هسته های لینوکس، درایورها را نیز بارگیری کند. بنابراین می توانید درایور سیستم فایلی را که در آن /boot دارید بارگیری کنید و هسته را مستقیماً از آنجا با استفاده از UEFI بارگیری کنید. البته درایور باید در پارتیشن ESP قرار گیرد. این تقریباً همان کاری است که بوت لودرهایی مانند GRUB انجام می دهند. اما نکته قابل توجه این است که تمام توابع GRUB که اغلب استفاده می شود در حال حاضر در UEFI هستند. دقیق تر در دانلود منیجر آن. و برای اینکه خسته کننده تر باشد، مدیر بوت UEFI در برخی موارد حتی توانایی های بیشتری دارد.

به نظر می رسد راه حل زیبایی باشد، اما یک "اما" وجود دارد (یا بهتر است بگوییم، این بود، اما بعداً در مورد آن بیشتر خواهد شد). واقعیت این است که سیستم درایور UEFI بسیار ساده است. چیزی به عنوان نصب یک فایل سیستم یا مرتبط کردن یک درایور با یک دستگاه خاص وجود ندارد. یک فراخوانی سیستمی با نام معمولی Map وجود دارد که هر راننده را به نوبت می گیرد و سعی می کند آن را با همه، حداقل دستگاه های مناسب مرتبط کند. و اگر راننده بتواند دستگاه را بردارد، نقشه ای ایجاد می شود - یک رکورد اتصال. دقیقاً به این صورت است که درایور تازه بارگذاری شده باید در یک پشته مشترک با بقیه راه اندازی شود. و تنها چیزی که نیاز دارید این است که یک بیت (LOAD_OPTION_FORCE_RECONNECT) را روی 1 در رکورد راه‌اندازی درایور تنظیم کنید و UEFI پس از بارگیری آن، این نقشه جهانی را انجام می‌دهد.

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

و یک بار دیگر که سعی کردم این کار را با دستانم انجام دهم، نتوانستم آن را تحمل کنم و رسمی کردم مشکل در GitHub از توسعه دهندگان می خواهد این ویژگی را اضافه کنند.

چند روز گذشت اما کسی به درخواست من توجه نکرد. و از روی کنجکاوی، به کد منبع نگاه کردم ... آن را فوک کردم و روی زانوهایم فهمیدم که چگونه این ویژگی را اضافه کنم ... "On my knees" زیرا من چنین چیزی را نصب نکردم و منبع را ویرایش کردم. کد مستقیما در مرورگر

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

و آنجا معلوم شد که Travis CI برای بررسی درخواست‌های کشش وصل شده است. و او با پشتکار تمام اشتباهاتم را به من گفت. خوب، اگر خطاهای شناخته شده وجود داشته باشد، نیازی به رفع آن نیست: دوباره، درست در مرورگر، و در تلاش چهارم، کد کار کرد (یک دستاورد برای من).

و دقیقاً به همین ترتیب، بدون خروج از مرورگر، من یک Pull Request بسیار واقعی را در ابزاری که تقریباً در تمام توزیع‌های لینوکس مدرن استفاده می‌شود، فرمت کردم.

من از این واقعیت متعجب شدم که، بدون دانستن زبان، بدون تنظیم چیزی (وابستگی ها به تعداد زیادی کتابخانه برای اسمبلی نیاز دارند)، و حتی بدون اجرای کامپایلر، به سادگی یک ویژگی کاملاً کارآمد و مفید را «کدنویسی کردم» مرورگر .

با این حال، درخواست من از 19 مارس 2019 بدون پاسخ ماند و من قبلاً شروع به فراموش کردن آن کرده بودم.

اما دیروز این درخواست به مستر اضافه شد.

پس داستان من در مورد چیست؟ و او در مورد این واقعیت صحبت می کند که در چارچوب فناوری های مدرن، معلوم شد که کد واقعی را می توان از قبل در مرورگر نوشت، بدون اینکه هیچ ابزار توسعه و وابستگی به صورت محلی به کار گرفته شود.

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

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

بیشتر بنویسم یا نه؟

  • بله

  • ارزشش را ندارد

294 کاربر رای دادند. 138 کاربر رای ممتنع دادند.

منبع: www.habr.com

اضافه کردن نظر