GRUB bootloader

GNU GRUB bootloadеr– GRand Unified Bootloader (GRUB) је мултиплатформски multiboot пунилац оперативног система тј. bootloadеr. Може се видети као подразумевани bootloadеr у већини популарних Unix-like дистрибуција, а такође се може и одвојено инсталирати као multiboot пунилац који омогућава одабир и управљање при подизању више оперативних система на једном рачунару.

У оригиналу овај програм је дизајнирао и имплементирао Ерик Стефан Болејн приликом рада на креирању bootloadеrа GNU/Hurd оперативног система, а касније је програм наставио са развојем у оквиру GNU пројекта. Тренутна актуелна верзија на чијем се унапређењу стално ради позната је под именом GRUB 2. Корисне информације и туторијали могу се наћи на интернет страни GNU пројекта http://www.gnu.org/software/grub/.

GRUB подржава већину Линукс дистрибуција, Виндовс, DOS, Соларис и BSD. Овај програм нам омогућава да у току рада рачунара динамички управљамо и конфигуришемо подизање одређене верзије оперативног система, као и одабир верзије кернела када су у питанну Unix-like оперативни системи. Интересантно је и то да овај програм не мора увек да се инсталира на хард диск и одатле подиже, већ га можемо покренути и са флопи диска, CD-ROM-а, USB flash драјва, као и са било ког другог BIOS-ом подржаног уређаја.

grubbootmenu

КАКО РАДИ?

Када стартујемо рачунар, BIOS пребацује контролу над рачунаром првом задатом бутабилном уређају. То може бити хард диск, флопи диск, CD-ROM, USB flash итд. Фокусираћемо се на процес бутовања преко хард диска јер је то најчешће коришћени начин бутовања. Први сектор на хард диску се зове Master Boot Record (MBR). Овај сектор је величине 512b и организован је у два дела. У првом делу величине 446б налази се извршни код примарног boot loadер-а, а у другом делу величине 64б налази се опис партиција хард диска, познатији под називом „partition table“.

Подразумевано, MBR извршни код тражи прву активну партицију, када је пронађе учитава њен boot сектор у меморију и препушта му контролу над оперативним системом. GRUB замењује стандардни MBR извршни код својим кодом и на тај начин управља подизањем система. Пошто GRUB носи много више информација о партицијама од просечног boot loadер-а, као и велики број могућих опција за конфигурацију, сама величина GRUB кода правазилази величину partition table простора, па је зато GRUB подељен у два модула или „stage“-а.

Први stage је лоцинаран у MBR-у и у себи садржи показиваче на адресе другог stage-а, који је лоциран на хард диску и у себи садржи скрипте са свим опцијама и конфигурацијама потребним GRUB-у.


На хард диск-у GRUB складишти своје фајлове на три локације:

/boot/grub/grub.cfg
На овој локацији се налази конфигурациони фајл чије се ставке конфигуришу на основу промена у GRUB скриптама.

/etc/grub.d/
У овом директоријуму се налазе скрипте које GRUB креира, позива при раду и на основу којих конфигурише grub.cfg. По дифолту постоји шест скрипти у директоријуму, навешћемо укратко функцију сваке од њих:

00_header
Овде имамо упамћене разне системске параметре као и вредности ставки у /etc/difolt/grub фајлу.
05_debian_theme У овој скрипти се подешава тема GRUB boot менија, позадина, боја текста, фонт, резолуција итд.
10_linux Ова скрипта учитава са root партиције инсталиране верзије кернела, recovery мода, и приказује ове ставке у GRUB boot менију.
20_memtest86+ Учитава алат под именом memtest86+.
30_os-prober Ова скрипта скенира хард диск тражећи друге оперативне системе, и ако их има креира boot уносе за инсталиране оперативне системе.
40_custom Ово је скрипта која нам користи као темплејт за креирање наших скрипти уколико желимо да додамо неке нове функције у GRUB boot loadеr-у.

/etc/difolt/grub
У овом фајлу се налазе опције за подешавање GRUB boot менија које утичу на садржај скрипти на локацији /etc/grub.d/, а затим се позивом команде sudo update-grub задате промене памте у grub.cfg фајлу, а ако grub.cfg није још увек кериран креира се нови фајл под овим именом.

grubcfg

ДОДАВАЊЕ НОВЕ СКРIPТЕ

Да би могли да направимо неку промену у конфигурационом фајлу grub.cfg морамо да: 1. изменимо ставке у фајлу на локацији /etc/difolt/grub и променимо садржај скрипти на локацији /etc/grub.d/ или 2. додамо неку нову функцију додавајући нашу властиту скрипту.

Како додати скрипту?
Шел (shell) скрипту додајемо креирајући нови фајл у фолдеру на адреси /etc/grub.d/. При именовању новог фајла морамо поштовати договорени формат XX_ime_skripte где је XX двоцифрени број. Двоцифреним бројем у имену скрипте одређујемо њен положај у GRUB boot менију. Мањи бројеви иду на почетак менија, а већи на крај, поштовајући нумерички распоред.

Узмимо за пример да нам се скрипта зове: 08_naša_skripta , она ће у GRUB boot менију бити постављена пре листе инсталираних Линукс дистрибуција јер се оне читају из скрипте 10_linux.
Ако желимо да буде постављена после листе инсталираних Линукс дистрибуција онда нашу скрупту треба преименовати. Можемо је назвати 11_naša_skripta.

Ево примера изгледа скрипте која додаје нови boot entry (унос):

#!/bin/sh -e
 echo "Neki string koji nam bliže opisuje funkciju skripte"
 cat << EOF
 menuentry "Ime boot entry-a" {
 set root=(hdX,Y)
 — boot parametri —
 }
 EOF

Као што смо већ навели, ово је shell скрипта, тако да већина администратора Unix-like система не би требало да има много муке у разумевању GRUB конфигурационих скрипти.

Ево и појашњења:

echo „Неки стринг који нам ближе описује функцију скрипте“ је стринг којег ћемо видети када покренемо sudo update-grub наредбу и у току извршења она дође до овог дела кода. Ако не желимо да се појављује овај стринг можемо једноставно да га се решимо командом echo „Неки стринг који нам ближе описује функцију скрипте“.

cat << EOF означава почетак кода који треба да изврши boot entry

menuentry „Име boot entry-а“ овим задајемо име boot уноса у GRUB boot менију.

set root=(hdX,Y) дефинишемо на ком хард диску и на којој партицији се налазе GRUB конфигурациони фајлови за одређени оперативни систем чији boot унос креирамо. У делу команде (hdX,Y), hd означава хард диск, X је редни број хард диска, а Y ознажава редни број број партиције на означеном хард диску. Треба напоменути да се хард дискови броје почев од 0, док се партиције броје од 1 па на горе. Ако хоћемо да означимо другу партицију на првом хард диску написаћемо (hd0,2).

boot параметри — овде постављамо параметре за бутовање система који се разликују од једног до другог оперативног система. На пример ако користимо Линукс у овој секцији можемо да ставимо:
linux /boot/vmlinuz
initrd /boot/initrd.img

За оне који користе системе који немају нативну подршку за GRUB bootloadер, као на пример Виндовс, у овом делу треба укуцати:
chainloader (hdX,Y)+1
где начин одабира хард диска одговара оном објашњеном код „set root“ команде.

EOF означава крај GRUB boot entry-jа.

Пример комплетног кода за GRUB boot entry Линукс система би изгледао овако:

#!/bin/sh -e
 echo "Dodajem moj Линукс u GRUB"
 cat << EOF
 menuentry "Moj Линукс" {
 set root=(hd0,5)
 linux /boot/vmlinuz
 initrd /boot/initrd.img
 }
 EOF

Док би за Виндовс оперативни систем скрипта требало да изгледа овако:

#!/bin/sh -e
 echo "Adding Windows 8 to GRUB 2 menu"
 cat << EOF
 menuentry "Windows 7″ {
 set root=(hd0,1)
 chainloader (hd0,1)+1
 }
 EOF

На крају да би скрипта коју смо написали могла да се извршава треба је начинити извршном путем команде:

chmod +x XX_ime_skripte
Након свега овога да би промене које смо начинили биле видљиве у GRUB boot менију, потребно је покренути команду:
sudo update-grub како би промене биле упамћене у GRUB конфигурационом фајлу на адреси /boot/grub/grub.cfg.

ПОДЕШАВАЊЕ GRUB BOOT МЕНИЈА

Сада ћемо се позабавити конфигурацијом GRUB boot менија на основу фајла доступног на локацији /etc/default/grub. Овде можемо подесити ставке као што су boot timeout, default selection, приказивање неких ставки у GRUB boot менију итд.

etc-difolt-grub

Следи краћи опис понуђених опција:

GRUB_DEFAULT нам омогућује да подесимо подразумевани boot entry тако што ћемо навести редни број жељеног boot уноса на основу његовог редног броја у фајлу grub.cfg. Бројеви почињу од 0. На пример: GRUB_DEFAULT=0. Такође, можемо навести и пуно име boot уноса у облику стринга GRUB_DEFAULT=“Windows 7″. Ако желимо да при подизању система дифолт boot entry буде последњи селектовани boot entry при претходном подизању оперативног система ова ставка треба да изгледа на следећи начин: GRUB_DEFAULT=saved.

GRUB_HIDDEN_TIMEOUT представља број секунди које систем сачека пре него што прикаже boot меније, тј. представља дужину трајања паузе при бутовању. Корисник може прекинути ово чекање притиском на било који тастер на тастатури.

GRUB_HIDDEN_TIMEOUT_QUIET овде бирамо да ли ће бити приказан бројач приликом паузирања при подизању система. Ако је вредност True онда неће бити бројача, а ако је додељена вредност False бројач ће показивати колико је још секунди преостало.

GRUB_TIMEOUT представља време за које GRUB boot мену чека да корисник сам одабере boot entry, у супротном учитава дифолт boot entry.

GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian овом опцијом је подешено да се у boot менију приказује пун опис boot уноса. На пример: „Ubuntu“, „Arch“ итд.

GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash“ ако желимо да подизање оперативног система видимо у облику текста који нам даје информације о процесима који учествују у подизању система требамо обрисати „quiet splash“. Такође, уколико желимо да користимо grub splash image, односно да се током подизања оперативног система види слика, треба поставити „splash“.

#GRUB_TERMINAL=console ако желимо да искључимо графички терминал требамо обрисати ознаку коментара.

#GRUB_GFXMODE=640×480 GRUB сам подешава резолуцију boot менија на најбољу могућу за дату конфигурацију, али уколико желимо да сами поставимо жељену резолуцију треба обрисати ознаку коментара и уписати вредност резолуције.

#GRUB_DISABLE_RECOVERY=“true“ брисањем ознаке коментара забрањујемо аутоматско генерисање recovery мода уноса.

#GRUB_INIT_TUNE=“480 440 1″ брисањем ознаке коментара укључујемо бипер који се оглашава приликом покретања GRUB-а.

Напомена: након промене било које од ових ставки обавезно покренути sudo update-grub да би промене биле меморисане у конфигурационом фајлу grub.cfg.

WINDOWS BOOT LOADER vs GRUB

Данас већина Линукс дистрибуција са собом доноси GRUB као подразумевани bootloadер. Приликом инсталације система аутоматски се генеришу GRUB скрипте тако да се без икаквих проблема, у самом процесу инсталације додаје boot entry датог система. Уколико већ имамо инсталирану неку Unix-like дистрибуцију са лакоћом можемо додати неки други сродни оперативни систем. У случају да смо на рачунару пре инсталације Unix-like дистрибуције имали Виндовс, у току саме инсталације аутоматски ће бити инсталиран GRUB као замена за Виндовсов boot loadер и биће креирана скрипта са boot entry-има оба система.

Проблем настаје када већ имамо инсталирану неку од Линукс дистрибуција или више њих и након тога инсталирамо Виндовс. Виндовс boot loadер преклопи GRUB тако да приликом подизања система директно учитава Виндовс и остали системи инсталирани раније нестају без трага заједно са GRUB boot менијем. Но, ствари нису тако црне као што изгледају, GRUB је све време ту само што је замењен Виндовсовим boot loadер-ом.

Како повратити GRUB?

Постоје две варијанте. Прва је једноставна али нам је неопходан rescue CD под именом Super Grub Disk, о овој методи можете се информисати на страници http://www.supergrubdisk.org/software/. Друга метода захтева мало пешачког рада и ми ћемо се позабавити овом другом методом.

Потребан нам је live CD неке Линукс дистрибуције која користи GRUB као дифолт boot loadер. Треба покренути Линукс преко live CD-а и отворити терминал, пронаћи хард диск и партицију на којој је инсталиран GRUB boot loadер. Уколико не знамо име партиције на којој је инсталиран GRUB boot loadер у терминалу система покренутог преко live CD-а унесемо комадну sudo fdisk -l која нам даје листу и опис хард дискова и партиција.

fdisk

Напомена о номенклатури партиција: формат номенклатуре је NdXY где N може да буде ‘h’ или ‘s’ а XY представљају позиције хард дискова и партиција респективно.

Сада када знамо име партиције (пример на тестираном систему: име партиције је sda1), треба mount-овати ту партицију командом mount /dev/sda1 /mnt.
Затим покрећемо команду за обнову GRUB-а на жељеном хард диску, у нашем случају ознака жељеног хард диска је sda па ће команда имати облик sudo grub-install –root-directory=/mnt /dev/sda. Након тога треба unmount-овати партицију командом sudo umount /mnt и рестартовати рачунар. Након рестарта све би требало да буде на свом месту.

Закључак

GRUB је веома моћан и употребљив алат за све ситуације када је потребно користити више оперативних система на једном рачунару или уколико желите да експериментишете са различитим оперативним системима, истражујете и оптимизујете могуће начине у подизању истих.

Уколико се бавите развојем и тема вам је посебно занимљива могуће је придружити се заједници и послати предлоге и идеје за нову верзију. GRUB се константно активно развија, за детаљније информисање расположива је засебна мејлинг листа намењена девелоперима.

itmogul-logoТекст је преузет са угашеног блога ИТ модул и оригинални аутор овог текста је Ненад Стојиљковић. Компјутераш ИТ блог објављује текстове са тог блога како ризница знања са те локације не би отишла у заборав.