GNU GRUB bootloaderGRand 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 takodje 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 Erich Stefan Boleyn 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 unapredjenju 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 Linux distribucija, Windows, DOS, Solaris i BSD. Ovaj program nam omogućava da u toku rada računara dinamički upravljamo i konfigurišemo podizanje odredjene 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 floppy disk-a, CD-ROM-a, USB flash drive-a, kao i sa bilo kog drugog BIOS-om podržanog uredjaja.

grubbootmenu

KAKO RADI?   

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

Podrazumevano, MBR izvršni kod traži prvu aktivnu particiju, kada je pronadje učitava njen boot sector 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 default-u 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/default/grub fajlu. 
05_debian_theme   U ovoj skripti se podešava tema GRUB boot menija, pozadina, boja teksta, font,   rezolucija i td. 
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 u koliko želimo da dodamo neke nove funkcije u GRUB boot loader-u.

– /etc/default/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 jos 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/default/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?
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 odredjujemo njen položaj u GRUB boot menu-u. 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 menu-u biti postavljena pre  liste instaliranih linux distribucija jer se one čitaju iz skripte 10_linux.
Ako želimo da bude postavljena posle liste instaliranih linux distribucija onda našu skruptu treba preimenovati. Možemo je nazvati  11_naša_skripta.

Evo primera izgleda skripte koja dodaje novi 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

Kao što smo već naveli, ovo je shell script, 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 dodje 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 odredjeni 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 Linux u ovoj sekciji možemo da stavimo:
linux /boot/vmlinuz
initrd /boot/initrd.img

Za one koji koriste sisteme koji nemaju nativ podršku za GRUB boot loader, kao na primer Windows, 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-a.

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

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

Dok bi za Windows 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-default-grub

Sledi kraći opis ponudjenih 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. Takodje, možemo navesti i puno ime boot unosa u obliku stringa  GRUB_DEFAULT=”Windows 7″. Ako želimo da pri podizanju sistema default 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 default 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”. Takodje, 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 menu-a 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 mode unosa.

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

Napomena: nakon promen 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 Linux distribucija sa sobom donosi GRUB kao podrazumevani boot loader. 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 Windows, u toku same instalacije automatski će biti instaliran GRUB kao zamena za Windows-ov boot loader i biće kreirana skripta sa boot entry-ima oba sistema.

Problem nastaje kada već imamo instaliranu neku od Linux distribucija ili više njih i nakon toga instaliramo Windows. Windows boot loader preklopi GRUB tako da prilikom podizanja sistema direktno učitava Windows 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 Windows-ovim 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  Linux distribucije koja koristi GRUB kao default boot loader. Treba pokrenuti Linux 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 disk-ova 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 disk-u, 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 mailing lista namenjena developerima.

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