Zoeken op website

LFCS: Grand Unified Bootloader (GRUB) configureren en problemen oplossen - Deel 13


Vanwege de recente wijzigingen in de doelstellingen van het LFCS-certificeringsexamen, die van kracht zijn vanaf 2 februari 2016, voegen we de benodigde onderwerpen toe aan de LFCS-serie die hier wordt gepubliceerd. Ter voorbereiding op dit examen wordt u ten zeerste aangemoedigd om ook de LFCE-serie te volgen.

In dit artikel laten we je kennismaken met GRUB en leggen we uit waarom een bootloader nodig is, en hoe deze veelzijdigheid aan het systeem toevoegt.

Het Linux-opstartproces vanaf het moment dat u op de aan/uit-knop van uw computer drukt totdat u een volledig functioneel systeem krijgt, volgt deze volgorde op hoog niveau:

  1. 1. Een proces dat bekend staat als POST (Power-On Self Test) voert een algemene controle uit op de hardwarecomponenten van uw computer.
  2. 2. Wanneer POST voltooid is, wordt de besturing overgedragen aan de bootloader, die op zijn beurt de Linux-kernel in het geheugen laadt (samen met initramfs ) en voert het uit. De meest gebruikte bootloader in Linux is de GRand Unified Bootloader, of kortweg GRUB.
  3. 3. De kernel controleert en benadert de hardware, en voert vervolgens het initiële proces uit (meestal bekend onder de generieke naam “init”), dat op zijn beurt het opstarten van het systeem voltooit door te starten Diensten.

In Deel 7 van deze serie (“SysVinit, Upstart en Systemd”) introduceerden we de servicebeheersystemen en -hulpmiddelen die worden gebruikt door moderne Linux-distributies. Misschien wilt u dat artikel lezen voordat u verder gaat.

Introductie van GRUB Bootloader

Er zijn twee belangrijke GRUB versies (v1 soms GRUB Legacy en v2 genoemd) te vinden in moderne systemen, hoewel de meeste distributies gebruiken standaard v2 in hun nieuwste versies. Alleen Red Hat Enterprise Linux 6 en zijn afgeleiden gebruiken vandaag de dag nog steeds v1.

Daarom zullen we ons in deze handleiding vooral concentreren op de kenmerken van v2.

Ongeacht de GRUB versie, kan een bootloader de gebruiker het volgende doen:

  1. 1). wijzig de manier waarop het systeem zich gedraagt door verschillende te gebruiken kernels op te geven,
  2. 2). kies tussen alternatieve besturingssystemen om op te starten, en
  3. 3). configuratieregels toevoegen of bewerken om onder andere de opstartopties te wijzigen.

Tegenwoordig wordt GRUB onderhouden door het GNU project en is het goed gedocumenteerd op hun website. U wordt aangemoedigd om de officiële GNU-documentatie te gebruiken terwijl u deze handleiding doorneemt.

Wanneer het systeem opstart, krijg je het volgende GRUB scherm te zien in de hoofdconsole. In eerste instantie wordt je gevraagd om te kiezen tussen alternatieve kernels (standaard zal het systeem opstarten met de nieuwste kernel) en mag je een GRUB opdrachtregel invoeren (met c) of bewerk de opstartopties (door op de e-toets te drukken).

Een van de redenen waarom je zou overwegen om met een oudere kernel op te starten, is een hardwareapparaat dat voorheen goed werkte en na een upgrade is gaan “acteren” (zie deze link in de AskUbuntu forums voor een voorbeeld).

De GRUB v2 configuratie wordt gelezen bij het opstarten vanaf /boot/grub/grub.cfg of /boot/grub2/grub.cfg, terwijl /boot/grub/grub.conf of /boot/grub/menu.lst worden gebruikt in v1. Deze bestanden mogen NIET met de hand worden bewerkt, maar worden aangepast op basis van de inhoud van /etc/default/grub en de bestanden gevonden in /etc/grub.d.

In een CentOS 7 is dit het configuratiebestand dat wordt gemaakt wanneer het systeem voor de eerste keer wordt geïnstalleerd:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Naast de online documentatie kun je ook de GNU GRUB-handleiding met behulp van info als volgt vinden:

info grub

Als je specifiek geïnteresseerd bent in de opties die beschikbaar zijn voor /etc/default/grub, kun je de configuratiesectie rechtstreeks oproepen:

info -f grub -n 'Simple configuration'

Met behulp van de bovenstaande opdracht zul je ontdekken dat GRUB_TIMEOUT de tijd instelt tussen het moment waarop het beginscherm verschijnt en het automatisch opstarten van het systeem begint, tenzij onderbroken door de gebruiker. Wanneer deze variabele is ingesteld op -1, wordt het opstarten pas gestart als de gebruiker een selectie maakt.

Wanneer meerdere besturingssystemen of kernels op dezelfde machine zijn geïnstalleerd, vereist GRUB_DEFAULT een geheel getal dat aangeeft welk besturingssysteem of kernel-item in het beginscherm van GRUB moet worden geselecteerd om standaard op te starten. De lijst met vermeldingen kan niet alleen worden bekeken in het bovenstaande opstartscherm, maar ook met behulp van de volgende opdracht:

In CentOS en openSUSE:

awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg

In Ubuntu:

awk -F\' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg

Als we in het voorbeeld in de onderstaande afbeelding willen opstarten met de kernelversie 3.10.0-123.el7.x86_64 (4e invoer), moeten we GRUB_DEFAULT instellen tot 3 (items zijn intern genummerd beginnend met nul) als volgt:

GRUB_DEFAULT=3

Een laatste GRUB-configuratievariabele die van bijzonder belang is, is GRUB_CMDLINE_LINUX, die wordt gebruikt om opties aan de kernel door te geven. De opties die via GRUB aan de kernel kunnen worden doorgegeven, zijn goed gedocumenteerd in het Kernel Parameters-bestand en in man 7 bootparam.

De huidige opties in mijn CentOS 7-server zijn:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"

Waarom zou je de standaard kernelparameters willen wijzigen of extra opties willen doorgeven? Simpel gezegd: er kunnen momenten zijn waarop u de kernel bepaalde hardwareparameters moet vertellen die deze mogelijk niet zelf kan bepalen, of de waarden die deze wel zou detecteren, moet overschrijven.

Dit overkwam mij nog niet zo lang geleden toen ik Vector Linux, een afgeleide van Slackware, op mijn 10 jaar oude laptop probeerde. Na de installatie detecteerde het niet de juiste instellingen voor mijn videokaart, dus moest ik de kernelopties aanpassen die via GRUB waren doorgegeven om het te laten werken.

Een ander voorbeeld is wanneer u het systeem in de modus voor één gebruiker moet brengen om onderhoudstaken uit te voeren. Je kunt dit doen door het woord single toe te voegen aan GRUB_CMDLINE_LINUX en opnieuw op te starten:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"

Na het bewerken van /etc/defalt/grub moet je update-grub (Ubuntu) of grub2-mkconfig -o /boot/grub2/grub uitvoeren. cfg (CentOS en openSUSE) daarna om grub.cfg bij te werken (anders gaan de wijzigingen verloren bij het opstarten).

Deze opdracht verwerkt de eerder genoemde opstartconfiguratiebestanden om grub.cfg bij te werken. Deze methode zorgt ervoor dat wijzigingen permanent zijn, terwijl opties die tijdens het opstarten via GRUB worden doorgegeven alleen geldig blijven tijdens de huidige sessie.

Linux GRUB-problemen oplossen

Als je een tweede besturingssysteem installeert of als je GRUB-configuratiebestand beschadigd raakt door een menselijke fout, zijn er manieren waarop je je systeem weer op de been kunt krijgen en opnieuw kunt opstarten.

Druk in het beginscherm op c om een GRUB-opdrachtregel te krijgen (onthoud dat je ook op e kunt drukken om de standaard opstartopties te bewerken) en gebruik help om de beschikbare opdrachten in de GRUB-prompt:

We zullen ons concentreren op ls, dat de geïnstalleerde apparaten en bestandssystemen zal vermelden, en we zullen onderzoeken wat het vindt. In de onderstaande afbeelding kunnen we zien dat er 4 harde schijven zijn (hd0 tot en met hd3).

Alleen hd0 lijkt gepartitioneerd te zijn (zoals blijkt uit msdos1 en msdos2, waarbij 1 en 2 zijn de partitienummers en msdos is het partitieschema).

Laten we nu de eerste partitie op hd0 (msdos1) onderzoeken om te zien of we GRUB daar kunnen vinden. Deze aanpak zal ons in staat stellen Linux op te starten en daar andere tools van hoog niveau te gebruiken om het configuratiebestand te repareren of GRUB helemaal opnieuw te installeren als dat nodig is:

ls (hd0,msdos1)/

Zoals we in het gemarkeerde gebied kunnen zien, hebben we de map grub2 op deze partitie gevonden:

Zodra we er zeker van zijn dat GRUB zich in (hd0,msdos1) bevindt, vertellen we GRUB waar het zijn configuratiebestand kan vinden en geven we opdracht om te proberen zijn menu te starten:

set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal

Kies vervolgens in het GRUB-menu een item en druk op Enter om ermee op te starten. Zodra het systeem is opgestart, kun je het grub2-install /dev/sdX commando geven (verander sdX met het apparaat waarop je GRUB wilt installeren). De opstartinformatie wordt vervolgens bijgewerkt en alle gerelateerde bestanden worden hersteld.

grub2-install /dev/sdX

Andere, meer complexe scenario's worden, samen met de voorgestelde oplossingen, gedocumenteerd in de Ubuntu GRUB2 Probleemoplossingsgids. De daar uitgelegde concepten zijn ook geldig voor andere distributies.

Samenvatting

In dit artikel hebben we je kennis laten maken met GRUB, aangegeven waar je documentatie zowel online als offline kunt vinden, en uitgelegd hoe je een scenario kunt aanpakken waarin een systeem niet meer correct opstart vanwege een bootloader-gerelateerd probleem.

Gelukkig is GRUB een van de tools die het best gedocumenteerd is en je kunt gemakkelijk hulp vinden in de geïnstalleerde documenten of online met behulp van de bronnen die we in dit artikel hebben gedeeld.

Heeft u vragen of opmerkingen? Aarzel niet om ons dit te laten weten via het onderstaande reactieformulier. Wij horen graag van u!