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 رو نصب کنیم:
sudo bootctl install
تا اینجا ما بوت لودر systemd رو نصب کردیم و اگر الان سیستم رو restart کنیم، در تنظیمات مادربرد یک آیتم به بوت لودر ها اضافه شده. یکیش که مال ویندوز بود، یکیش مال GRUB هست و یکیش مال systemd. اما قرار نیست restart کنیم! چون با تغییر مسیر پارتیشن بوت دیگه آیتم های GRUB کار نمیکنن و هنوز آیتمی هم به systemd اضافه نکردیم.
اینجا کمی تفاوت بین تنظیمات پیشفرض Manjaro با Arch وجود داره.
در این توزیع بسته 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 وجود داره اینه که شما باید متغیرهای لاین کرنل رو در فایل /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 رو نصب کردیم. سپس آیتمها رو بهش اضافه کردیم.
در پارتیشن بوت باید این موارد رو داشته باشیم:
پوشه 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 نیست. به راحتی تمام و بدون نصب یک پکیج اضافی یک بوت لودر ساده و کارا داریم. و طبق ویکی آرچ زمان بوت هم چند ثانیه ای کوتاه تر خواهد بود.
حاصل سر و کله زدن های من با لینوکس