Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Настройка и восстановление загрузчика Grub

Оригинал: Grub: Fixing The Bootloader
Автор: Pete Kelly (critter)
Дата публикации: январь 2011 г.
Перевод: Семененко В.
Дата перевода: январь 2013 г.

Уже поздно, а завтра вам предстоит напряженный день. Поэтому вы сохранили выполненную работу и уже выключили свой компьютер. А завтра, когда вы снова включите его, ваше сердце упадет, когда увидите сообщение: "Kernel panic ..." или "Grub error xx", при этом ваша машина откажется загружаться.

Что же делать в этой ситуации? Хорошая новость заключается в том, что результатом получения одного из этих сообщений является программная ошибка. Вы можете исправить ее, отредактировав конфигурационный файл или же переустановив программу-загрузчик. Оба этих действия нетрудно выполнить, но только в том случае, если вы хорошо представляете себе, что вы должны получить в конечном результате. Поэтому для начала нам потребуется немного вводной информации. Я постараюсь объяснить все как можно проще.

Процесс загрузки

Загрузчик GRUB

Когда вы включаете компьютер, процессору необходимо знать, какую последовательность действий ему следует выполнять. На материнской плате хранится список устройств, с которых компьютер может загрузиться. Этот список задает порядок загрузки (жесткие диски, флеш-карты, usb-устройства), то есть, в какой очередности следует выполнять запрос на загрузку с них. Процессор пробует загрузиться с устройства, указанного первым в этом списке. Он переходит в самое начало устройства в поисках дополнительной информации. Любое из этих устройств разбито на маленькие области, называемые секторами, и процессор ищет на устройстве хранения его первый сектор, который называется Главная Загрузочная Запись (Master Boot Record или сокращенно - MBR). Помимо секторов, устройство может быть разбито на большие части, называемые разделами, при этом разделы состоят из определенного количества секторов. Первый сектор любого раздела также является загрузочным и называет аналогично - загрузочный сектор (boot sector). Сектор является минимальной единицей деления жесткого диска на части, поэтому в одном секторе (в том числе - и загрузочном) информации может храниться совсем немного. Ровно столько, чтобы указать процессору, где он может найти программный код, с помощью которого можно выполнить процесс загрузки. Таким образом, процессор может выполнять загрузку все системы в целом.

Программа загрузки, используемая операционной системой PCLinuxOS, называется Grub (GRand Unified Bootloader). Код этой программы разбит на две части. Одна часть хранится в главной загрузочной записи (MBR) и называется stage1. Вторая часть загружается в оперативную память компьютера (ОЗУ) после выполнения первой части и называется stage2.

Stage2 запускает ядро (kernel) операционной системы и создает в оперативной памяти компьютера временную файловую систему, в которую загружает различные программные коды, такие как модули и драйверы устройств. Эти коды необходимы ядру для успешного выполнения загрузки системы. Для создания временной файловой системы в ОЗУ используется заранее созданный образ файловой системы, называемый initial ram disk или сокращенно initrd.img.

К сожалению, здесь у нас есть проблема. Заключается она в следующем. С одной стороны, мы имеем файл stage2, который знает, где располагается ядро (kernel) и образ (initrd.img) файловой системы, но файл stage1 ничего не знает о существовании каких-либо файловых систем. Рассмотрим пример файла stage1_5. Существует несколько видов данного файла, имя каждого из которых отображает тип файловой системы, для которой он предназначен, например, e2fs_stage1_5 или reiserfs_stage1_5. Код stage1_5 в этих файлах является связующим мостом, но он должен быть найден файлом stage1. К счастью, благодаря способу расположения разделов на жестком диске, после первого зарезервированного сектора каждого раздела всегда имеется несколько свободных секторов, в которых и размещается дополнительный код. Файл stage1 "знает" о том, что всегда необходимо "заглянуть" во второй сектор корневого раздела и после выполнения кода, помещенного там, загрузчик Grub может найти необходимые данные в файловой системе.

После успешного выполнения задачи все настройки будут установлены таким образом, что ядро операционной системы может управлять физическими файловыми системами, контроль над которыми и возложен на него.

Примерно так обстоят дела с загрузкой в системе PCLinuxOS. Однако то, о чем было вкратце описано выше, является неполной картиной всех процессов, происходящих в системе Grub. Более того, этот способ далеко не единственный, применяемый для загрузки операционных систем.

Восстановление

Приведем общую картину загрузки компьютера, применимую к дистрибутивам PCLinuxOS, но несколько отличную для других операционных систем. К примеру, Ubuntu и все дистрибутивы Linux, основанные на Ubuntu, на сегодняшний день используют загрузчик Grub2, алгоритм работы которого отличается от представленного здесь.

Как мы узнали ранее, загрузчику Grub необходимо знать три вещи, с помощью которых он сможет загрузить операционную систему:

  • где размещено ядро операционной системы;
  • где находится образ файловой системы;
  • на каком жестком диске или разделе располагаются файлы stage1_5 и stage2.

Вся эта информация, предоставляемая загрузчику Grub, находится в его конфигурационном файле, который в операционной системе PCLinuxOS располагается по пути /boot/grub/menu.lst. В других операционных системах этот файл называется grub.conf. Если настройки, прописанные в этом файле, содержат ошибку, то загрузчик Grub не сможет найти ядро или образ файловой системы, а неверно указанный корневой раздел приведет к ошибке "Kernel panic".

Во время загрузки системы информация может быть введена в командной строке, поэтому требуется навык для работы с ней.

Для восстановления операционной системы можно загрузиться с LiveCD-диска, который использовался для установки PCLinuxOS на жесткий диск. С оптического диска система PCLinuxOS загрузится в оперативную память ОЗУ, после чего можно будет исправить любой поврежденный файл на жестком диске компьютера.

Поиск поврежденного файла

Поиск поврежденного файла

Первое, что необходимо знать, это - на каком жестком диске и на каком разделе данного жесткого диска установлена операционная система PCLinuxOS. И загрузчик Grub поможет нам в этом вопросе. После загрузки LiveCD-диска на компьютер, открываем терминал и получаем права администратора (root) командой:

su

У вас будет запрошен пароль суперпользователя. Это пароль администратора (root) системы, но не пароль вашей пользовательской учетной записи. После того, как вы зайдете под учетной записью root, помните о том, что необходимо быть предельно осторожным при вводе любой команды в терминале, так как пользователь root обладает абсолютными правами. Он может все, поэтому любая ошибочная команда приведет к краху системы.

Затем вводим команду:

grub

В результате произойдет переход в командную оболочку загрузчика Grub, где можно выполнить переустановку резидентной части Grub. Оболочка Grub имеет ограниченный набор поддерживаемых команд, список которых можно просмотреть, нажав клавишу "Tab".

Теперь приступим к поиску резидентной части Grub, файла stage2. В строке приглашения введем команду:

find /boot/grub/stage2

Отобразится список разделов, на которых расположен файл stage2. В большинстве случаев этот список будет состоять только из одного раздела, но если на вашем компьютере настроена мультизагрузка нескольких операционных систем Linux, то все эти разделы будут отображены в терминале. Все найденные разделы представлены в виде записи (hd0,0) или похожей на нее, так как Grub не понимает отображение разделов в виде hda1 или sda1. Он видит разделы только как устройства. Порядковый номер устройств в Grub начинается с нуля, а не с единицы. В записи (hd0,0) первое значение hd0 - это порядковый номер устройства (жесткого диска), а второе значение (после запятой) 0 - это порядковый номер раздела на этом жестком диске. Поэтому запись вида (hd0,0) расшифровывается как - "первый жесткий диск, первый раздел этого жесткого диска". Введем команду quit, чтобы выйти из оболочки Grub.

Теперь, когда мы знаем, на каком жестком диске и на каком разделе этого диска установлена операционная система, можно подмонтировать его, чтобы зайти внутрь. Я подразумеваю, что (hd0,0) - это первый раздел первого жесткого диска. В терминале, оставаясь под учетной записью root, ввожу команду:

mkdir /a
mount /dev/sda1 /a

В вашем случае, если жесткий диск имеет интерфейс IDE, необходимо изменить наименование этого диска с sda на hda. Если вы вдруг не знаете, какой интерфейс имеет ваш жесткий диск, введите в терминале команду fdisk -l, чтобы увидеть список все найденных в системе устройств.

Вернемся к двум предыдущим командам. Первой из них было создано устройство с именем а, второй командой раздел /dev/sda1 был смонтирован на устройство а. Таким образом, теперь ядро (kernel) и образ файловой системы (initrd) PCLinuxOS располагаются по пути /a/boot. Как правило, имена ядер и образов файловой системы достаточно длинные и сложные, чтобы их набирать в командной строке. Поэтому проще ввести ссылки (ярлыки), чтобы получить список этих файлов. Имена ядер (kernel) начинаются со слова vmlinuz, а имена образов файловой системы (initrd) начинаются со слова initrd. Отобразим в терминале список этих двух файлов, введя две команды:

ls /a/boot/vmlinuz*
ls /a/boot/initrd*

В этом списке имена, оканчивающиеся на символ @ являются ссылками, которые можно использовать в конфигурационном файле загрузчика Grub.

Присвоение ярлыков разделам

В моем случае вывод показал две ссылки с именами vmlinuz и initrd. Теперь я также знаю, что корневым разделом у меня является (hd0,0). В своей практике я нашел очень удобным применение ярлыков для разделов. Например, введя команду tune2fs -L kde4, тем самым я задаю для своего корневого раздела ярлык kde4. На моем компьютере все разделы имеют ярлыки, созданные таким образом. Однако, если командная строка является для вас неудобной, вы можете воспользоваться графическим интерфейсом Control Center в операционной системе PCLinuxOS. Для этого перейдите в главном меню "Local disks - Manage disk partitions - Expert Mode", где можно задать ярлыки для ваших собственных разделов.

Конфигурационный файл

У меня все готово для восстановления конфигурационного файла menu.lst. Я буду пользоваться текстовым редактором командной строки nano, который очень прост в использовании. С его помощью удобно редактировать файлы, но если вы предпочитаете любой другой текстовый редактор, вам нужно помнить одно - он должен уметь сохранять файл в виде чистого текста, без форматирования. Открываю файл menu.lst на установленной операционной системе PCLinuxOS:

nano /a/boot/grub/menu.lst

В оригинале данный файл выглядит следующим образом:

Содержимое этого файла не является таким сложным, как выглядит на первый взгляд. Первые четыре строки служат для настройки меню Grub, три нижеследующих блока являются пунктами меню, называемые иначе stanza (строфа). Каждая из этих строф содержит только три строки (настройки типографики могут сделать перенос строки на данной web-странице, но все равно - их три). Стоит также отметить, что форматирование текста в файле menu.lst несет в себе важный функционал. Другими словами, файл menu.lst чувствителен к форматированию - если все будет задано в нем верно, но не выдержан формат самого текста внутри файла (отступы, пробелы и т. п.), то это будет считаться ошибкой в данном файле и Grub может не запуститься.

Три строки начинаются со слов title, kernel и initrd. Каждая из этих строк является достаточно длинной, а строка kernel - самая длинная из всех трех. В строфе (stanza) могут присутствовать дополнительные строки, помимо вышеназванных, но все они также должны представлять из себя одну строку, каждая в отдельности.

Редактирование конфигурационного файла

Добавление нового пункта в меню Grub

Я собираюсь добавить в файл menu.lst новую stanza (пункт меню) в самое начало, то есть между строками, первой из которых является default 0, а вторая начинается как title linux:

При добавлении нового пункта меню (stanza) необходимо оставлять перед строфой и после нее одну пустую строку, так как иначе загрузчик Grub не будет знать, где заканчивается одна запись и начинается другая.

После того, как все данные будут введены, нажимаем сочетание клавиш Ctrl+X, при этом редактор nano спросит, сохранить ли изменения в файле. Подтверждаем сохранение и выходим.

Этого будет достаточно для успешной загрузки системы, хотя вы можете захотеть несколько приукрасить загрузчик. Однако, и этих трех строк в файле menu.lst хватит для правильной настройки конфигурации.

Я не сделал попытки восстановить файл. Наоборот, я напишу свои собственные инструкции, когда я буду знать, что конфигурационный файл Grub корректно работает и я могу им управлять. Поэтому я оставил оригинальный набор инструкций для загрузчика Grub. Позже, когда я буду точно знать, что система загружается нормально, я вернусь и отредактирую файл. Но сейчас я оставляю его таким, каким он был в самом начале.

Что все это значит

Четыре первые строки в файле menu.lst выполняют следующие функции.

Команда Timeout = 10 устанавливает временной промежуток, в течении которого загрузчик Grub будет ожидать действий пользователя, которые укажут ему, какой пункт меню загружать. Если он не дождется такого указания в течении установленного времени, то будет произведена загрузка пункта меню, установленного по умолчанию. А если такой не определен в конфигурационном файле, то первого по списку пункта меню. Чтобы остановить счетчик времени, достаточно нажать любую клавишу на клавиатуре.

Команда Color white/blue yellow/blue устанавливает цветовую раскраску текстового меню (в которое можно войти, нажав клавишу "Esc", если в данный момент вы находитесь в графическом меню Grub. Просто иногда бывают случаи, когда вам потребуется войти в текстовое меню загрузчика). Первая пара значений задает цвета переднего (foreground) и заднего (background) фона всего меню, а вторая пара служит для установки цветов выделенного пункта меню.

Команда gfxmenu (hd0,0)/boot/gfxmenu указывает загрузчику Grub, где располагается графическое меню.

Команда default 0 устанавливает пункт меню для загрузки по умолчанию, при этом отсчет ведется с нуля.

Для того, чтобы улучшить слишком упрощенный фрагмент строфы в конфигурационном файле, мы добавим несколько параметров в строку kernel.

Добавление параметра aplash=silent vga=788 в конец этой строки позволит установленной графической теме Plymouth скрыть строки текста, появляющиеся на экране монитора при загрузке системы. Число 788 является разрешением монитора, которое наиболее оптимально для большинства компьютеров.

Если вы намереваетесь использовать режим гибернации ("спящий режим") при выключении своей машины, вам необходимо указать загрузчику Grub, где находятся данные, нужные для восстановления сессии. Такие данные хранятся на разделе подкачки (swap), поэтому этот раздел должен быть немного больше оперативной памяти (ОЗУ) компьютера по размеру. В этом случае режим гибернации будет выполняться без ошибок. Если, к примеру, раздел подкачки на вашем жестком диске располагается по адресу /dev/sdb1, то в конце строки kernel необходимо добавить параметр resume=/dev/sdb1. Мы можем указать раздел таким образом, так как Grub распознает файловые системы и записи устройств к тому моменту, когда они появятся в этом конфигурационном файле.

Установка PCLinuxOS по умолчанию предлагает три пункта меню загрузчика.

  • Первый пункт предоставляет полностью графическое меню загрузки, вплоть до окна входа в систему.
  • Второй пункт называется linux-nonfb или каким-либо иным похожим образом. Он выполняет загрузку системы без графической заставки, что позволяет видеть все системные сообщения во время ее загрузки. Такой способ может быть полезен при неполадках в системе. Процесс загрузки можно приостановить в любой момент нажатием клавиши ScrollLock на клавиатуре.
  • Последний третий пункт называется failsafe. Фактически он также служит для контроля неполадок в системе. В этом режиме система загружается в однопользовательскую командную оболочку, внутри которой можно выполнять некоторые административные задачи, такие как проверка файловой системы или смена пароля root. Когда все необходимые задачи будут выполнены, вводим в командной строке init 5, что вернет нас обратно к окну входа в систему.

Все три вышеназванных режима можно включить, добавив одну из перечисленных ниже команд в строку kernel между параметром kernel и параметром корневой раздел root:

BOOT_IMAGE = linux
BOOT_IMAGE = linux-nonfb
BOOT_IMAGE = failsafe

Когда вы добавляете в конфигурационный файл Grub новый пункт меню, проверьте его работоспособность. Если система успешно загружается через этот пункт, вы можете удалить старый, но перед этим сделайте резервную копию файла так, чтобы в любой момент он был вам доступен. Если перед строкой вы поставите знак решетки #, то пункт меню, в котором находится эта строка, не будет отображаться при загрузке. Grub воспринимает любую строку, начинающуюся с символа # как комментарий и не выполняет ее.

Переустановка загрузчика

Если загрузчик Grub является поврежденным, то задача его восстановления не такая уж и сложная. Снова откройте терминал, с помощью команды su получите права root и запустите командную оболочку Grub:

grub

С помощью встроенной команды поиска find найдите разделы, на которых располагаются файлы Grub:

grub> find /boot/grub/stage2
(hd0,0)

Если в выводе Grub присутствует больше одного устройства, то выберите то, на котором находится исправленный вами файл menu.lst. "Скажите" Grub о том, что вы выбираете этот раздел командой:

grub> root (hd0,0)

Проверьте, правильный ли вы выбрали раздел:

Filesystem type is ext2fs, partition type 0x83

Теперь введите команду setup, чтобы установить файл stage1. Место, куда должен установиться этот файл, является устройством, с которого BIOS материнской платы будет пытаться загрузить систему. Обратите внимание, что нет необходимости указывать в команде номер раздела, нужно указать только само устройство:

Все, задачу мы выполнили. Вводим команду quit для выхода из оболочки Grub.

Загрузка нескольких операционных систем

Если необходимо настроить загрузку одной из нескольких операционных систем, установленных на компьютере, то наиболее простой способ представлен ниже.

В окончании процесса установки операционной системы, как правило, у вас будет спрошено, куда бы вы хотели установить загрузчик Grub. По умолчанию это первый загрузочный сектор MBR жесткого диска, на который производиться установка. Вместо этого выберите установку загрузчика на раздел диска. Затем инсталлятор спросит вас, с какого жесткого диска производить загрузку операционной системы. В данном случае этот жесткий диск будет являться обычным корневым разделом, настройку которого мы будет производить дальше вручную в конфигурационном файле, открыв его в терминале.

Теперь у нас будет два файла с именем menu.lst, один из которых располагается в директории /boot/grub раздела, на который установлена операционная система, и второй - оригинальный файл. В своем примере я использую раздел /dev/sda5, который загрузчик Grub воспринимает как раздел (hd0,4). На этот раздел у меня установлена операционная система ZenMini. В оригинальный файл menu.lst я добавляю следующие строки:

Теперь, при перезагрузке компьютера, если я выберу этот пункт в меню Grub, то будет осуществлено перенаправление в новое меню, в котором будут пункты, относящиеся к вновь установленной операционной системе ZenMini. В результате у меня имеется файл menu.lst на разделе с установленной операционной системой, который полностью идентичен оригинальному файлу menu.lst, с одним единственным различием - раздел (hd0,0) заменен на раздел (hd0,4), что позволяет управлять операционными системами более легко. Строфа в файле menu.lst системы ZenMini выглядит следующим образом:

А здесь представлена часть оригинального файла menu.lst:

Такое построение загрузки нескольких операционных систем мне кажется наиболее простым и легким для дальнейшей ее поддержки.

Добавление загрузки Windows

Для включения загрузки такой операционной системы, как Windows, которая не использует Grub, но имеет свой собственный загрузчик, я поступаю следующим образом. В конфигурационный файл menu.lst добавляется следующая строфа:

Обратите внимание: необходимо изменить раздел (hd0,2) на тот, на котором установлена операционная система Windows.

Команда rootnoverify аналогична команде root. Она информирует Grub о месторасположении следующей части загрузочного кода, но при этом не предпринимает попытки монтировать указанный раздел, так как для Grub это невозможно сделать.

Команда makeactive делает указанный корневой раздел активным (загрузочным).

Команда chainloader +1 "говорит" загрузчику Grub перейти на второй сектор указанного раздела в поисках загрузочного кода, так как первый раздел всегда зарезервирован файловой системой.

Использование встроенных команд Grub во время загрузки

Если процесс загрузки компьютера окончился неудачей по какой-либо причине, то все еще существует возможность войти в систему, используя для этого собственную командную оболочку загрузчика Grub. Если у вас Grub настроен на использование графического меню, то нажмите клавишу "Esc" на клавиатуре, чтобы перейти в текстовый режим после подтверждения своего намерения в соответствующем окне.

Причиной ошибки при загрузке компьютера может быть опечатка, допущенная вами в конфигурационном файле Grub при его правке, или ошибка самого текстового редактора, который разбил одну длинную строку на две короткие и Grub не может понять, как ее читать. Прямо из командной оболочки Grub можно отредактировать эту строку. Для этого выберите в меню загрузчика тот пункт с операционной системой, которая "не хочет" загружаться, с помощью клавиш-стрелок на клавиатуре и затем последовательно нажмите клавиши "E" и "Enter". Если после этого снова нажать клавишу "E", то выбранная строка поместиться в командную оболочку Grub, где ее можно отредактировать. При первоначальном открытии для редактирования курсор будет находиться в самом конце строки, но его можно переместить с помощью клавиш-стрелок или же клавиш "Home" и "End". После внесения изменений в строку нажмите клавишу "Enter", чтобы сохранить их или же клавишу "Esc" для выхода из режима редактирования без сохранения изменений. Если редактор испортил изменяемую строку, то можно удалить ее полностью, нажав клавишу "D".

Затем нажмите клавишу "B" для загрузки видоизмененной строки. Изменения остаются только в оперативной памяти ОЗУ компьютера и не затрагивают файл menu.lst. Таким образом, строку можно изменять до тех пор, пока не будет достигнута успешная загрузка операционной системы.

Если вы не видите в строках никаких ошибок, то не отчаивайтесь, еще не все потеряно. Нажмите клавишу "C" для перехода в режим командной строки Grub, который аналогичен тому, который мы получали в терминале для переустановки загрузчика.

grub> find /boot/grub/stage2

Данная команда найдет разделы на всех установочных жестких дисках, которые могут быть корневыми разделами для Grub. Введите следующую команду, чтобы указать Grub использовать этот раздел:

grub> root (hd0,0)

Для того, чтобы найти файл ядра kernel на данном разделе, необходимо переместиться в директорию /boot. Для этого мы воспользуемся функцией автодополнения команд в оболочке Grub. Имя файла ядра операционной системы имеет вид vmlinuz-что-то-там-еще.

Введем команду:

grub> kernel /boot/vm

... и нажмем клавишу "Tab". Этим мы скажем Grub, чтобы он дозаполнил введенную команду теми возможными способами, которые ему доступны на данный момент. Иными словами, мы ввели начало имени файла vmlinuz. Grub сам просмотрит директорию /boot в поисках ядра (так как это мы указали ему командой kernel) и выведет ниже в отдельную строку все варианты, которые ему кажутся приемлемыми для завершения команды - в данном случае это имена файлов vmlinuz и vmlinuz-2.6.32.11-pclos2:

grub> kernel /boot/vmlinuz
Possible files are: vmlinuz vmlinuz-2.6.32.11-pclos2

Мы уже знаем, что файл vmlinuz является ссылкой, в то время как другой файл vmlinuz-2.6.32.11-pclos2 представляет из себя физическое ядро операционной системы. Которое мы можем использовать в дальнейшем, так как ссылка на него может быть поврежденной. Для того, чтобы добавить это имя в командную строку, нет необходимости вводить его полностью. Просто добавляем дефис и снова нажимаем клавишу "Tab", чтобы Grub сам дополнил все остальное. Такой способ позволяет избежать ошибок при вводе имени файла.

Кажется, все работает, поэтому переходим дальше и выполняем те же действия для файла initrd:

Видим, что Grub имеет всю необходимую ему информацию, поэтому мы можем попытаться загрузить операционную систему:

grub> boot

Вся информация для загрузки будет взята из текущей сессии Grub, поэтому я точно знаю, что все будет работать.

В заключение нужно сказать следующее. Все приведенные выше примеры работы с загрузчиком Grub безопаснее всего производить (в качестве тренировки) на операционной системе, установленной под виртуальной машиной VirtualBox. Установка и настройка такой машины проста и существует прекрасная статья, описывающая данный процесс, в октябрьском выпуске за 2008 год журнала PCLinuxOS. Статья написана редактором этого журнала parnote. В ней рассматривается установка операционной системы Windows под VirtualBox, но принцип остается одинаковым и полностью применим к инсталляции PCLinuxOS.