Linux

YABT: Yet Another Bootloader Topic (Οδηγός ρύθμισης GRUB/Lilo)

09/11/2010 01:16 μμ | apoikos από apoikos


Απέκδυση ευθυνών (Ελληνιστί «Ντισκλέημερ»): Τα παρακάτω παρατίθενται αποκλειστικά και μόνο ως βοήθεια προς οποιονδήποτε προσπαθήσει να ανακατευτεί με τους bootloaders στο Linux. Όπως είναι αντιληπτό, δεν έχω δοκιμάσει όλα τα δυνατά setups και όλα τα δυνατά layouts πάνω στο δίσκο, οπότε οι παρακάτω προτάσεις είναι πιθανό να μη δουλέψουν. Δε φέρω καμία ευθύνη σε περίπτωση που εφαρμόζοντας κάτι από τα παρακάτω δεν bootάρει το σύστημά σας, καεί το βίντεό σας, σας παρατήσει η κοπέλα σας ή καταπιεί το σπίτι σας μία μαύρη τρύπα.

 

 

__TOC__

 

 

 

Εισαγωγή

Ο παρών οδηγός γράφτηκε απλά και μόνο για να διευκολύνει τους χρήστες GNU/Linux να αντιμετωπίσουν το τέρας των bootloaders, ένα θέμα που έχει πολλές φορές απασχολήσει το αξιολογότατο (sic) φόρουμ του insomnia. Η ανάλυση του θέματος γίνεται παράλληλα για τον lilo και τον GRUB, τους δύο πιο διαδεδομένους bootloaders συστήματων GNU/Linux, και καλύπτει τις εξής διαδικασίες (με την αυτή σειρά):

 

  • Ρύθμιση
  • Εγκατάσταση
  • Απεγκατάσταση

 

 

Λυπάμαι, αλλά αν χρησιμοποιείτε κάτι άλλο θα πρέπει να απευθυνθείτε στο google.

 

Ας περάσουμε στο ψητό τώρα.

 

 

 

Ρύθμιση

Lilo

Όλες οι ρυθμίσεις του lilo γίνονται μέσα από το /etc/lilo.conf. To lilo.conf χωρίζεται σε δύο μέρη, την κεφαλίδα και το σώμα. Στην κεφαλίδα περιέχονται οι βασικές ρυθμίσεις του lilo:

 

>
# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/hda
lba32
prompt
default=2.4.28
timeout = 50
# Normal VGA console
vga = normal

 

Ακολουθεί ανάλυση των παραμέτρων της κεφαλίδας:

  • boot =
    Η παράμετρος αυτή καθορίζει το που θα εγκατασταθεί ο lilo. Αν βάλουμε boot = /dev/hda, τότε ο lilo εγκαθίσταται στον MBR του primary master σκληρού. Αν βάλουμε /dev/hdb, τότε εγκαθίσταται στον MBR του secondary master, ενώ αν βάλουμε /dev/hda2, τότε ο lilo θα εγκατασταθεί στον bootrecord του δεύτερου primary partition του primary master σκληρού, κ.ο.κ. Για τη σωστή ρύθμιση της παραμέτρου αυτής, δείτε παρακάτω, στην ειδική παράγραφο.
     
  • lba32
    Η επιλογή αυτή εξασφαλίζει συμβατότητα με τους μεγάλους σκληρούς δίσκους και τα νεότερα BIOSes, και είναι απαραίτητη αν θέλουμε να μπουτάρουμε πυρήνα που βρίσκεται πέρα από τον 1024 κύλινδρο του σκληρού δίσκου. Γενικά είναι καλό να υπάρχει στο lilo.conf.
     
  • prompt
    Η επιλογή αυτή λέει στο lilo να μας βγάλει ένα prompt στο οποίο να μας ζητάει να επιλέξουμε ποιό λειτουργικό θέλουμε να ξεκινήσουμε
     
  • default =
    Η επιλογή αυτή δείχνει το προεπιλεγμένο λειτουργικό που θα εκκινείται αν δε δωθεί κάποια διαφορετική εντολή από το χρήστη. Δίπλα στο ίσον γράφουμε την ετικέτα (label) του αντίστοιχου λειτουργικού (βλ. παρακάτω).
     
  • timeout =
    Η επιλογή αυτή δηλώνει πόσο πρέπει να περιμένει ο lilo μέχρι να πατήσει κάποιο πλήκτρο ο χρήστης, ειδάλλως να προχωρήσει στο bootάρισμα του default λειτουργικού. Το χρονικό διάστημα ορίζεται σε δέκατα του δευτερολέπτου (10 = 1 sec).
     
  • vga =
    Η επιλογή αυτή καθορίζει την ανάλυση που θα χρησιμοποιείται στην κονσόλα του linux. Θέτοντας vga = 791 έχουμε 1024x768x16bpp, ενώ με vga = 788 έχουμε 800x600x16bpp. Σημειώνεται ότι για να δουλέψει η κονσόλα σε αυτή την ανάλυση πρέπει ο πυρήνας που bootάρει να έχει υποστήριξη για VESA Framebuffer.

 

Μετά την κεφαλίδα ακολουθεί το κυρίως σώμα του αρχείου, στο οποίο βρίσκονται οι καταχωρήσεις για τα διάφορα λειτουργικά. Οι καταχωρήσεις αυτές έχουν τη μορφή:

>
image = /boot/linux-2.4.21
root=/dev/hda1
label=2.4.21
append="devfs=nomount"

other = /dev/hda3
label = WinXP
table = /dev/hda

 

Κάθε καταχώρηση ξεκινά με τη γραμμή 'image =' (αν πρόκειται για καταχώρηση Linux) ή 'other =' (αν πρόκειται για καταχώρηση άλλου λειτουργικού - π.χ. Windows). Για τις καταχωρήσεις Linux δίνονται συνήθως οι παράμετροι:

  • image =
    Η πλήρης διαδρομή προς τον εκάστοτε πυρήνα Linux.
     
  • root =
    Το device node του root partition, τι δηλαδή θα γίνει mount στο /. Γενικά ο πυρήνας ενδέχεται να μην το χρειάζεται, αλλά καλού-κακού το βάζουμε.
     
  • label =
    Ετικέτα της συγκεκριμένης καταχώρησης, δηλαδή το όνομα που θα εμφανίζεται στο μενού του lilo. Αν θέλουμε να περιέχει και κενά, τότε πρέπει να το περικλείουμε σε " ". Καλό είναι γενικά να αποφεύγουμε τα κενά.
     
  • append =
    Οι παράμετροι που περνάνε απευθείας στον πυρήνα. Για περισσότερες πληροφορίες ανατρέξτε στο /usr/src/linux/Documentation/kernel-parameters.txt
     
  • initrd =
    Η πλήρης διαδρομή προς το initial ramdisk, αν χρησιμοποιείται κάτι τέτοιο (θα το δείτε κυρίως σε RedHat-based συστήματα).

 

Στις καταχωρήσεις άλλων λειτουργικών, ενδιαφέρουν οι εξής παράμετροι:

  • other =
    Το partition από το οποίο θα bootάρει το άλλο λειτουργικό. Πρέπει να υπάρχει εγκατεστημένος o bootloader του άλλου λειτουργικού στον bootrecord του partition αυτού. Αν πρόκειται για windows, είναι απλά το partition στο οποίο τα έχουμε εγκαταστήσει.
     
  • label =
    Βλ. παραπάνω
     
  • table =
    Ορίζουμε το δίσκο του οποίου το partition table θα περάσει ως πληροφορία στο bootloader του άλλου λειτουργικού. Βάζουμε το δίσκο στον οποίο βρίσκεται το άλλο λειτουργικό, π.χ. /dev/hda ή /dev/hdb.

 

Στο παραπάνω παράδειγμα φαίνεται μία καταχώρηση για Linux, που bootάρει τον πυρήνα /boot/linux-2.4.21 και μία καταχώρηση για Windows XP, που βρίσκονται εγκατεστημένα στο partition /dev/hda3.

 

Τονίζεται ότι μετά από κάθε αλλαγή που γίνεται στο /etc/lilo.conf, πρέπει να τρέχουμε το lilo δίνοντας '/sbin/lilo', διαφορετικά οι αλλαγές δε θα ισχύσουν.

 

 

GRUB

Οι ρυθμίσεις του GRUB γίνονται στο αρχείο /boot/grub/grub.conf ή /boot/grub/menu.lst (στις παλαιότερες διανομές).

Το αρχείο γενικά έχει την ίδια δομή με το lilo.conf: μια κεφαλίδα και το κυρίως σώμα, στο οποίο ορίζονται οι καταχωρήσεις των λειτουργικών.

Από την κεφαλίδα σε πρώτη φάση ενδιαφέρουν μόνο η επιλογή 'timeout =', η οποία δέχεται ως όρισμα - σε δευτερόλεπτα - το χρόνο που περιμένει ο grub μέχρι να φορτώσει την default επιλογή, και η επιλογή 'default' η οποία ορίζει ποιά καταχώρηση θα επιλέγεται αυτόματα:

 

>
# Boot automatically after 30 secs.
timeout 30

# By default, boot the first entry.
default 0

# Fallback to the second entry if booting the first one fails.
fallback 1

 

Οι καταχωρήσεις λειτουργικών στο menu.lst έχουν τη μορφή:

>
Τίτλος
Παράμετροι
Ενέργεια

 

Μία τυπική καταχώρηση για το bootάρισμα Linux είναι η ακόλουθη:

 

 

>
title  Linux
root   (hd0,8)
initrd /boot/initrd.gz
kernel /boot/vmlinuz root=/dev/hda9 quiet video=vesafb:mtrr,ywrap,1024x768-32@85 splash=fadein,silent,theme:livecd-2005.0 elevator=cfq CONSOLE=/dev/tty1

 

 

Επεξήγηση των παραμέτρων:

  • title:
    Η παράμετρος αυτή δε χρειάζεται επεξήγηση :-P
  • root:
    Δίνει τον αριθμό του root partition. Το hd0,8 αντιστοιχεί στο hda9. Η πληροφορία αυτή είναι αρκετά σημαντική, αφού με βάση αυτή θα αναζητηθεί ο πυρήνας που ορίζεται στην παράμετρο 'kernel'. Δηλαδή αν το /boot είναι χωριστό partition, π.χ. το /dev/hda2, εδώ πρέπει να μπει: root (hd0,1) και στην επιλογή kernel /vmlinuz και όχι /boot/vmlinuz. Αν όμως το /boot είναι απλά υποκατάλογος στο root partition, τότε στο root μπαίνει ο αριθμός του root partition και στο kernel η πλήρης διαδρομή για τον πυρήνα (δηλ. /boot/vmlinuz).
    Για πληροφορίες σχετικά με την αριθμοδότηση βλ. ενότητα "Εγκατάσταση".
  • initrd:
    Προσδιορίζει το αρχείο του initial ramdrive, αν χρησιμοποιείται κάτι τέτοιο.
  • kernel:
    Προσδιορίζει τη θέση του πυρήνα, μαζί με τις παραμέτρους που θα περάσουν σε αυτόν κατά την εκκίνηση.

 

Μία τυπική καταχώρηση για το bootάρισμα Windows από την άλλη, είναι η ακόλουθη:

>
title Windows XP Professional
rootnoverify (hd0,2)
makeactive
chainloader +1

 

Την καταχώρηση αυτή μπορείτε να τη χρησιμοποιείτε as-is, αλλάζοντας μόνο το rootnoverify ώστε να δείχνει στο partition των windows ;-)

 

Σε αντίθεση με το lilo, κάθε αλλαγή στο αρχείο αυτό δεν απαιτεί επανεκτέλεση του grub. Οι αλλαγές απλά ισχύουν αυτόματα στο επόμενο boot.

 

 

 

Εγκατάσταση

MBR vs Partition Bootrecord

Υπάρχουν δύο εναλλακτικές «στρατηγικές» για την εγκατάσταση ενός bootloader: το να εγκατασταθεί στον MBR ή το να εγκατασταθεί στο bootrecord ενός άλλου partition. Και οι δύο έχουν πλεονεκτήματα και μειονεκτήματα, τα οποία όμως για να τα κατανοήσουμε είναι απαραίτητη η γνώση της διαδικασίας εκκίνησης του υπολογιστή:

 

  1. Ο υπολογιστής ανάβει και κάνει το POST check.
  2. Μόλις τελειώσει το POST διαβάζει τον MBR του boot device.
  3. Ο MBR περιέχει ένα μικρό «πρόγραμμα» που αναλαμβάνει να συνεχίσει το φόρτωμα. Π.χ. αν ο GRUB έχει εγκατασταθεί στον MBR, τότε το «πρόγραμμα» που βρίσκεται στον MBR φορτώνει το interface του GRUB. Αν στο MBR βρίσκεται ο Windows Loader τότε απλά ψάχνει να βρει το Active Primary partition και να μεταφέρει τον έλεγχο της εκκίνησης στον bootrecord του partition αυτού.

 

Επομένως υπάρχουν δύο δυνατότητες λειτουργίας ενός linux bootloader: ή τον εγκαθιστούμε στον MBR και παίρνει πλήρη έλεγχο του συστήματος στην εκκίνηση, ή τον εγκαθιστούμε στον bootrecord ενός partition και μαρκάρουμε το partition ως active μέσω του fdisk.

 

Στην πρώτη περίπτωση έχουμε πλήρη ευελιξία, ωστόσο σε περίπτωση απεγκατάστασης του Linux πρέπει να απεγκαταστήσουμε χειροκίνητα και το bootloader.

Στη δεύτερη περίπτωση ο bootloader δε χρειάζεται ειδική απεγκατάσταση, ωστόσο υπάρχει ένας βασικός περιορισμός: το partition στο οποίο θα εγκατασταθεί ο bootloader πρέπει να είναι primary.

 

Προσωπικά προτιμώ να εγκαθιστώ τον bootloader στον MBR: είναι πολύ πιο απλή διαδικασία και δουλεύει πάντα. Το μόνο πρόβλημα είναι ότι αν εγκατασταθούν τα Windows μετά το Linux, τότε τα Windows γράφουν νέο MBR, σβήνοντας τον bootloader, οπότε πρέπει να γίνει boot με κάποιο rescue CD και επανεγκατάσταση του Linux ή του GRUB. Παρ' όλα αυτά ως λύση είναι πολύ πιο στιβαρή από την εγκατάσταση του bootloader στον bootrecord ενός partition.

 

 

Lilo

Αφού κάνουμε τις κατάλληλες ρυθμίσεις στο αρχείο /etc/lilo.conf απλά εκτελούμε - ως root - '/sbin/lilo'

Σημειώνεται ότι πρέπει να εκτελούμε την εντολή /sbin/lilo κάθε φορά που αλλάζουμε κάτι στο lilo.conf

 

 

GRUΒ

Εκτελούμε την εντολή mount και βλέπουμε πιο partition αντιστοιχεί στο /boot. Αν δεν υπάρχει εγγραφή για το /boot, τότε το partition είναι το ίδιο με το /. Σημειώνουμε το partition number κάπου γιατί θα το χρειαστούμε.

 

Αφού κάνουμε τις κατάλληλες ρυθμίσεις στο /boot/grub/menu.lst (ή /boot/grub/grub.conf στις νεότερες διανομές), εκτελούμε:

 

>grub

 

Μόλις φορτώσει ο grub θα μας βγάλει σε ένα shell της παρακάτω μορφής:

 

>
   GNU GRUB  version 0.96  (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported.  For the first word, TAB
  lists possible command completions.  Anywhere else TAB lists the possible
  completions of a device/filename. ]

grub>

 

Ξεθάβουμε το partition number του /boot ή του / αν το /boot είναι απλά υποκατάλογος:

Το partition είναι συνήθως της μορφής hdxy ή sdxy, όπου x είναι a,b,c ή d (σπανιότερα e κλπ) και y είναι 1,2,3...

O GRUB περιμένει το partition σε μορφή hdx-1,y-1. Δηλαδή το hda1 γίνεται hd0,0, το hda2 γίνεται hd0,1, το hda8 γίνεται hd0,7 και το hdb5 γίνεται hd1,4.

Αφού λοιπόν βρούμε πως πρέπει να γράψουμε το partition number, δίνουμε:

 

>root (hd0,0)

 

(εδώ για /boot στο hda1 ή αναλόγως με το partition που θέλουμε)

 

και δίνουμε

 

>setup (hd0)

 

για να εγκατασταθεί ο grub στο MBR ή

 

>setup(hd0,8 )

 

για να εγκατασταθεί στον bootrecord του root partition (εδώ hda9, αλλά σε εσάς κατά πάσα πιθανότητα κάτι άλλο).

 

 

 

Απεγκατάσταση

There is no such thing as απεγκατάσταση ενός bootloader, παρά μόνο εγγραφή ενός νέου bootloader από πάνω.

 

Αν ο bootloader ήταν εκτός MBR, τότε μάλλον δε θα σας προκαλέσει κανένα πρόβλημα και απλά θα σβηστεί σβήνοντας το αντίστοιχο partition. Εκτός αυτού, αν απλά επιθυμείτε να απενεργοποιήσετε τον bootloader και να χρησιμοποιήσετε κάποιον άλλο (π.χ. αυτόν των Windows), τότε απλά μπορείτε να μαρκάρετε ως Active το partition των Windows.

 

Στην περίπτωση που ο bootloader βρισκόταν στο MBR, τα πράγματα είναι πιο δύσκολα. Στην περίπτωση του lilo παρέχεται δυνατότητα εγγραφής του παλιού bootloader πάνω από το lilo με την εντολή

 

'/sbin/lilo -u'

 

Ωστόσο κάτι τέτοιο δε συνιστάται, διότι αν έχει αλλάξει το partition table στο ενδιάμεσο ενδέχεται να χαθούν τα νέα partitions (δεν είμαι σίγουρος και δε θέλω να το δοκιμάσω).

Αντ' αυτού προτείνεται η εγκατάσταση του bootloader ενός άλλου λειτουργικού από πάνω. Επειδή συνήθως το "άλλο λειτουργικό" είναι Windows, η διαδικασία αυτή μπορεί να γίνει με δύο τρόπους:

 

  • Με boot από CD των Windows 2000/XP/2003/Vista και επισκευή του MBR μέσω της FIXMBR.
  • Με boot από δισκέτα DOS/FreeDOS και 'fdisk /mbr'

 

 

Μετά απ' αυτό τα ίχνη του bootloader εξαφανίζονται από τον MBR.

 

 

 

Χρήσιμα links

Τεκμηρίωση

 

 

Προγράμματα

  • System Rescue CD
    Χρήσιμο bootable GNU/Linux cdrom με όλα τα απαραίτητα εργαλεία για την επιδιόρθωση όσων προβλημάτων επιδιορθώνονται και όχι μόνο. Εκτός από το κυρίως λειτουργικό του (GNU/Linux) δίνει δυνατότητα bootαρίσματος και σε FreeDOS και memtest86. Περισσότερες πληροφορίες εδώ. Must have :-)
  • FreeDOS: Opensource κλώνος του γνωστού μας λειτουργικού. Η έκδοση 1.0 θα είναι πλήρως συμβατή με το MS-DOS. Προς το παρόν διαθέτει τα περισσότερα εργαλεία του MS-DOS, μεταξύ των οποίων και το απαραίτητο fdisk για το ξήλωμα των bootloaders του Linux από τον MBR.

 

Ιστορικό

v0.1: 16/08/2005

v0.2: 18/08/2005: Προσθήκη links

v0.3: 19/10/2005: Προσθήκη TOC

v0.4: 26/07/2007: Μεταφορά στο Wiki