Възстановяване на grub

В Ubuntu програмата grub (GRand Unified Bootloader) се използва като програма за първоначално зареждане на системата (точно това означава терминът Boot Loader, по-рядко се използва Bootstrap Loader). Когато се включи компютърът, grub показва черния ("досовски") екран с възможност да изберете операционна система или различни варианти на ядрото.

Ясно е, че програмата за първоначално зареждане на системата е тънко място – ако нещо с нея се обърка, никаква операционна система не можем да се зареди. А това може да се случи и по съвсем "безобиден" начин. При едно от обновяванията на Ubuntu аз не обърнах внимание, че се обновява и grub, не го преинсталирах и след като рестартирах компютъра, оказа се, че grub "увисва".

Тази ситуация е неприятна, но не е страшна и има решение. То се състои в следното:

  1. трябва да се зареди линукс от другаде, например от оптичен диск, и да се получи достъп до твърдия диск, където е инсталиран Ubuntu;
  2. трябва да се използва grub (от оригиналната инсталация на твърдия диск), за да се оправят нещата.

1) Стартиране на линукс от оптичен диск и достъп до инсталацията на твърдия диск

Най-добре е да имате оригиналния жив диск на тази версия на Ubuntu, която сте инсталирали. Изчаквате да се зареди системата от диска, отваряте конзолата и пишете

sudo -s

С тази команда придобивате права на свръхпотребител (root). Когато сте стартирали линукс от живия диск, sudo не работи по обичайния начин. След това

mkdir /mnt/disk

и монтирате оригиналния диск в точка /mnt/disk

mount -t ext3 /dev/sdb1 /mnt/disk

Параметърът -t ext3 определя типа на файловата система и обикновено може да се пропусне – тогава mount автоматично определя типа файлова система. В примера се предполага, че отваряте първия дял от втория (физическия втори) твърд диск. Ако не сте съвсем наясно какви точно дялове имате по дисковете и как се именуват, прочетете тази информация така:

cat /proc/partitions

Сега вече може да преминете към точка 2.

Ако искате обаче да инсталирате grub на дискета – това никак не е лоша идея, – трябва да направите преди това още нещо. Поставете дискетата във флопито, форматирайте я (това унищожава всички данни на нея!) и я монтирайте, например в точка /mnt/fd. Форматирането става така:

mke2fs /dev/fd0

Тази команда не форматира физически дискетата, тя само създава върху нея файлова система от типа ext2. Файловата система ext3 не става за дискети (голяма е), но може да поставите досовата (старата уиндоуска) файлова система vfat със следната команда:

mksf -t vfat /dev/fd0

В случая няма значение коя файлова система ще поставите, но ако приготвяте дискета за данни, използвайте vfat, за да може да я чете и Windows.

Направете точка за монтиране на дискетата и я монтирайте:

mkdir /mnt/fd
mount /dev/fd0 /mnt/fd

След това копирайте върху нея следните файлове:

cd /mnt/disk/boot/grub
cp stage1 stage2 menu.lst device.map /mnt/fd

Да копирате тези файлове не е задължително действие, за да направите стартираща дискета, но е разумна предпазна мярка. Демонтирайте дискетата:

umount /mnt/fd

Може да стартирате линукс и от всякакъв друг жив диск. Аз от доста време периодично обновявам жив диск от инициативата SystemRescueCd – в по-малко от 200 МБ той съдържа всичко, което е необходимо при спасителни операции от този тип. Когато стартирате системата от SystemRescueCd, вие влизате в нея с права на администратор. Затова аз по-нататък няма да поставям пред командите sudo. Ако обаче използвате друг жив диск с линукс, може да се наложи да въвеждате командите със sudo или да вземете права на свръхпотребител – как става това, на живия диск е описано. Например, живите дискове, основани върху Slax, обикновено изискват за потребителя root паролата "toor".

Както с оригиналния диск на Ubuntu създавате си точка за монтиране на твърдия диск и го монтирате:

mkdir /mnt/disk
mount /dev/sdb1 /mnt/disk

Забележка: В много учебни примери като точка за монтиране на твърдия диск се посочва просто /mnt. Мисля, че е по-разумно винаги да се създава поддиректория в /mnt, където да монтирате диска. А специално за сглобката SystemRescueCd се посочва, че системата блокира, ако твърдият диск се монтира в точка /mnt.

Новото следва тук:

mount -t proc none /mnt/disk/proc
mount -o bind /dev /mnt/disk/dev

Тези две команди фактически копират директориите /proc и /dev от активната система (в случая – SystemRescueCd). След малко ще стартираме копие от командния интерпретатор, а той също е от активната операционна система и данните в тези две директории трябва да бъдат адекватни за него. От друга страна, понеже и файловата система /proc, и файловата система /dev са "мними", тоест създават се от ядрото при стартиране на системата, това няма да нанесе физически промени върху вашия твърд диск. И сега да стартираме копие от командния интерпретатор (bash), като му определим за основна файлова система /mnt/disk:

chroot /mnt/disk /bin/bash

Сега вече сме почти като свръхпотребител на собствената си система на твърдия диск и можем да стартираме grub и да поправим нещата.

2) Работа с grub

Стартирана без параметри, програмата grub предоставя нещо като мъничък команден интерпретатор. Тя извежда разпознавателен знак (propmpt) grub> и тук могат да се пишат някои команди. Точно това ще направим сега:

grub> find /boot/grub/stage1

Тази команда изисква от grub да анализира на кой диск е файлът stage1. В моя пример резултатът ще бъде такъв:

(sdb0)

Обърнете внимание, че докато ядрото номерира дисковите дялове от 1, в grub, кой знае защо, те се номерират от 0. Сега трябва да определим този диск като основен (коренен):

grub> root (sdb0)

И най-сетне сме готови да поправим нещата. Ако вие сте инсталирали стартиращата част на grub в MBR – Master Boot Record, тоест нулевия сектор на първия дял от първия диск, – а инсталиращата програма на Ubuntu по подразбиране прави точно така, въвеждате следната команда:

grub> setup (sda0)

Ако пък искате да инсталирате grub на дискета (нали вече си приготвихте дискетата?), използвайте

grub> setup (fd0)

И толкова. Излезте от grub:

grub> quit

и рестартирайте системата. Нещата трябва да са вече наред.

Кратко отклонение

Сигурно вече сте разгледали файловете в директорията /boot/grub и сте забелязали, че файлът stage1 е с дължина точно 512 байта. Това е и размерът на сектор от диска. В този файл се съдържа онази свръхкратка програмка, която се записва в MBR или в нулевия сектор на дискетата. Тя има за задача само да пренасочи процеса на зареждане към правилния диск и дисков дял, където се намира /boot/grub и файлът stage2 – той всъщност върши работата.

Една неприятна, но поправима изненада

Стартирали сте системата и сте много доволни. И с право. Като предвидлив човек решавате да си направите резервно копие на стартираща дискета. След като поставите форматирана дискета във флопито, това става така:

sudo grub-install /dev/fd0

или

sudo grup-install fd0

И в двата случая получавате някакви неясни съобщения, че BIOS не разпознавал такова устройстви или че такъв диск нямало. Това е страничен ефект от "спасителната операция". Оправянето му е лесно – използвайте --recheck, за да си "припомни" grub какво е описано в device.map. Например:

sudo grub-install --recheck fd0

И накрая

След като сте поправили нещата и сте си направили стартираща дискета, копирайте върху нея четирите файла от /boot/grub, за които стана дума преди малко. Може да спасите на дискетата и копие от MBR (нулевия, стартиращия сектор от първия диск). Това е особено разумно да се направи, ако използвате на компютъра си и Windows или DOS – компютърните вируси много обичат да се настаняват в MBR и макар в новите версии на Windows това да им е по-трудно, винаги съществува риск. Копието се прави така:

sudo mount /dev/fd0 /mnt/fd
sudo dd if=/dev/sda of=/mnt/fd/backup.mbr bs=512 count=1

Това създава на дискетата файла backup.mbr, съдржащ MBR, а възстановяването на нулевия сектор (MBR) от дискетата може да стане така:

sudo mount /dev/fd0 /mnt/fd
sudo dd if=/mnt/fd/backup.mbr of=/dev/sda bs=512 count=1

Нали е ясно? При тези действия трябва да бъдете много внимателни. Програмата dd (Data Duplicator или Data Dump) е много "професионална" – с нея наистина могат да се правят чудеса, но със същата лекота може да унищожите цели дискове, та някои майтапчии разчитата dd като Data Destroyer. Много подробни разяснения за тази команда може да прочетете, например, на LinuxQuestions.org.

BulgarianDocumentation/System/Възстановяване на grub (last edited 2012-07-10 16:49:01 by ip216-239-86-29)