خداحافظ GRUB

امین 1 فوریه 2024 زمان خواندن: 6 دقیقه

GRUB (مخفف GNU GRand Unified Bootloader) یکی از بوت لودر هایی است که از زمان های بسیار دور در سیستم عامل‌های لینوکس نصب میشد و به ما امکان این رو میداد که موقع روشن شدن سیستم بتونیم آیتم های مختلفی رو برای بوت شدن انتخاب کنیم. از جمله کرنل های مختلف، سیستم عامل های دیگه مثل ویندوز و ...

امروزه با پدیدار شدن systemd ما به خیلی از ابزارهای اضافی برای انجام دادن کارها نیازی نداریم. یکی از این موارد GRUB هست. در واقع systemd-boot میتونه کار یک بوت لودر رو در سیستم هایی که از EFI پشتیبانی میکنند به خوبی انجام بده، بدون نیاز به نصب گراب یا هر بوت لودر دیگه ای.

توی این مطلب میخوام در مورد اینکه بوت لودر رو چگونه از GRUB به systemd-boot تغییر دادم بنویسم. تا هم برای خودم آرشیو داشته باشم و هم اگر شما هم دوست داشتید انجام بدید.

توجه: من هیچ مسئولیتی در خراب شدن احتمالی بوت لودر شما ندارم. بنابراین منابع رو به دقت بخونید و سپس اقدام کنید. ضمنا وقتی کار رو شروع کردید نصفه و نیمه رها نکنید و سیستم رو restart نکنید تا زمانی که تمام مراحل رو تکمیل کرده باشید.

قبل از هر چیز، اینها منابعی هستند که من ازشون استفاده کردم: ویکی Arch، ویکی Gentoo، ویکی Manjaro، ویکی آرچ در مورد UEFI. من این کار رو در Manjaro انجام دادم و ممکنه در سایر توزیع ها متفاوت باشه. 

پیشنهاد: یک iso لینوکس رو روی فلش داشته باشید تا اگر اتفاقی افتاد یا مشکلی در بوت پیش اومد بتونید سیستم رو با اون بوت کنید و با chroot بوت لودر رو تعمیر کنید.

در سیستم من پارتیشن بوت (EFI) در مسیر /boot/efi ماونت شده بود. که متوجه شدم نباید این شکلی باشه و فقط باید در یک دایرکتوری ماونت شده باشه نه یک مسیر دو تایی. یعنی مثلا /boot یا /efi

من ویندوز رو هم حذف نکرده ام و بعنوان یک سیستم عامل دوم دارمش. بوت لودر ویندوز هم توی همون پارتیشن EFI قرار داره. بنابراین فرمت این پارتیشن vFAT هست.

قبل از هر چیز یک بکاپ از محتوای پارتیشن بوت که در مسیر /boot/efi هست میگیرم. 

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

ابتدا پارتیشن بوت رو از محل قبلی umount میکنم:

sudo umount /boot/efi

و بعد در فایل /etc/fstab محل ماونت پارتیشن boot رو به محل جدید تغییر میدم. (یعنی به /boot) و بعد یکبار پارتیشنها رو ماونت میکنم:

sudo mount -a

حالا چک میکنم ببینم محتوای پارتیشن بوت در محل جدید به درستی ماونت شده یا نه:

ls /boot

حالا ایمیجهای کرنل رو که با تغییر مسیر پارتیشن بوت دیگه وجود ندارن، دوباره میسازم:

sudo mkinitcpio -P

نصب بوت لودر systemd

در مرحله بعد کافیه بوت لودر systemd رو نصب کنیم:

sudo bootctl install

تا اینجا ما بوت لودر systemd رو نصب کردیم و اگر الان سیستم رو restart کنیم، در تنظیمات مادربرد یک آیتم به بوت لودر ها اضافه شده. یکیش که مال ویندوز بود، یکیش مال GRUB هست و یکیش مال systemd. اما قرار نیست restart کنیم! چون با تغییر مسیر پارتیشن بوت دیگه آیتم های GRUB کار نمیکنن و هنوز آیتمی هم به systemd اضافه نکردیم.

آیتم‌های بوت لودر

اینجا کمی تفاوت بین تنظیمات پیشفرض Manjaro با Arch وجود داره. 

در Manjaro

در این توزیع بسته systemd-boot-manager به طور پیشفرض نصب هست. (اگر نیست، نصب کنید). این بسته به طور اختصاصی برای مانجارو ساخته شده و فرآیند تولید آیتم‌های بوت لودر رو بسیار راحت تر کرده.

همه ما احتمالا در kernel line بوت لودر GRUB متغیرهایی رو قرار دادیم. برای اینکه این متغیرها در آیتم‌های systemd هم وجود داشته باشند، باید اونها رو در قسمت LINUX_OPTIONS از فایل /etc/sdboot-manage.conf قرار بدیم. به طور مثال برای من:

LINUX_OPTIONS='splash loglevel=3 rd.systemd.show_status=false rd.udev.log-priority=3 bootsplash.bootfile=bootsplash-themes/gnome/bootsplash acpi_backlight=native net.ifnames=0 acpi_osi=! acpi_osi="Windows 2009" nowatchdog'
LINUX_FALLBACK_OPTIONS='splash loglevel=3 rd.systemd.show_status=false rd.udev.log-priority=3 acpi_backlight=native net.ifnames=0 acpi_osi=! acpi_osi="Windows 2009" nowatchdog'

توجه کنید که اگر در متغیرهای شما عبارتی وجود داشت که بین ' قرار داشت، باید اون رو تبدیل به " کنید. در متغیرهای من acpi_osi="Windows 2009" رو میبینید که بین دو تا " وجود داره.

من در فایل بالا، گزینه DISABLE_FALLBACK="yes" رو هم فعال کردم تا دیگه آیتم fallback رو نداشته باشم.

حالا با اجرای دستور زیر، آیتمهای بوت لودر systemd در مسیر /boot/loader/entries تولید میشن:

sudo sdboot-manage gen

چک کنید اگر در مسیر /boot/loader/entries تولید نشدند یک جای کارتون اشتباهه. با دستور زیر میتونیم چک کنیم ببینیم در حال حاضر آیتم های بوت لودر systemd چه چیزهایی هستند:

bootctl list

در Arch

نکته ای که در Arch وجود داره اینه که شما باید متغیرهای لاین کرنل رو در فایل /etc/kernel/cmdline قرار بدید. با این تفاوت که آدرس پارتیشن root رو هم باید داخلش قرار بدید. این فایل رو ایجاد کنید و فقط متغیرها رو داخلش بگذارید. به طور مثال:

root=UUID=81fb7cc5-77a1-4971-a686-a69757c47e11 rw splash 

برای ساختن آیتم های بوت لودر در Arch باید از kernel-install استفاده کنیم:

sudo kernel-install add

فرآیند تولید ایمیج‌های کرنل در Arch کمی با Manjaro متفاوت هست و من چون Arch ندارم نمیتونم دقیقا بگم چه فرقی میکنه. اما در نهایت با kernel-install در پارتیشن بوت شما که در /boot ماونت شده، یک پوشه جدید با یک ID اختصاصی ساخته میشه و برای هر کرنلی یک پوشه داخلش ایجاد میشه که ایمیج های کرنل رو اونجا نگه میداره. و سپس آیتم‌های بوت لودر رو هم در همون پوشه entries میسازه.

در نهایت به طور مثال با گرفتن لیست بوت‌لودر، یه همچین چیزی میبینید:

حالا یک بار هم کرنلی که نصب دارید و یا کرنل دیگه ای رو نصب کنید، و چک کنید ببینید آیا آیتمهای اون به طور خودکار اضافه شدن یا نه. مثلا من از کرنل 5.10 استفاده میکنم و در مانجارو بسته linux510 رو یک بار re-install میکنم.

چیزی که bootctl list بهتون نشون میده رو خوب بررسی کنید. اگر ایمیجی وجود نداشته باشه، یا متغیرهای اشتباهی در خط options رو میتونید متوجه بشید.

در فایل /boot/loader/loader.conf میتونیم زمانی رو که بوت لودر نشون میده رو تغییر بدید. پیش فرض روی ۳ ثانیه هست.

جمع بندی

در نهایت در یک جمع بندی، ما پارتیشن بوت رو در /boot ماونت کردیم. بوت لودر systemd-boot رو نصب کردیم. سپس آیتم‌ها رو بهش اضافه کردیم.

در پارتیشن بوت باید این موارد رو داشته باشیم:

  • ایمیج های کرنل و vmlinuz (اگر از kernell-install استفاده کرده باشید، اینها درون یک فولدر مخصوص قرار میگیرن)
  • پوشه loader و درون این پوشه، پوشه entries که آیتمهای بوت رو داخل خودش داره
  • پوشه EFI که بوتلودرهای EFI درون اون نصب شدند. یعنی بوت‌لودر ویندوز در پوشه Microsoft و بوت‌لودر لینوکس (که با systemd) نصبش کردیم الان. بوت لودر systemd شامل ۳ تا پوشه است: BOOT و systemd و Linux که پوشه Linux خالی است و دوتای دیگه هر کدوم یک فایل efi دارند

پوشه Linux محل قرارگیری Unified Kernel Image هست که در این مطلب صحبتش رو نمیکنیم.

در پوشه entries شما باید آیتمهای بوت لودر رو ببینید. میتونید با تکست ادیتور بازشون کنید و ویرایش کنید. مثلا اسم آیتم یا optionها رو. به طور مثال آیتم مربوط به نسخه مانجارو من با کرنل 5.10 با نام manjarolinux510.conf و با محتوای زیر وجود داره:

title	Manjaro Linux 5.10
linux /vmlinuz-5.10-x86_64
initrd /intel-ucode.img
initrd /initramfs-5.10-x86_64.img
options root=UUID=81fb7cc5-77a1-4971-a686-a69757c47e11 rw splash loglevel=3 rd.systemd.show_status=false rd.udev.log-priority=3 bootsplash.bootfile=bootsplash-themes/gnome/bootsplash acpi_backlight=native net.ifnames=0 acpi_osi=! acpi_osi="Windows 2009" nowatchdog

توجه داشته باشید که قسمت root=UUID=XXXXXXXX rw در options ضروری است. باید پارتیشن روت در آیتم بوت لودر وجود داشته باشه. اگر نیست، UUID پارتیشن روت خودتون رو با دستور lsblk -f پیدا کنید و قرار بدید.

آیتم مربوط به ویندوز

بر خلاف گراب که باید با os-probber آیتم ویندوز رو به منوی گراب اضافه میکردیم، در systemd-boot نیاز به کار اضافه تری نیست. خودش موقع بوت، بوت‌لودر ویندوز رو که در پوشه /boot/EFI/Microsoft وجود داره شناسایی میکنه و در لیست آیتم ها میاره.

در خصوص Unified Kernel Image هم که گفتم، ایمیج های کرنل و vmlinux در یک فایل با پسوند efi جمع میشن که در پوشه /boot/EFI/Linux میگیره و دیگه نیازی به ساختن entries نیست. موقع بوت خود بوت‌لودر اون رو میشناسه و در لیست آیتم ها میاره. اما خب این روش پیچیدگی خاص خودش رو داره و بهتره به ویکی خودش مراجعه کنید.

در نهایت

محض اطمینان یک بار گراب رو هم آپدیت میکنیم تا آیتمهای جدید بر اساس ماونت پوینت جدید پارتیشن بوت بروزرسانی بشن تا اگر در بوت بعدی بوت لودر جدید کار نکرد حداقل به گراب دسترسی داشته باشیم.

sudo update-grub

بعد از اینکه مطمئن شدید همه چیز سر جاش هست، میتونید سیستم رو restart کنید. با بوت لودر جدید، سیستم رو بوت کنید. اگر بوت موفقیت آمیز بود، میتونید GRUB و متعلقات اون رو حذف کنید. اگر نه، با بوت‌لودر گراب سیستم رو بالا بیارید و ببینید کجای کار اشتباهه.

این رو هم بدونید که فعلا در systemd-boot خبری از theme و فونتهای مختلف و قرتی بازی های GRUB نیست. به راحتی تمام و بدون نصب یک پکیج اضافی یک بوت لودر ساده و کارا داریم. و طبق ویکی آرچ زمان بوت هم چند ثانیه ای کوتاه تر خواهد بود.

اولین نفری باشید که دیدگاهی ارسال می کند!




حاصل سر و کله زدن های من با لینوکس