گراب، گراب، گراب! هر چی بنویسم در موردش کمه. این پست یه آموزش کامل، ساده و سرراسته و قراره به هر کسی که یه سیستمعامل مشابه یونیکس (مثل لینوکس و BSD) داره و میخواد از گراب ۲ به عنوان بوت لودر استفاده کنه کمک میکنه.
تو این آموزش یاد میگیرید که چه جوری با گراب ۲ کار کنید، منوها رو حذف یا اضافه کنید، عنوانها و آپشنها رو به نیاز خودتون تغییر بدید، ۲ یا ۳ سیستمعامل رو هم زمان بوت کنید و گراب ۱ و گراب ۲ رو با هم ترکیب کنید. خوب بزن بریم!
گراب و Bootloader چیه؟
به طور خلاصه بگم که اینجوری نیست که زرتی دکمه پاور کامپیوتر رو زدی سیستمعامل بوت بشه. سیستمعامل یه برنامه پیچیده هست و در جا نمیشه اجراش کرد. از یه برنامه سادهتر به نام Bootloader استفاده میکنیم و اول اون رو اجرا میکنیم و بعد این برنامه سیستمعامل رو کپی میکنه توی رم و کنترل رو میده دست اون. حالا گراب یه Bootloader آزاد هست که تو اکثر دیستروهای گنو/لینوکس استفاده میشه و هر سیستمعاملی که به عقلتون میرسه رو میتونه بوت کنه.
معرفی گراب ۲
همونجوری که اسمش معلومه نسخه دوم گراب هست، از صفر نوشته شده و نسبت به نسخه اول امکانات خیلی بیشتری داره مثل وابستگی کمتر، ماژول بندی بهتر، پشتیبانی از کارکترهای غیر ASCII ، بارگذاری داینامیک ماژولها، مدیریت حافظه و بسیاری دیگه.
باید بدونید که گراب ۱ هم هنوز خیلی خوب داره کار میکنه کلا سیستم سادهتری هم داره نسبت به گراب ۲ و دیستروهای زیادی هنوز از گراب ۱ استفاده میکنن مثل اوپن سوزی، ArchLinux و چاکرا. این آموزش در مورد گراب ۲ هست نه نسخه اولی گراب.
نصب گراب ۲
گراب ۲ به صورت پیشفرض با خیلی از دیستروها نصب میشه مثل نسخههای ۲ سال اخیر اوبونتو. اگر نصب نیست که دو راه هست برای نصبش:
اول) از package manager دیستروتون استفاده کنید (دقت کنید که اگر Bootloader دیگه مثل GRUB1 یا LILO دارید پاکش کنید)
دوم) از سورس کامپایلش کنید که باید سورسش رو بگیرید و با این دستورها کامپایلش کنید:
./autogen.sh
./configure --with-platform=pc --prefix=/usr
make
# make install
این کار گراب رو روی دیستروی شما نصب میکنه و باید روی MBR هم نوشته باشه تا BIOS سیستم موقع بوت گراب رو ببینه و اجرا کنه. برای نصبش روی MBR این رو بزنید
# grub-install /dev/sda
جای sda هم باید هارد دیسک مناسب رو بزارید. اگر یه هارد دارید که میشه همون sda اگر رو هارد دوم میخواید بنویسید میشه sdb و الیآخر. نکته خیلی مهم این این دستور باعث میشه یه سری GRUB Image روی دیسترو شما نوشته بشه و باعث میشه که گرابی که نصب کردید از grub.cfg دسترویی که این دستور رو توش مینویسید پیروی کنه. پس اگر دیستروی دیگهای دارید که میخواد گراب با لیست اون بوت بشه کافیه با اون دیسترو بوت کنید و این دستور رو اونجا بزنید.
طراحی جدید فایلها
تمام فایلهای گراب ۱ در دایرکتوری /boot/grub/ بودن که شامل یه menu.lst بود و تمام تنظیمات رو شامل میشد و برای اضافه کردن گزینه جدیدی به لیست کافی بود توی این فایل اضافهاش میکردین
تنظیمات گراب ۲ در این آدرسها هستن:
/boot/grub/grub.cfg
این فایل تنظیمات اصلی هست که جایگزین menu.lst شده. برخلاف menu.lst اصلا توصیه نمیشه این فایل رو دستی تغییر بدید.
/etc/grub.d/
توی این دایرکتوری اسکریپتهای گراب ذخیره میشن. این اسکریپتها grub.cfg رو میسازن. دستور grub-mkconfig این اسکریپتها رو اجرا میکنه و یه کانفیگ براتون خروجی میده.
/etc/default/grub
این فایل تنظیمات menu گراب رو نگه می داره. ( مثل رنگ نوشتهها و زمانی که گراب منتظر شما میمونه و …) این فایل هم توسط اسکریپتها باید خونده بشه. در واقعا تمام تنظیمات شخصی سازی گراب توی این فایل هست، قبلا توی menu.lst بود و الان فایل جدا داره.
لپ مطلب اینکه برای برای تقییر منوهای گراب باید اسکریپتهای اون رو تغییر بدید یا یه اسکریپت جدید بنویسید و بعد منو رو آپدیت کنید. بیشتر شبیه LILO هست تا نسخه قدیمی گراب که میشد رو هوا و مستقیم ورودیهای منو رو تغییر داد.
نمونه فایل grub.cfg
همونجوری که گفتم در آدرس /boot/grub/ قرار داره.
grub.cfg یه چیزی شبیه فایل زیره:
کلا شل اسکریپت هست و خوندنش زیاد جالب نیست. فقط بعد از آپدیت گراب خوندن این فایل ارزش داره که ببینید گند زده شده توش یا نه!
نمونه دایرکتوری /etc/grub.d/
معمولا چنین اسکریپتهایی در اولین نصب در این دایرکتوری وجود داره.
مهمترینهاش اینها هستن:
۰۰_header اسکریپتی هست که تنظیمات گراب رو از/etc/default/grub میخونه که شامل زمان timeout گراب، وردودی پیشفرض، و بقیه چیزها میشه. در ادامه در مورد اینها صحبت میکنیم!
۰۵_debian_theme این اسکریپت رو فقط تو دیستروهای برمبنای دبیان پیدا میکنید و فقط نظمیم رنگ منوها توش هست اینها درستش این هست که توی /etc/default/grub باشه! پاکش کنید اتفاق خاصی نمیافته.
۱۰_linux این یه بش اسکریپت به نسبت پیچیده هست که کل وسایل جانبی رو برای وجود لینوکسهای احتمالی اسکن میکنه و میزاره تو لیست.
۲۰_memtest86+ برنامه memtest که برای تست رم هست رو اجرا میکنه.
۳۰_os-prober مشابه۱۰_linux هست با این تفاوت که برای پیدا کردن سیستمعاملهای غیر از لینوکس طراحی شده. نکته کنکوری این اسکریپت اینجاست که این رو برنامه نویسهای دبیان نوشتن و رو خود گراب نیست ولی چون خیلی چیز جالبیه رو همهی دیستروهای پدر مادر دار قرارش میدن.
۴۰_custom یه قالب خالی هست که میتونید اسکریپتهای خودتون رو اضافه کنید.
به شمارهای که اول اسم اسکریپتها بود دقت کردین؟ این شماره اولویت رو تایین میکنه. یعنی ۱۰_linux زودتر از ۲۰_memtest86+ اجرا میشه و توی لیست جایگاه بالاتری داره.
مثل grub.cfg این فایلها هم شل اسکریپت هستن و تغییرشون کار زیاد جالبی نیست و فقط ۴۰_custom برای تغییر دستی ساخته شده. هنگام تغییر این اسکریپتها باید حواستون رو جمع کنید. در ادامه این آموزش یاد خواهید گرفت که این فایلها چه شکلی هستن و چه جوری باید ازشون استفاده کنید.
نمونه /etc/default/grub
این فایل تو آدرس /etc/default/ هست:
توی این دایرکتوری فایلهای دیگهای هم موجوده همهاش مال گراب نیست. فایلی که ما باش کار داریم grub هست و توسط اسکریپت ۰۰_header فراخونی میشه. میتونید همینجا تغییرش بدید. در ادامه این پست و در قسمت سفارشی سازی به این فایل بیشتر میپردازیم
گراب ۲ چهجوری کار میکنه؟
اگر چیزهایی که در بالا گفتم رو بخوام جمعبندی کنم اینجوری میشه: /etc/default/grub شکل و شمایل گراب هست، اسکریپتهای /etc/grub.d/ اطلاعات منو گراب و اسکریپتهای بوت سیستمعامل رو دارن. فایل grub.cfg هم فایل اصلی که میشه با کمک اون اسکریپتها یه خوبش رو ساخت.
نوشتن اسکریپت جدید گراب
برای نوشتن یه اسکریپت جدید باید این قواعد رو رعایت کنید:
فایل جدیدی با نام XX_ prefix ایجاد کنید که تو اون XX یه عدد دو رقمی هست. هرچقدر عدد کوچکتر باشه اسکریپت شما اولویت اجرا بیشتری داره و بالاتر توی منو ظاهر میشه. برای مثلا ۱۱_something بعد از تمام وردودیها پیشفرض قرار میگیره در صورتی که ۰۸_something که قبل از ورودیهای ۱۰_linux قرار میگیره.
قدم بعدی نوشتن خود اسکریپت هست. یه نمونه:
#!/bin/sh -e
echo \"Some string\"
cat << EOF
menuentry \"Something\" {
set root=(hdX,Y)
-- boot parameters --
}
EOF
توضیح این کد اینکه شل اسکریپت هست همونجور که تو خط اول نوشته شده. دستور
echo \"Some string\"
عبارت Some String موقع اجرای دستور update-grub (پایینتر این دستور رو توضیح میدم) تو خروجی چاپ میشه. یه چیزی مثل Adding openSUSE 11.4 برای openSUSE 11.4 فکر کنم مناسب باشه.
عبارت cat << EOF تعریف میکنه ورودی بوت رو.
دستور
menuentry \"Something\"
هم عبارتی هست که در منو ظاهر میشه مثلا openSUSE 11.04 مناسبه.
دستور آخر هم که آدرس پارتیشن boot لینوکستون هست. اگر پارتیشن boot جدا ندارید که میشه همون پارتیشن نصب لینوکستون.
set root=(hdX,Y)
X شماره هارد دیسک هست که از ۰ شروع میشه یعنی sda که هارد اول هست میشه ۰ و الی آخر. Y هم شماره درایو هست و از ۱ شروع میشه. مثلا sda3 که هارد اول هست و درایو سوم میشه hd0,3 تو گراب. تو نسخه اول گراب لون Y از ۰ شروع میشد که دیگه اونجوری نیست. دقت کنید!
اون — boot parameters — یا پارامترهای بوت هم در مورد هر سیستمعامل فرق داره. برای لینوکس پارمترهای بوت اینها هستن:
linux /boot/vmlinuz root=/dev/sdXY
initrd /boot/initrd.img
قرار نیست vmlinuz و initrd.img دقیقا به همین نام باشن. باید برید تو boot/ برای اینکه بفهمید اسمشون دقیق چی هست. مثلا Archlinux اسم Kernel Imageش kernel26.img هست پس خط آخر میشه initrd /boot/kernel26.img
اون dev/sdXY هم جایی هست که لینوکستون قرار داره. مثلا sda3
و برای ویندوز:
chainloader +1
یه توضیح کوچولو در مورد chainloader اینکه در واقعا فرایند بوت رو پاس میده به bootloader خود ویندوز گراب نمیتونه مستقیم ویندوز رو بوت کنه.
خوب پس یه اسکریپت کامل برای اضافه کردن سیستمعامل مورد نظرمون که لینوکس هست و توی dev/sda5 نصب شده و پارتیشن بوت جدا نداره اینجوری میشه:
#!/bin/sh -e
echo \"Adding my custom Linux to GRUB 2\"
cat << EOF
menuentry \"My custom Linux\" {
set root=(hd0,5)
linux /boot/vmlinuz root=/dev/sda5
initrd /boot/initrd.img
}
EOF
و در صورتی که ویندوز هست:
#!/bin/sh -e
echo \"Adding Windows 8 to GRUB 2 menu\"
cat << EOF
menuentry \"Windows 8\" {
set root=(hd0,5)
chainloader+1
}
EOF
دستور EOF هم آخر ورودی بوت رو مشخص میکنه.
حالا که اسکریپت رو نوشتیم و ذخیرهاش کردیم کافیه اجازهی اجرایی رو بش بدیم:
chmod +x XX_new_os_script
بعد کافیه برای نوشتن grub.cfg جدید دستور
# grub-mkconfig -o /boot/grub/grub.cfg
رو وارد کنیم که تنظیمات جدید رو در قالب یه grub.cfg جدید مینویسه. نکته کنکوری: توی اوبونتو update-grub رو داریم که دقیقا همین هست و میتونید ازش استفاده کنید.
حالا که کار با این اسکریپتها رو یاد گرفتیم هرکاری میشه کرد. مثلا اگر من چاکرا رو با اوبونتو بوت میکنم میتونم برای هر کدوم یه اسکریپت بنویسم و برای اینکه توی منو ورودیهای تکراری نداشته باشم میتونم ۱۰_linux و ۳۰_os-prober رو پاک کنم یا اجازهی اجرایی بودن رو ازش بگیرم.
فهمیدین چی شد؟ فقط با داشتن اون دو تا اسکریپت و یه دستور grub-mkconfig -o /boot/grub/grub.cfg میتونم یه تمام سیستمعامل ها رو اضافه کنم به لیستم!
بررسی حالتهای موجود
تو این قسمت میخوام تمام حالتهایی که یه کاربر لینوکس متوسط ممکن هست باهاشون برخورد کنه رو معرفی کنم که شامل بوت دوگانه لینوکس با لینوکس و ویندوز با لینوکس و بوت لینوکس داری گراب۱ با گراب ۲ میشه
بوت ویندوز با لینوکس
الف) نصب لینوکس بعد از ویندوز:
لازم نیست کار خاصی بکنید چون گراب ویندوز رو میشناسه. اگر نشناخت هم با توجه به مطالب قبلی میتونید یه ورودی براش توی منو درست کنید
ب) نصب ویندوز بعد از لینوکس
تو این حالت Bootloader ویندوز گراب رو بازنویسی میکنه و لازم هست بازگردانیش کنید. یه پست کامل در موردش نوشتم.
نصب دو لینوکس با گراب ۲
اصلا نیاز به توضیح نداره!
بوت دوگانه یه دیسترو با گراب ۱ و دیگری با گراب ۲
خوب خاصترین حالت ممکن این هست. میخوایم اوبونتو ۹/۱۰ که گراب ۲ داره رو با اوپنسوزی ۱۱/۲ که قدیمیتر هست و گراب ۱ داره بوت کنیم. مهم این هست که تصمیم بگیریم که چه نسخهای روی MBR باشه و دیگر لینوکسها بوت کنه و ما گراب ۱ رو انتخاب میکنیم چون پایدار تره. فقط باید دقت کنید موقع نصب اوبونتو گراب فقط روی boot نصب بشه و موقع نصب اوپن سوزه هم root و هم MBR . به تنظیمات دقت کنید:
موقع نصب اوبونتو گراب یه پارتیشن بدید مثل /dev/sda3/ و نه خود دستگاه یعنی /dev/sda/
موقع نصب اوپنسوزی هم گراب رو روی MBR نصب کنه و هم دایرکتوری بوت
موقع بوت سیستم گراب ۱ اوپنسوزی اوبونتو رو توی لیست نشون نمیده و طبیعی هم هست. کافیه menu.lst گراب رو باز کنید و یه ورودی جدید اینجوری بش اضافه کنید:
title Ubuntu 9.10 Karmic Koala
root (hd0,5)
kernel /boot/grub/core.img
savedefault
boot
نمونه جالبتر نصاب Mandriva 2010 هست که به شما اجازه میده به صورت گرافیکی گرابی رو که قراره نصب بشه رو تغییر دید. میتونم برای بوت کردن اوبونتو ۹/۱۰ (و مطمعنن جدیدتر) اینجوری تنظیمش کنم:
سفارشی کردن منو گراب
دیگه هر چیزی لازم بود برای بوت کردن چندتا سیستمعامل یاد گرفتید. الان یاد میگیریم چه جوری منو رو به سلیقه خودمون تغیر بدیم که شامل انتخاب پیشفرض، تصویر پسزمینه، زمانی timeout و … میشه.
همه این تنظیمات داخل فایل etc/default/grub هستن. متغیرهای مهم این فایل اینها هستن:
GRUB_DEFAULT=0 که گزینه پیشفرض گراب رو تعیین میکنه که ۰ گزینه اول لیست هست و ۱ دومی و الیآخر. در صورتی که تایین کنید GRUB_DEFAULT=saved آخرین انتخابتون به عنوان پیشفرض قرار میگیره.
GRUB_TIMEOUT=”10″ زمانی هست که گراب منتظر انتخاب شما میمونه و درصورتی که انتخاب خاصی نکردید پیشفرض رو بوت میکنه. در صورتی که مقدار رو۱- بدید تا بینهایت منتظر میمونه گراب!
متغیرهای بیشتری هم هستن که هرکدوم کاری انجام میدن. حواستون رو موقع تغییرشون جم کنید! برای حذف گزینه ریکاوری هر دیسترو از لیست کافیه خط GRUB_DISABLE_LINUX_RECOVERY=”true” رو از کامنت خارج کنید (اون # اولش رو پاک کنید) برای حذف memtest از لیست هم باید برید به /etc/grub.d/ و این دستور رو بزنید:
sudo chmod -x 20_memtest86+
این دستور باعث میشه دیگه اسکریپت ۲۰_memtest86+ اجرا نشه و تو لیست چیزی در موردش ظاهر نشه.
بازگردانی و تعمیر گراب
خوب به دلایل مخالف ممکنه گراب به لعنتی بره، دو راه هست برای بازگردانش:
راه ساده:
از این دیسترو زنده کمک بگیرید، بوتش کنید و با ابزارهای گرافیکی که داره کمک میکنه گراب رو برگردونید. کار باهاش ساده اس ونیازی به توضیح نیست
راه سختتر:
راهحل سختتر و سر راستتر این هست که با بوت یه سیدی زنده که خودش گراب ۲ داره گراب رو روی روت و MBR نصب کنید. این پست رو در موردش بخونید. کل این پست در مورد یه دستور grub-install هست که به یه اپشن root-directory خاص. این میشه یه مرور سریع از اون:
۱) با دیسترو زنده که بوت کردین روت لینوکسی که نصب هست رو روی mnt مانت کنید با این دستور:
# mount /dev/sda2 /mnt
۳) خوب حالا کافیه این دستور رو بزنیم تا گراب رو روی MBR نصب کنه و فایلهای متناظر رو روی root ما کپی کنه. اگر root رو مشخص نمیکردیم میخواست رو روی root دیسترو زنده کپی کنه و خوب مطمعنن خطا میداد
grub-install --root-directory=/mnt /dev/sda
خوب این تمام چیزی هست که نیاز دارید! ولی اگر بخواید یه جوری وارد ترمینال لینوکس که الان گرابش رو تعمیر کردید بشید و با توجه به اسکریپتها لیست رو آپدیت کنید چی؟ تو ویندوز همچین کاری خیلی تخیلی هست ولی تو لینوکس میشه! کافیه chroot کنید به اون لینوکس. اینجوری:
۱) با دیسترو زنده که بوت کردین روت لینوکسی که نصب هست رو روی mnt مانت کنید با این دستور:
# mount /dev/sda2 /mnt
۲) اگر پارتیشن جد برای boot دارید رو زیر mnt مانت کنید. اگر نمیدونید boot جدا چیه پس این دستور رو بیخیال!
sudo mount /dev/sda1 /mnt/boot
۳) شاید Device ها لازم بشه اون رو هم مانت کنید
sudo mount --bind /dev /mnt/dev
۴) اگر دیسترو Debian Base (مثل خود دبیان، اوبونتو و منیت) دارید proc و sys رو هم لازم هست مانت کنید
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
۵) حالا chroot به سیستمی که ساختید
sudo chroot /mnt
حالا که chroot کردید دیگه کنترل لینوکسی که نصب هست دستتو ن هست و نه سیدی زنده، هر کاری لازم هست انجام بدید، مثلا برای آپدیت لیست گراب این رو بزنید:
grub-mkconfig -o /boot/grub/grub.cfg
کارهای لازم رو که کردید با exit از chroot خارح بشید و هرچی mount کردید رو unmount کنید:
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
سیستم رو ریست کنید و حالا هم گراب رو دوباره نصب کردید و هم لیستی که استفاده میکنه رو به روز رسانی کردید.
خوب این هم تمام چیزهایی بود که برای بازگردانی یه گراب خراب لازم داشتید!
نتیجه گیری
خوب این هم آموزش کامل و قدم به قدمی بود از گراب ۲ که شامل معرفیش، نصب و حل مشکلاتش میشد. توصیه میکنم چند بار با دقت بخونیدش و واقعا هم سادهست! امیدوارم چه کاربر تازه کار لینوکس باشید یا حرفهای این آموزش به کمکتون بیاد. خیلی ها رو دیدم که تنظیم همین گراب تجربهی کار با لینوکسشون رو خراب کرده و یه منبع جامع برای به زبان انگلیسی هم وجود نداشت چه برسه به فارسی. اگر فکر میکنید این راهنما ناقص یا گنگ هست خجالت نکشید و همین پایین کامنت بزارید، سعی میکنم درستش کنم! اگر مشکلی با گراب دارید توی فروم اوبونتو فارسی یه تاپیک بزنید تا بقیه بهتون کمک کنن
منابع:
wikipedia GRUB
Dedoimedo GRUB 2 bootloader – Full tutorial
AchLinux wiki GRUB, GRUB2