Boot Loaders: Grub en Lilo

Wat is een boot loader? Dit is het programma waarmee een PC bij het opstarten het besturingssysteem binnenhaalt. De meeste besturingssystemen (als Windows) hebben zoiets ingebouwd, maar soms is het handig om er toch iets meer van te weten.

Let op: nieuwere versies van Linux (zoals Ubuntu 9.10) gebruiken GRUB2. Deze bootloader, met meer mogelijkheden, wordt op deze pagina nog niet besproken! Hier een goede pagina met uitleg over GRUB2 (Nederlandstalig).

Dit is vooral van belang als je meerdere besturingssystemen op je PC wilt hebben, zoals bij mij het geval is (Ubuntu Linux, Windows Vista, Windows Millennium). Dan moet je zelf een boot loader installeren, die je deze keuze-mogelijkheid geeft. In mijn geval is dat GRUB, de boot loader die ook  bij Ubuntu meegeleverd wordt.

Op deze pagina geen volledige uitleg, maar wat hints, tips en ervaringen die ik daarmee heb, en ook met LILO (een wat oudere boot loader, die bij Knoppix zit). Meer info is uiteraard wel te vinden in het GRUB manual (Engelstalig).

Boot entries voor Windows Millennium en Vista in Grub

Mijn ervaringen met Vista/Ubuntu/Millenium dual boot zijn te vinden op mijn Dual-boot Vista/Millennium pagina.

Grub is een flexibele boot loader (Grub staat voor 'GRand Unified Bootloader'). Het haalt bij installatie de configuratie uit een tekstfile genaamd '/boot/grub/menu.lst'.  In deze menu.lst staan de opties voor GRUB, plus per operating systeem de gegevens die het nodig heeft om deze te starten. Bij standaard installatie van bijvoorbeeld Ubuntu zal deze al automatisch worden opgezet, maar soms (met name bij afwijkende operating systemen) kan handmatige aanpassing nodig zijn.

De door Ubuntu gemaakte file op mijn Ubuntu/Vista/Millennium systeem krijgt er van mij aan het einde de volgende entries bij (kan zijn dat grub deze al gedeeltelijk zelf heeft toegevoegd):

# Deze entry heb ik dus zelf gemaakt
title        Windows Me
root        (hd0,0)
makeactive
chainloader    +1

# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/hda1 (en door mij wat aangepast)
title        Windows Vista
root        (hd0,1)
savedefault
makeactive
chainloader    +1

Dit geeft Grub de informatie om bij booten een menu weer te geven met de beschikbare opties (zoals aangegeven bij de 'title' regels). Naast de Ubuntu-entries zijn er nu 'Windos Me' en 'Windows Vista'  bijgekomen, waarbij Vista de default is (als je bij het booten niets doet, wordt Vista gestart). Pas eventueel de getallen in het root-commando aan als je andere partities/disks gebruikt; het eerste getal (getal aan 'hd') is het disknummer, het tweede getal de partitie op die disk.

Hoe krijg je dit toevoegen voor elkaar in Ubuntu:

  • In een terminal window (Applications -> Accessoires -> Terminal) moet je de file editen met beheerdersrechten (file is niet standaard te bewerken): commando 'sudo gedit /boot/grub/menu.lst'. sudo doet het commando als super user: het eigenlijke commando is gedit, een tekst-editor.
  • Ook aanpassen: zorg dat bij de Vista entry het commando 'savedefault' staat, en in het begin moet de optie 'default saved' gezet zijn (commentaarteken verwijderen). Hiermee wordt na de eerste keer Vista starten onthouden dat dit de default (standaard) moet zijn.
  • Na bewerken (vergeet niet op te slaan) grub initialiseren met het commando 'sudo grub-install /dev/hda'

Als je nu opnieuw opstart zou in het bootmenu zowel Vista als Millennium (en natuurlijk nog steeds de entries van Ubuntu) zichtbaar moeten zijn. Kies nu Vista in het menu, en druk op 'Enter' om Vista te starten. Volgende keren zal Vista standaard na een aantal seconden moeten starten (tenzij je zelf een andere keuze maakt).

Windows ME op een tweede harde schijf

Normaal is het niet mogelijk om Windows op je tweede harde schijf te hebben staan. Toch wilde ik dat voor elkaar krijgen: ik had een oude bestaande PC uitgebreid met een 'nieuwe' schijf. Deze schijf wil ik als eerste zien (master), met hierop Ubuntu. Maar, daarnaast wilde ik de bestaande harde schijf met Windows Millennium ook nog er in houden, als slave schijf (D:, zeg maar).

Hiervoor kan je GRUB uitleggen dat hij, als hij hier Windows ME boot, eerst de schijfnummers moet omdraaien... De entry in GRUB ziet er dan als volgt uit:

# hier wordt de tweede schijf gewisseld met de eerste (C: met D:)
title        Windows Me
map         (hd0) (hd1)
map         (hd1) (hd0)
root        (hd1,0)
makeactive
chainloader    +1

(ps: stond een fout in bovenstaande code in het root commando, is nu gecorrigeerd). En zowaar, nu start Windows ME vlekkeloos op van de tweede disk (die vanuit Windows ook netjes nu C: was). Ook heeft GRUB mogelijkheden om partities onzichtbaar te maken (als je bv van de tweede partitie wilt starten, en de eerste daarvoor in de weg zit), en zo voort. Meer info uiteraard in het GRUB manual.

Herstellen van Grub

Het herstellen van Grub (bijvoorbeeld doordat deze is overschreven door een nieuwe installatie van Windows) is minder eenvoudig dan vaak op webpages is te lezen, zeker met de nieuwere Ubuntu's (ik gebruik nu 8.10 Intrepid Ibex). Bij het zoeken op 'reinstall Grub' vind ik een link met uitleg die voor mij de zaak werkend kreeg: How to restore Grub from a live Ubuntu cd.

De kunst is om Grub de goede Linux weer te kunnen laten vinden; door de disks voor hem open te stellen (mounten). Uitleg op de genoemde pagina, hier in het kort het recept (vervang de sda3 door de voor jou van belang zijnde drive):

sudo mkdir /mnt/root
sudo mount -t ext3 /dev/sda3 /mnt/root
sudo mount -t proc none /mnt/root/proc
sudo mount -o bind /dev /mnt/root/dev
sudo chroot /mnt/root /bin/bash
sudo grub

Vervolgens in Grub de volgende commando's, hd0 staat voor de eerste hard disk, de 2 door de derde partitie, waar bij mij Ubuntu staat (vervang hierbij de 'hd0' en de '2' door de voor jou van toepassing zijnde partitie zoals gemeld door het find commando in de eerste regel hieronder).

find /boot/grub/stage1
root (hd0,2)
setup (hd0)

Daarna opstarten, en je Ubuntu is er weer! Wel moest ik vervolgens nog handmatig de entry voor Vista weer in /boot/grub/menu.lst aanbrengen...

Andere handige GRUB opties

Andere opties waar je zeker eens naar moet kijken:

  • password, om het tijdens booten wijzigen van opstartgegevens te voorkomen
  • hide (en unhide), om partities voor Windows te verstoppen, bijvoorbeeld om de tweede Windows partitie te booten zonder dat de eerste in de weg zit
  • color, voor een mooie kleurige weergave van het boot menu
  • hiddenmenu, als je standaard niet het opstartmenu wilt laten zien (met 'Esc' toch op te roepen)
  • timeout <num>, zet de vertraging waarna automatisch de default-keuze wordt opgestart
  • Bij linux kernels kan je achter het kernel commando extra opties geven. Zo moet ik Ubuntu op een oude PC de optie acpi=force meegeven, om de automatische power management de voeding goed uit te laten schakelen (kernel /boot/vmlinuz-2.6.15-29 root=/dev/hda3 ro quiet splash acpi=force)

Lilo en de D-schijf

LILO is een oudere boot loader (ik gebruik tegenwoordig de bovengenoemde GRUB), hier wat tips voor mensen die nog LILO gebruiken.

Op mijn Linux pagina: ik had Knoppix en Windows Millennium op een systeem, naast elkaar. Maar.... Waar is mijn D:-schijf gebleven? Vanuit Linux zie ik hem, maar vanuit Windows is hij volledig onzichtbaar... Lees hiervoor verder op mijn boot loader pagina...

Het blijkt (na enkele uren zoekwerk, waarvan ik de details zal besparen) dat LILO vind dat Windows gestart op C: voldoende heeft aan alleen C:, en de D: schijf op verborgen (hidden) zet, keihard in de partitietabel. Na nog wat zoeken blijk je dit in de LILO configuratiefile wel te kunnen beïnvloeden, maar dat is nog niet triviaal. Je moet LILO het goede type partitie laten zetten, als hex code. Welke hex code? Met behulp van de tips op 'Windows 95 Partition Bug' de partitietabel gedumpt: de partities zijn (interpretatie volgens 'List of partition identifiers for PCs'):

Type waardes hangen af van je filesystem, de genoemde waarden 0x0C/0x1C zijn geldig voor FAT32/LBA.

Voor NTFS is het type ingebouwd: 'NTFS' (met code 0x07).

  • 0x0C (WIN95 OSR2 FAT32, LBA-mapped)
  • 0x1C (Hidden WIN95 OSR2 FAT32, LBA-mapped)
  • 0x83 (Linux native partition)
  • 0x83 (Linux swap partition).

BINGO! Blijkbaar moet ik het type van D: laten omzetten van 0x1C naar 0x0C. Hiervoor moet ik de file /etc/lilo.conf editten: een stukje toevoegen om LILO een nieuw disk type te leren (let op. moet met root-rechten, dus in super-user mode: su commando):

# KM: set disk types correct: disk type for FAT32/LBA
change-rules
    type=DOS32_LBA
        normal=0x0c

En dan de eigenlijke opdracht om het disk-type te zetten bij booten van Windows, wat een wijziging is in het laatste deel van lilo.conf (toevoegen van het change commando met partition en set argument):

other=/dev/hda1
    label="Windows"
    change
        partition=/dev/hda2
        set=DOS32_LBA_normal

   
#other=/dev/hda2
#    label="Windows(hda2)"

Merk op dat ik ook het label gewijzigd heb (van "Windows(hda1)" naar "Windows" en de D: schijf uit de lijst van boot-opties uitgecommentarieerd heb (bevat alleen data, geen Windows installatie, dus booten heeft daarvandaan geen zin). Nu nog wel even de default boot in lilo.conf aanpassen: even opzoeken, en veranderen naar:

default="Windows"

Nu eerst het commando 'lilo' draaien om de bootsector up te daten. En nog eens opstarten. Keurig Lilo menu, met als default "Windows", wat inderdaad na enkele seconden gestart wordt! En.... D: is weer terug! Na toch heel wat speurwerk... Dual boot operatie geslaagd!

Hints/tips

Hier wat hints die ik bij mijn eerste omzwervingen nuttig vond:

  • Uitleg over Grub (Engelstalig manual), uitleg over Grub/XP op het Nederlandstalige Linux Forum
  • Nieuwere versies van Linux (zoals Ubuntu 9.10) gebruiken GRUB2. Hier een goede pagina met uitleg over GRUB2 (Nederlandstalig).
  • Knoppix op harde schijf: Als je de bootconfiguratie in etc/lilo.conf wijzigt moet je daarna 'lilo' draaien om deze wijzigingen actief te laten worden. Lilo installeert dan een aangepaste boot sector.
  • Knoppix op harde schijf, en veranderingen gemaakt in de partitiebeschrijving /etc/fstab? Knoppix zal deze weer overschrijven, tenzij je in lilo.conf de optie 'nofstab' toevoegt in de 'append=' regel(s)
  • Van Lilo of Grub terug naar de Windows boot manager? Windows commando: FDISK /MBR
  • Vista/XP: Microsoft legt op zijn site het gebruik van hun boot configuration editor bcdedit uit (maar, die kan dus ook geen Millennium aan). Meer uitleg over bcdedit op ProNetworks
  • Er is ook al een (gratis) tool met grafische user interface voor bcdedit: VistaBootPro (bcdedit is command-line only)
  • Op Port25 wat meer uitleg over de combinatie Linux/Vista bootloader
  • En ook op Pro-Networks uitleg over het gebruik van de Linux bootloader 'Grub' om Linux en Vista vanuit Grub te starten