Kategória: Linux všeobecne

Zmenené: 30. september 2010

Oprava Grub

Dnes mi nenaštartoval počítač. Pre používateľov Windows asi nič nezvyčajné, mňa to však nemilo prekvapilo. Všetko, čo mi po štarte zobrazil, bol shell Grubu… Tak som vylovil CD a pustil sa do opravy.

Aj preto, že som túto opravil robil naozaj po veľmi dlhej dobe a po prvý krát s novým GRUB-om, som sa rozhodol napísať, ako sa z tejto šlamastiky dostať.

Moja prvá myšlienka smerovala k poškodenému súborovému systému, pretože som si nebol vedomý akejkoľvek aktualizácie (či iného zásahu do bootloadera), ale v skutočnosti mi najviac problémov urobilo nabootovať z CD pretože som už celkom zabudol, že nemám pre boot vybrať voľbu CD-ROM, ale DVD-RAM. Stálo ma to niekoľko neúspešných pokusov o nabootovanie z CD, vrátane výmeny CD za iné…

Nakoniec som ale nad BIOSom svojho počítača zvíťazil a moje SystemRescueCD nejakej staršej verzie, ktoré mám pre takéto prípady vždy poruke, úspešne naštartovalo.

Zistenie partícií

Po naštartovaní záchranného Linuxu som si ako prvé potreboval občerstviť v pamäti, aké partície to vlastne používam (pretože na rôzne veci používam rôzne parametre pripojenia (a iež rôzne súborové systémy), mám disk rozdelený celkom na 10 partícií). Ak neviete ako najjednoduchšie zistiť, ako máte rozdelený disk, použite príkaz fdfisk:

fdisk -l

Takto zadaný príkaz, s voľbou -l, vypíše rozdelenie na partície všetkých pripojených diskov. Avšak nepovie už, čo je na ktorej partícii. Ak to potrebujete zistiť, pomôže súbor /etc/fstab, ktorý je uložený na niektorej partícii. Ja som však našťastie vedel, že na prvej, ale i tak mi výpis partícii pomohol aspoň s jednou vecou. Zistil, ktorá partícia je určená na swap…

Rada

Keby som si nespomenul, že mám systém na prvej, asi by som musel postupne pripájať jednu za druhou, aby som z výpisu obsahu pripojenej partície zistil, či je alebo nie je systémová.

Kontrola partície

Ako som už spomenul, moje prvé myšlienky smerovali k poškodenému súborovému systému. Na kontrolu súborového systému slúži príkaz fsck, ktorý ako parameter potrebuje meno partície. Keďže viem, že konfigurácia bootloadera Grub je v adresári /boot, ktorý mám na systémovej partícii (už dávno nemusí byť na samostatnej partícii), spustil som jej kontrolu:

fsck /dev/sda1

Príkaz fsck má svoje obdoby, alebo lepšie povedané konkretizácie, pre príslušné súborové systémy, ktoré možno spúšťať vo formáte fsck.meno_FS. Ak však spustíte len obyčajný fsck, pokúsi sa identifikovať typ súborového systému a ak je úspešný, spustí príslušnú verziu programu pre konkrétny typ súborového systému. Nebudem tu popisovať priebeh kontroly, pretože sa líši podľa typu súborového systému. Každopádne, kontrola nenašla žiadne chyby, takže moja teória bola ta-tam.

Obnova Grub

Začal som pochybovať o svojom presvedčení, že som neaktualizoval Grub, a tak som sa rozhodol obnoviť jeho inštaláciu. Teda najprv len jeho konfiguráciu, ale to nepomohlo, tak som ho nakoniec znova nainštaloval. Nebudem napínať, preinštalovanie pomohlo, ale musel som sa pokúšať viac krát, pretože samotná obnova inštalácie vyžadovala niektoré prípravné kroky.

Pripojenie koreňa disku

Ako prvé je potrebné pripojiť koreň disku (súborového systému). V mojom prípade sa jedná o partíciu označenú ako sda1, celým menom /dev/sda1. V mnohých návodoch, s ktorými som sa stretol, autori odporúčajú pripojenie priamo do /mnt. V prípade SystemRescueCD to však nerobte! Vytvorte si niekde samostatný adresár, napríklad práve v /mnt, ktorý je na to podľa FSH určený:

mkdir /mnt/deb

A do neho pripojím svoj koreň:

mount /dev/sda1 /mnt/deb

Keďže bola partícia pripojená bez akýchkoľvek námietok, vrátane rozpoznanie súborového systému, len to potvrdilo, že súborový systém by poškodený byť nemal…

Pripojenie virtuálnych FS

Keď som naposledy obnovoval Grub, stačilo pripojiť systémovú partíciu, vstúpiť do chroot a zadať pár príkazov. Dnes na mňa začal chŕliť rôzne chybové hlášky, preto aby ste sa im vyhli, je pre Debian potrebné pripojiť nielen systémovú partíciu, ale aj virtuálne súborové systémy. Pripájal som ich po jednom, najmä preto, aby som zistil, či sú potrebné všetky, ale sú. Takže najprv pripojíme /proc a /sys. Pozor však, nie v koreni záchrannej distribúcie, ale v pripojenej pratícii koreňa:

mount -t proc none /mnt/deb/proc
mount -t sysfs none /mnt/deb/sys

Okrem týchto virtuálnych súborových systémov je potrebný aj adresár /dev. V súčasnosti tento adresár neobsahuje kopu súborov zariadení, ktoré sa vytvorili kedysi ktoviekým. Teda, zopár ich obsahuje, ale väčšina je generovaná dynamicky pri štarte systému a o toto generovanie sa stará jadro za veľkej pomoci udev. Keďže sa mi nechcelo maturovať nad tým, ako vyvolať ich vytvorenie v chroote, rozhodol som sa použiť tie, ktoré si pri štarte vygeneroval SystemrescueCD a pripojil som jeho jeho adresár /dev aj do toho svojho:

mount -o bind /dev /mnt/deb/dev

Vstúpenie do chroot

Ak neviete čo je to chroot, tak v tom nehľadajte vedu. Toto tajomné slovo je skratkou anglického change root, čo po našom znamená zmeň koreň. Nie, nie je to tajomný príkaz pre prostitútky, že majú prejsť k ďalšiemu zákazníkovi. Jednoducho vraví systému aby zmenil koreň svojho súborového systému ako iste viete koreň je začiatok. Zmením teda koreň súborového systému tak, aby sa ním stala moja partícia z disku:

chroot /mnt/deb /bin/bash

Okrem adresára s koreň môjho disku som zadal aj shell, ktorý má byť použitý. zadanie shellu nie je povinné, ale ja vo svojom systéme nemám nainštalovaný shell (zsh), ktorý používa SystemRescueCD, tak mal chroot malé problémy, ktoré vyriešim explicitným zadaním shellu (bash).

Pripojenie zvyšných partícií

V závislosti na systéme bude možno potrebné pripojiť aj ostatné partície disku. Možno to robiť po jednom, alebo všetky naraz, ja som zvolil druhú možnosť:

mount -a

Ako však píšem, nemusí to byť potrebné, ja som však potreboval pripojiť adresáre /usr a /var.

Konečne Grub

Po úspešnom vstúpení do chroot (čo som spoznal napríklad podľa farby a obsahu výzvy) možno spustiť opätovnú inštaláciu Grub. Nie vždy je to potrebné, v mojom prípade však opätovné vygenerovanie konfigurácie nestačilo, preto som spustil inštaláciu:

grub-install /dev/sda

Program grub-install (ako ste iste pochopili z názvu) nainštaluje bootloader Grub na zadané miesto disku. Keďže som zadal meno zariadenia disku bez čísla partície, nainštaluje ho grub-install do MBR (hlavného zavádzacieho záznamu) disku. Po úspešnom nainštalovaní bootloadera som pre istotu nechal znova vygenerovať aj konfiguráciu:

update-grub

Záver

Po tomto mojom zásahu počítač bez rečí naštartoval. Pozrel som do záznamu aktualizácie a zistil som, že som naozaj neaktualizoval nič s Grub-om. Naozaj neviem, čo tento problém spôsobilo, ale iste to bola nejaká aktualizácia. Netuším však ktorá…