GNU GRUB bootloader– GRand Unified Bootloader (GRUB) je multiplatformski multiboot punilac operativnog sistema tj. bootloader. Može se videti kao podrazumevani bootloader u većini popularnih Unix-like distribucija, a takođe se može i odvojeno instalirati kao multiboot punilac koji omogućava odabir i upravljanje pri podizanju više operativnih sistema na jednom računaru.

U originalu ovaj program je dizajnirao i implementirao Erik Stefan Bolejn prilikom rada na kreiranju bootloadera GNU/Hurd operativnog sistema, a kasnije je program nastavio sa razvojem u okviru GNU projekta. Trenutna aktuelna verzija na čijem se unapređenju stalno radi poznata je pod imenom GRUB 2. Korisne informacije i tutorijali mogu se naći na internet strani GNU projekta http://www.gnu.org/software/grub/.

GRUB podržava većinu Linuks distribucija, Vindovs, DOS, Solaris i BSD. Ovaj program nam omogućava da u toku rada računara dinamički upravljamo i konfigurišemo podizanje određene verzije operativnog sistema, kao i odabir verzije kernela kada su u pitannu Unix-like operativni sistemi. Interesantno je i to da ovaj program ne mora uvek da se instalira na hard disk i odatle podiže, već ga možemo pokrenuti i sa flopi diska, CD-ROM-a, USB flash drajva, kao i sa bilo kog drugog BIOS-om podržanog uređaja.

grubbootmenu

KAKO RADI?

Kada startujemo računar, BIOS prebacuje kontrolu nad računarom prvom zadatom butabilnom uređaju. To može biti hard disk, flopi disk, CD-ROM, USB flash itd. Fokusiraćemo se na proces butovanja preko hard diska jer je to najčešće korišćeni način butovanja. Prvi sektor na hard disku se zove Master Boot Record (MBR). Ovaj sektor je veličine 512b i organizovan je u dva dela. U prvom delu veličine 446b nalazi se izvršni kod primarnog boot loader-a, a u drugom delu veličine 64b nalazi se opis particija hard diska, poznatiji pod nazivom „partition table“.

Podrazumevano, MBR izvršni kod traži prvu aktivnu particiju, kada je pronađe učitava njen boot sektor u memoriju i prepušta mu kontrolu nad operativnim sistemom. GRUB zamenjuje standardni MBR izvršni kod svojim kodom i na taj način upravlja podizanjem sistema. Pošto GRUB nosi mnogo više informacija o particijama od prosečnog boot loader-a, kao i veliki broj mogućih opcija za konfiguraciju, sama veličina GRUB koda pravazilazi veličinu partition table prostora, pa je zato GRUB podeljen u dva modula ili „stage“-a.

Prvi stage je locinaran u MBR-u i u sebi sadrži pokazivače na adrese drugog stage-a, koji je lociran na hard disku i u sebi sadrži skripte sa svim opcijama i konfiguracijama potrebnim GRUB-u.


Na hard disk-u GRUB skladišti svoje fajlove na tri lokacije:

/boot/grub/grub.cfg
Na ovoj lokaciji se nalazi konfiguracioni fajl čije se stavke konfigurišu na osnovu promena u GRUB skriptama.

/etc/grub.d/
U ovom direktorijumu se nalaze skripte koje GRUB kreira, poziva pri radu i na osnovu kojih konfiguriše grub.cfg. Po difoltu postoji šest skripti u direktorijumu, navešćemo ukratko funkciju svake od njih:

00_header
Ovde imamo upamćene razne sistemske parametre kao i vrednosti stavki u /etc/difolt/grub fajlu.
05_debian_theme U ovoj skripti se podešava tema GRUB boot menija, pozadina, boja teksta, font, rezolucija itd.
10_linux Ova skripta učitava sa root particije instalirane verzije kernela, recovery moda, i prikazuje ove stavke u GRUB boot meniju.
20_memtest86+ Učitava alat pod imenom memtest86+.
30_os-prober Ova skripta skenira hard disk tražeći druge operativne sisteme, i ako ih ima kreira boot unose za instalirane operativne sisteme.
40_custom Ovo je skripta koja nam koristi kao templejt za kreiranje naših skripti ukoliko želimo da dodamo neke nove funkcije u GRUB boot loader-u.

/etc/difolt/grub
U ovom fajlu se nalaze opcije za podešavanje GRUB boot menija koje utiču na sadržaj skripti na lokaciji /etc/grub.d/, a zatim se pozivom komande sudo update-grub zadate promene pamte u grub.cfg fajlu, a ako grub.cfg nije još uvek keriran kreira se novi fajl pod ovim imenom.

grubcfg

DODAVANJE NOVE SKRIPTE

Da bi mogli da napravimo neku promenu u konfiguracionom fajlu grub.cfg moramo da: 1. izmenimo stavke u fajlu na lokaciji /etc/difolt/grub i promenimo sadržaj skripti na lokaciji /etc/grub.d/ ili 2. dodamo neku novu funkciju dodavajući našu vlastitu skriptu.

Kako dodati skriptu?
Šel (shell) skriptu dodajemo kreirajući novi fajl u folderu na adresi /etc/grub.d/. Pri imenovanju novog fajla moramo poštovati dogovoreni format XX_ime_skripte gde je XX dvocifreni broj. Dvocifrenim brojem u imenu skripte određujemo njen položaj u GRUB boot meniju. Manji brojevi idu na početak menija, a veći na kraj, poštovajući numerički raspored.

Uzmimo za primer da nam se skripta zove: 08_naša_skripta , ona će u GRUB boot meniju biti postavljena pre liste instaliranih Linuks distribucija jer se one čitaju iz skripte 10_linux.
Ako želimo da bude postavljena posle liste instaliranih Linuks distribucija onda našu skruptu treba preimenovati. Možemo je nazvati 11_naša_skripta.

Evo primera izgleda skripte koja dodaje novi boot entry (unos):

#!/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

Kao što smo već naveli, ovo je shell skripta, tako da većina administratora Unix-like sistema ne bi trebalo da ima mnogo muke u razumevanju GRUB konfiguracionih skripti.

Evo i pojašnjenja:

echo „Neki string koji nam bliže opisuje funkciju skripte“ je string kojeg ćemo videti kada pokrenemo sudo update-grub naredbu i u toku izvršenja ona dođe do ovog dela koda. Ako ne želimo da se pojavljuje ovaj string možemo jednostavno da ga se rešimo komandom echo „Neki string koji nam bliže opisuje funkciju skripte“.

cat << EOF označava početak koda koji treba da izvrši boot entry

menuentry „Ime boot entry-a“ ovim zadajemo ime boot unosa u GRUB boot meniju.

set root=(hdX,Y) definišemo na kom hard disku i na kojoj particiji se nalaze GRUB konfiguracioni fajlovi za određeni operativni sistem čiji boot unos kreiramo. U delu komande (hdX,Y), hd označava hard disk, X je redni broj hard diska, a Y oznažava redni broj broj particije na označenom hard disku. Treba napomenuti da se hard diskovi broje počev od 0, dok se particije broje od 1 pa na gore. Ako hoćemo da označimo drugu particiju na prvom hard disku napisaćemo (hd0,2).

boot parametri — ovde postavljamo parametre za butovanje sistema koji se razlikuju od jednog do drugog operativnog sistema. Na primer ako koristimo Linuks u ovoj sekciji možemo da stavimo:
linux /boot/vmlinuz
initrd /boot/initrd.img

Za one koji koriste sisteme koji nemaju nativnu podršku za GRUB bootloader, kao na primer Vindovs, u ovom delu treba ukucati:
chainloader (hdX,Y)+1
gde način odabira hard diska odgovara onom objašnjenom kod „set root“ komande.

EOF označava kraj GRUB boot entry-ja.

Primer kompletnog koda za GRUB boot entry Linuks sistema bi izgledao ovako:

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

Dok bi za Vindovs operativni sistem skripta trebalo da izgleda ovako:

#!/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

Na kraju da bi skripta koju smo napisali mogla da se izvršava treba je načiniti izvršnom putem komande:

chmod +x XX_ime_skripte
Nakon svega ovoga da bi promene koje smo načinili bile vidljive u GRUB boot meniju, potrebno je pokrenuti komandu:
sudo update-grub kako bi promene bile upamćene u GRUB konfiguracionom fajlu na adresi /boot/grub/grub.cfg.

PODEŠAVANJE GRUB BOOT MENIJA

Sada ćemo se pozabaviti konfiguracijom GRUB boot menija na osnovu fajla dostupnog na lokaciji /etc/default/grub. Ovde možemo podesiti stavke kao što su boot timeout, default selection, prikazivanje nekih stavki u GRUB boot meniju itd.

etc-difolt-grub

Sledi kraći opis ponuđenih opcija:

GRUB_DEFAULT nam omogućuje da podesimo podrazumevani boot entry tako što ćemo navesti redni broj željenog boot unosa na osnovu njegovog rednog broja u fajlu grub.cfg. Brojevi počinju od 0. Na primer: GRUB_DEFAULT=0. Takođe, možemo navesti i puno ime boot unosa u obliku stringa GRUB_DEFAULT=“Windows 7″. Ako želimo da pri podizanju sistema difolt boot entry bude poslednji selektovani boot entry pri prethodnom podizanju operativnog sistema ova stavka treba da izgleda na sledeći način: GRUB_DEFAULT=saved.

GRUB_HIDDEN_TIMEOUT predstavlja broj sekundi koje sistem sačeka pre nego što prikaže boot menije, tj. predstavlja dužinu trajanja pauze pri butovanju. Korisnik može prekinuti ovo čekanje pritiskom na bilo koji taster na tastaturi.

GRUB_HIDDEN_TIMEOUT_QUIET ovde biramo da li će biti prikazan brojač prilikom pauziranja pri podizanju sistema. Ako je vrednost True onda neće biti brojača, a ako je dodeljena vrednost False brojač će pokazivati koliko je još sekundi preostalo.

GRUB_TIMEOUT predstavlja vreme za koje GRUB boot menu čeka da korisnik sam odabere boot entry, u suprotnom učitava difolt boot entry.

GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian ovom opcijom je podešeno da se u boot meniju prikazuje pun opis boot unosa. Na primer: „Ubuntu“, „Arch“ itd.

GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash“ ako želimo da podizanje operativnog sistema vidimo u obliku teksta koji nam daje informacije o procesima koji učestvuju u podizanju sistema trebamo obrisati „quiet splash“. Takođe, ukoliko želimo da koristimo grub splash image, odnosno da se tokom podizanja operativnog sistema vidi slika, treba postaviti „splash“.

#GRUB_TERMINAL=console ako želimo da isključimo grafički terminal trebamo obrisati oznaku komentara.

#GRUB_GFXMODE=640×480 GRUB sam podešava rezoluciju boot menija na najbolju moguću za datu konfiguraciju, ali ukoliko želimo da sami postavimo željenu rezoluciju treba obrisati oznaku komentara i upisati vrednost rezolucije.

#GRUB_DISABLE_RECOVERY=“true“ brisanjem oznake komentara zabranjujemo automatsko generisanje recovery moda unosa.

#GRUB_INIT_TUNE=“480 440 1″ brisanjem oznake komentara uključujemo biper koji se oglašava prilikom pokretanja GRUB-a.

Napomena: nakon promene bilo koje od ovih stavki obavezno pokrenuti sudo update-grub da bi promene bile memorisane u konfiguracionom fajlu grub.cfg.

WINDOWS BOOT LOADER vs GRUB

Danas većina Linuks distribucija sa sobom donosi GRUB kao podrazumevani bootloader. Prilikom instalacije sistema automatski se generišu GRUB skripte tako da se bez ikakvih problema, u samom procesu instalacije dodaje boot entry datog sistema. Ukoliko već imamo instaliranu neku Unix-like distribuciju sa lakoćom možemo dodati neki drugi srodni operativni sistem. U slučaju da smo na računaru pre instalacije Unix-like distribucije imali Vindovs, u toku same instalacije automatski će biti instaliran GRUB kao zamena za Vindovsov boot loader i biće kreirana skripta sa boot entry-ima oba sistema.

Problem nastaje kada već imamo instaliranu neku od Linuks distribucija ili više njih i nakon toga instaliramo Vindovs. Vindovs boot loader preklopi GRUB tako da prilikom podizanja sistema direktno učitava Vindovs i ostali sistemi instalirani ranije nestaju bez traga zajedno sa GRUB boot menijem. No, stvari nisu tako crne kao što izgledaju, GRUB je sve vreme tu samo što je zamenjen Vindovsovim boot loader-om.

Kako povratiti GRUB?

Postoje dve varijante. Prva je jednostavna ali nam je neophodan rescue CD pod imenom Super Grub Disk, o ovoj metodi možete se informisati na stranici http://www.supergrubdisk.org/software/. Druga metoda zahteva malo pešačkog rada i mi ćemo se pozabaviti ovom drugom metodom.

Potreban nam je live CD neke Linuks distribucije koja koristi GRUB kao difolt boot loader. Treba pokrenuti Linuks preko live CD-a i otvoriti terminal, pronaći hard disk i particiju na kojoj je instaliran GRUB boot loader. Ukoliko ne znamo ime particije na kojoj je instaliran GRUB boot loader u terminalu sistema pokrenutog preko live CD-a unesemo komadnu sudo fdisk -l koja nam daje listu i opis hard diskova i particija.

fdisk

Napomena o nomenklaturi particija: format nomenklature je NdXY gde N može da bude ‘h’ ili ‘s’ a XY predstavljaju pozicije hard diskova i particija respektivno.

Sada kada znamo ime particije (primer na testiranom sistemu: ime particije je sda1), treba mount-ovati tu particiju komandom mount /dev/sda1 /mnt.
Zatim pokrećemo komandu za obnovu GRUB-a na željenom hard disku, u našem slučaju oznaka željenog hard diska je sda pa će komanda imati oblik sudo grub-install –root-directory=/mnt /dev/sda. Nakon toga treba unmount-ovati particiju komandom sudo umount /mnt i restartovati računar. Nakon restarta sve bi trebalo da bude na svom mestu.

Zaključak

GRUB je veoma moćan i upotrebljiv alat za sve situacije kada je potrebno koristiti više operativnih sistema na jednom računaru ili ukoliko želite da eksperimentišete sa različitim operativnim sistemima, istražujete i optimizujete moguće načine u podizanju istih.

Ukoliko se bavite razvojem i tema vam je posebno zanimljiva moguće je pridružiti se zajednici i poslati predloge i ideje za novu verziju. GRUB se konstantno aktivno razvija, za detaljnije informisanje raspoloživa je zasebna mejling lista namenjena developerima.

itmogul-logoTekst je preuzet sa ugašenog bloga IT modul i originalni autor ovog teksta je Nenad Stojiljković. Kompjuteraš IT blog objavljuje tekstove sa tog bloga kako riznica znanja sa te lokacije ne bi otišla u zaborav.