RuCore.NET

Основы начального загрузчика системы GRUB и GRUB2. Введение и настройка.





RuCoreNET - лучшее для вас!


Для инициализации ядра и запуска операционной системы Linux используется загрузчик. Это программа, которая запускается после завершения проверки оборудования BIOS, подготавливает оборудование к работе, задает нужные параметры ядра и позволяет выбрать операционную систему. Основная задача загрузчика дать пользователю выбрать операционную систему для загрузки.

 



Включение устройства

Программа GRUB — это так называемый загрузчик. Она запускается первой после включения компьютера и, как правило, отображает меню, в котором можно выбрать для загрузки операционную систему Windows или какой-либо дистрибутив Linux. В большинстве современных дистрибутивов применяется версия GRUB 2. В старых, особенно корпоративных, установках Linux, вы наверняка столкнетесь с устаревшей, не поддерживаемой уже несколько лет версией GRUB 0.97. Поэтому я кратко расскажу и об этой версии.

Аббревиатура GRUB означает Grand Unified Bootloader (Грандиозный унифици- рованный загрузчик). Программа запускает Linux и вообще очень полезна для работы с параллельными установками Windows и Linux, так как непосредственно после запуска компьютера позволяет выбрать для работы желаемую операционную систему.

Основы

Версии GRUB. C июня 2012 года используется версия GRUB 2.0. Разработка этой версии велась еще с 2005 года. Некоторые дистрибутивы не стали дожидаться полной доработки GRUB 2 и уже давно применяют новый загрузчик. Например, Ubuntu использует GRUB 2, начиная с версии 9.10, а Debian — с версии 6. Дистрибутив openSUSE перешел на GRUB 2 только в версии 12.2. Особый случай представляет дистрибутив Fedora: его разработчики перешли на GRUB 2 уже в 16 версии, но только в компьютерах, работающих с BIOS. Если же инсталлировать Fedora 16 или 17 с EFI, то вместе с дистрибутивом будет установлена EFI-сов­местимая версия GRUB 0.97!

Итак, версия, применявшаяся до GRUB 2, имеет название GRUB 0.97 legacy (устаревшая). Примечание «устаревшая» указывает на то, что эта версия не развивается уже несколько лет и ее технической поддержкой никто не занимается. А число 0,97 не оставляет сомнений, что данная разработка не достигла и никогда не достигнет уровня GRUB 1.0. Несмотря на это, производители многих дистрибутивов неоднократно применяли GRUB 0.97 legacy по собственному усмотрению, в результате реализация некоторых функций GRUB отличается от дистрибутива к дистрибутиву!

Хотя в новых дистрибутивах применяется преимущественно GRUB 2, GRUB 0.97 по-прежнему широко распространен. Во-первых, как уже было сказано, эта программа встретится вам в старых версиях Linux, во-вторых, в корпоративных дистрибутивах GRUB 0.97 сохраняет свои позиции основного загрузчика (например, в RHEL он задействуется вплоть до версии 6.3).

 

Что нового в GRUB 2

Далее перечислены все важнейшие нововведения, появившиеся в GRUB 2 по сравнению с официальной версией GRUB 0.97. В некоторых дистрибутивах имеется пропатченная версия GRUB 0.97, в которой присутствуют не все, а лишь некоторые из перечисленных ниже функций. Правда, такие пропатченные версии являются неофициальными и содержат особенности, специфичные для конкретных дистрибутивов.

  • GRUB 2 совместим с менеджером логических томов и программным RAID. Таким образом, в установках LVM и RAID больше не требуется загрузочный раздел /boot.
  • GRUB 2 совместим с файловыми системами ext4 и btrfs.
  • GRUB 2 позволяет запрашивать разделы диска по уникальному идентификатору файловой системы.
  • GRUB 2 совместим с системами, альтернативными BIOS, — EFI и coreboot (ранее называлась LinuxBIOS).
  • GRUB 2 позволяет отображать в записях меню любые символы Unicode.

Внутрисистемная реализация GRUB 2 выполнена совершенно по-новому. До- полнительные функции теперь реализованы в виде модулей, которые GRUB загружает на время использования. Такая организация должна обеспечить сравнительно простую расширяемость и техническую поддержку системы.

Конфигурация GRUB стала значительно сложнее. Конфигурационный файл grub.cfg является результатом исполнения различных конфигурационных сценариев. grub.cfg может и сам содержать сценарный код на shell-подобном языке либо на языке программирования LUA.

Компоненты и пакеты. Файлы, необходимые для работы GRUB 2, как правило, распределены по нескольким пакетам. Так, в Debian и Ubuntu в пакете grub-common содержатся различные платформозависимые конфигурационные файлы и команды, а в пакете grub-pc находятся файлы, специфичные для BIOS. Для компьютеров, использующих вместо BIOS EFI, coreboot и другие программы, вместо grub-pc требуются, соответственно, пакеты grub-efi-amd64, grub-efi-ia32 или grub-coreboot. Наконец, в пакете grub-rescue-pc имеется IMG-файл и файл образа диска, необхо- димые для того, чтобы сохранить систему аварийного восстановления GRUB на флешке или CD-диске. Таким образом, в критическом случае вы сможете запустить GRUB с такой флешки или диска, а потом запустить систему, вручную вводя команды GRUB или изменяя предусмотренные записи меню.

В Fedora удалось избежать такого разброса программ по разным пакетам. В пакете grub2 содержится GRUB для компьютеров, работающих с BIOS, а в пакете grub2-efi — версия, совместимая с EFI. Обновлением конфигурации GRUB (этот процесс необходимо выполнять после появления обновлений для ядра) занимаются Fedota-специфичные сценарии из пакета grubby.

Независимо от конкретного дистрибутива, для работы GRUB 2 требуется предварительно установить пакет os-prober. Одноименная команда просматривает все доступные разделы дисков на наличие операционных систем. Результат выполнения os-prober интегрируется в автоматически создаваемое меню GRUB.

Отличия, специфичные для конкретных дистрибутивов. К сожалению, в различных дистрибутивах GRUB 2 не только распределяется по разным пакетам, но и работает на основе не совсем идентичных конфигурационных файлов и механизмов. В этой главе описываются Debian версии 6 и выше, Fedora версии 16 и выше, openSUSE версии 12.2 и выше и Ubuntu версии 9.10 и выше.

Документация. Официальная документация по GRUB выдается по запросу справочной командой info grub.

 

 

 

Загрузка системы в BIOS

Прежде чем подробно обсудить установку и конфигурацию GRUB, коротко рассмотрим, что же происходит при загрузке системы. В зависимости от того, работает ли на компьютере традиционная система BIOS или более новая EFI, процесс загрузки может значительно отличаться.

После включения компьютера с BIOS инициализируется базовая система ввода-вывода. В ходе этого процесса на экране обычно отображается несколько системных сообщений — например, каким объемом памяти располагает компьютер. Затем BIOS загружает содержимое первого сектора первого жесткого диска в память и выполняет код этого сектора. Такой специальный сектор называется MBR (Master Boot Record, главная загрузочная запись).

Загрузчик Windows. Если на компьютере установлена ОС Windows, то в MBR располагается крошечная программа. Она находит раздел, помеченный как «активный», а затем запускает загрузчик Windows, который расположен в загрузочном секторе данного раздела. Если на компьютере установлено несколько версий Windows, то загрузчик Windows позволяет выбрать одну из них.

Загрузчик Linux. Если на компьютере установлена и Linux, MBR обычно заменяется кодом загрузчика GRUB. В таком случае GRUB может либо запустить Linux, либо совершить условный переход для запуска Windows.

Альтернативный метод заключается в том, чтобы не трогать MBR и установить GRUB в загрузочном секторе системного раздела Linux, пометив этот раздел как «активный». Такой метод хотя и не противоречит правилам MBR, менее надежен и поэтому почти не используется.

Основная загрузочная запись имеет размер всего 512 Мбайт, поэтому загрузчик не сможет полностью поместиться в MBR. Чтобы можно было обойти это ограничение, MBR может вместить ровно такой фрагмент кода, который позволит вам запустить оставшуюся часть загрузчика уже с жесткого диска. Соответственно, код GRUB подразделяется на две или три части: stage1 находится в основной загрузочной записи и предназначена для того, чтобы загрузить первые сектора части stage1_5 или stage2. В части stage1_5 содержится дополнительный код, обеспечивающий доступ к файлам различных файловых систем. Наконец, в stage2 содержится сам загрузчик.

Когда запустится загрузчик, появится меню, в котором будут на выбор представлены все операционные системы, определенные в процессе конфигурации GRUB (обычно это Windows и Linux). Теперь с помощью клавиш управления курсором можно выбрать интересующую вас операционную систему и запустить ее, нажав Enter. Часто GRUB настроен так, чтобы по истечении определенного промежутка времени операционная система загружалась автоматически.

Запуск Linux. Если вы определяете в загрузчике, что необходимо запустить Linux, то загрузчик должен поместить в оперативную память файл ядра Linux и запустить этот файл. Обычно файл ядра Linux называется /boot/vmlinuz (последняя буква z указывает на то, что ядро архивировано). Иными словами, загрузчик должен быть в состоянии загрузить из файловой системы весь указанный файл.

Параметры ядра. Обычно ядру сообщается несколько параметров. Как минимум один параметр передается обязательно: имя устройства системного раздела (например, root=/dev/sdb13). Это делается для того, чтобы ядро знало, какой из разделов является системным. Когда ядро запустится, управление будет передано программе Linux /sbin/init, отвечающей за инициализацию системы Linux. Например, она отвечает за запуск сетевых служб.

Доступ к модулям ядра. Ядро Linux имеет модульную структуру. Это означает, что в самом ядре содержатся только самые элементарные функции. Дополнительные функции, необходимые для доступа к компонентам аппаратного обеспечения, для считывания и изменения файлов из различных файловых систем и т.д., напротив, находятся в модулях, которые при необходимости загружаются из файловой системы и, таким образом, дополняют ядро.

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

Файл Initrd. Решение заключается в том, что GRUB должен загружать не только ядро, но и файл Initrd. Это специальный файл, в котором содержатся все модули ядра, необходимые для запуска системы. Ядро временно использует этот файл как псевдодиск, то есть оно может загрузить все модули сразу же после запуска псевдодиска (сокращение Initrd означает Initial RAM Disk — диск в оперативной памяти для начальной инициализации).

Обычно файл Initrd называется /boot/initrd или /boot/initrd.gz. В большинстве дистрибутивов имеются инструменты, позволяющие создать такой файл Initrd, который бы подошел к применяемому аппаратному обеспечению и к файловой системе, которая находится в системном разделе (команда mkinitrd).

Установка и конфигурация GRUB. Под установкой GRUB понимается процесс, в ходе которого стартовый код GRUB записывается в загрузочный сектор жесткого диска.

Конфигурация GRUB протекает по-разному в зависимости от версии GRUB. В GRUB 0.97 применяется центральный конфигурационный файл /boot/grub/menu.lst. В GRUB 2 есть целая коллекция конфигурационных сценариев, находящихся в каталоге /etc/grub.d/. Благодаря исполнению этих сценариев создается сам конфигурационный файл GRUB 2 /boot/grub/grub.cfg.

 

Запуск системы с EFI

В Apple система EFI (Extensible Firmware, расширяемый интерфейс между операционной системой и микропрограммами) применяется уже много лет, но на рынке ПК с другими системами постепенный отказ от BIOS продлился значительно дольше.

EFI и GPT. Даже притом, что EFI заново разрабатывался практически с нуля, выгоды для конечного пользователя остаются довольно ограниченными. Но не может не радовать, что теперь есть гигантские жесткие диски с таблицей секционирования GUID (GPT), совершенно не доставляющие проблем при работе. Не забывайте, что применение GPT не является обязательным, в том числе и на компьютерах с EFI! EFI нормально работает и с такими жесткими и твердотельными дисками, чья таблица секционирования сохранена в главной загрузочной записи (MBR). Лично я считаю, что использовать GPT предпочтительно и на жестких и твердотельных дисках, которые не превышают по размеру 2 Тбайт, поскольку такая таблица значительно упрощает весь процесс секционирования диска.

Параллельная установка. С введением EFI значительно изменился весь загрузочный процесс. В то время как BIOS в принципе предусматривал установку только одной операционной системы и при любой параллельной установке приходилось задействовать менеджер загрузок, EFI сам по себе поддерживает установку нескольких операционных систем. Каждая операционная система может сохранить собственный загрузчик в специально предусмотренном для этого сегменте диска. При запуске компьютера сначала происходит инициализация EFI, а потом автоматически запускается загрузчик той операционной системы, которая была задана по умолчанию. (Как правило, по умолчанию задается та операционная система, которая была установлена последней.) Если при запуске компьютера нажать специальное сочетание клавиш (к сожалению, оно не стандартизировано и варьируется в зависимости от производителя EFI и ПК), то EFI отобразит меню со всеми загрузчиками.

Таким образом, при работе с EFI GRUB требуется лишь для того, чтобы запустить Linux. Вторая функция GRUB — выбор одной из нескольких операционных систем — с EFI становится уже излишней (хотя меню GRUB — исключительно полезная вещь даже при работе с EFI).

В сущности, GRUB с EFI совершенно не нужен. Ядро Linux содержит все необходимые функции, позволяющие EFI-системе запускать Linux напрямую, то есть, минуя GRUB или другие загрузчики. Но на практике этот вариант пока не играет роли: GRUB или другие загрузчики позволяют выбирать одну из нескольких установленных версий ядра, передавать параметры ядра, изменять параметры загрузки и т.д. При запуске Linux непосредственно из EFI вся эта гибкость теряется. EFI и GRUB. Чтобы EFI и GRUB правильно взаимодействовали, нужно наст­роить специальную версию EFI, рассчитанную на работу с GRUB. Установочные программы распространенных дистрибутивов решают эту задачу автоматически. В любом случае такое взаимодействие предполагает, что установочная программа должна выполняться в EFI-режиме! (Многие варианты реализации EFI совместимы с BIOS. При запуске той или иной установки Linux решающее значение имеет то, в каком режиме происходит данная установка. На некоторых компьютерах один установочный носитель — то есть DVD или флешка — в меню EFI отображается как два: одно устройство в BIOS-режиме и одно в EFI-режиме. Вы должны выбирать именно ту запись, которая относится к EFI!)

Раздел EFI. На компьютерах с EFI код GRUB записывается не в главную загрузочную запись, а в каталог раздела с EFI. Это особый раздел диска, в котором применяется файловая система VFAT. Такой раздел должен быть помечен специальным идентификатором: (MBR) или (C12A7328-F81F-11D2-BA4B-00A0C93EC93B) (GPT).

Microsoft рекомендует создавать EFI-раздел как первый раздел жесткого диска, хотя стандарт EFI этого и не требует. Данный раздел не должен быть очень большим, вполне достаточно будет 100–200 Мбайт (в тех дистрибутивах, которые я протестировал, загрузчик EFI в каждом из случаев требовал менее 1 Мбайт. Windows 8 требует значительно больше места — ориентировочно порядка 25 Мбайт).

Раздел с EFI должен быть подключен к файловой системе Linux в каталоге /boot/efi! Если при установке Linux вы выполняете секционирование диска вручную, то об этом подключении должны позаботиться вы сами.

Ядро, файл Initrd. Если GRUB уже работает, то запуск Linux протекает точно так же, как и на компьютере с BIOS: GRUB загружает ядро и запускает его, и в ходе запуска происходит передача файла Initrd и параметров ядра.

 

Файлы Initrd

Ядро Linux содержит разнообразные модули. Многие дополнительные функции —  такие как управление SCSI-картой, доступ к определенным файловым системам, массивам RAID или сегментам LVM — обеспечиваются не самим ядром, а его модулями. Но при запуске системы это доставляет определенные проблемы. Действительно, как ядру загрузить модуль, если оно даже не имеет возможности получить доступ к файловой системе. Поэтому модули, которые требуются непосредственно для запуска системы, помещаются в диск оперативной памяти для начальной инициализации (Initial RAM Disk, сокращенно Initrd). Соответствующий Initrd-файл передает GRUB ядру (обратите внимание на ключевое слово initrd в конфигурационном файле GRUB).

Ядро и файл Initrd обычно находятся в каталоге /boot, но название самого Initrd— файла различается в зависимости от дистрибутива. В принципе, если применяется GRUB 0.97, то каталог /boot часто находится в собственном сегменте диска, вне системы RAID или LVM, поскольку GRUB 0.97 может обращаться только к обычным сегментам жесткого диска. В этом отношении GRUB 2 отличается значительно большей гибкостью.

Файл Initrd должен содержать такие модули ядра, версия которых точно совпадает с версией ядра. Поэтому всякий раз, когда вы устанавливаете или самостоятельно компилируете новую версию ядра, необходимо заново создавать соответствующий этому ядру Initrd-файл. При обновлении ядра этот процесс обычно автоматически выполняет сама программа обновления. А если вы самостоятельно устанавливаете ядро, то сами должны позаботиться и об Initrd-файле.

Строго говоря, название «Initrd-файл» в большинстве современных дистрибутивов уже неприменимо. На самом деле мы работаем с initramfs -файлами, организация которых будет описана немного ниже. Но поскольку и в параметрах GRUB, и в различных командах для создания файлов используется понятие initrd, а само ядро правильно интерпретирует файл, несмотря на неверное название, я тоже не буду отступать от привычного названия Initrd — пусть оно и заведомо неверное.

Файл Initrd не всегда необходим для работы. Если ядро вашего дистрибутива содержит все компоненты, необходимые для загрузочного процесса, то запуск возможен и без Initrd-файла. Но для этого ядро нужно соответствующим образом скомпилировать — и именно такого в большинстве дистрибутивов не происходит. (Почти все модули ядра при желании можно интегрировать в само ядро. Разумеется, файл ядра от этого увеличится.)

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

Update-initramfs (Debian, Ubuntu). В Debian и Ubuntu для создания Initrd-файлов и их последующего администрирования предусмотрен сценарий updateinitramfs. В простейшем случае для обновления Initrd-файла новейшей установ-ленной версии ядра вы просто задаете параметр -u. Но если вы хотите обновить Initrd-файл не до новейшей, а до какой-то другой версии ядра, то укажите номер версии с помощью параметра -k. Параметр -k all обновляет Initrd-файлы для всех установленных версий ядра.

С помощью параметров -c или -d сценарий update-initramfs создает новый или удаляет имеющийся Initrd-файл. В таком случае обязательно требуется указать версию ядра с помощью параметра -k.

root# update-initramfs -c -k 3.5-13-generic

update-initramfs: Generating /boot/initrd.img-3.5-13-generic

«За кулисами» сценарий update-initramfs обращается для создания Initrd-файлов к сценарию mkinitramfs. Базовая конфигурация происходит в файле /etc/initramfstools/initramfs.conf, Кроме того, к Initrd-файлу добавляются все модули, перечисленные в каталоге /etc/initramfs-tools/modules (один модуль на строку).

В стандартной конфигурации (с MODULES=most в initramfs.conf) сценарий mkinitramfs создает довольно крупные Initrd-файлы, содержащие многочисленные дополнительные модули. В частности, здесь находятся важнейшие файловые системы Linux, драйверы для USB, SCSI и SATA, а также сетевые и NFS-драйверы.

При непосредственном вызове mkinitramfs (это приходится делать редко), нужно как минимум сообщить имя нового Initrd-файла (параметр -o). Если Initrd-файл должен быть создан не для актуальной версии ядра, то дополнительно укажите желаемую версию:

root# mkinitramfs -o myinitrd 3.5-13-generic

Dracut (Fedora, Red Hat). Fedora в версии 12 и выше и Red Hat Enterprise Linux в версии 6 и выше используют для создания Initrd-файла программу dracut. В более ранних версиях Fedora и RHEL вместо этого применяется программа mkinitrd. dracut автоматически выполняется при каждом обновлении ядра. Initrd-файлы, создаваемые с помощью dracut, содержат меньше дистрибутиво-специфичного кода, чем ранее, и в большей мере опираются на информацию из системы udev.

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

Команда dracut учитывает настройки, указанные в файле /etc/dracut.conf, и встраивает в Initrd-файл модули из каталога /usr/share/dracut/modules.d. Чтобы создать Initrd-файл для самостоятельно скомпилированного ядра версии 3.5.3 (файл /boot/vmlinuz-3.5.3), выполните следующую команду:

root# dracut /boot/initrd-3.5.3 3.5.3

Mkinitrd (SUSE). В дистрибутивах SUSE Initrd-файлы создаются с помощью команды mkinitrd. Как правило, этой команде не требуется передавать никаких параметров. Команда mkinitrd автоматически создает Initrd-файлы для всех файлов ядра, которые находит в каталоге /boot. Новые Initrd-файлы получают имя вида /boot/initrd-nnn, где nnn — версия ядра. Кроме того, mkinitrd создает ссылку, которая указывает c /boot/initrd на Initrd-файл, соответствующий vmlinuz.

Если вы хотите создать только один определенный Initrd-файл, то с помощью параметров –k и -i можете задать, соответственно, файл ядра и файл Initrd (по умолчанию, это делается в каталоге /boot). Команда mkinitrd интерпретирует переменную INITRD_MODULES из файла /etc/sysconfig/kernel. В этом файле содержатся все модули, необходимые для загрузки, он может иметь примерно следующий вид:

# в /etc/sysconfig/kernel

INITRD_MODULES=»thermal ahci ata_piix ata_generic processor fan»

Дополнительные модули указываются с помощью -m. Более подробная информация по mkinitrd выводится с помощью параметра -h, справки man mkinitrd, а также в исходном коде самого сценария (файл /sbin/mkinitrd).

Обновления ядра. Когда в дистрибутиве выполняется обновление ядра и при этом имя ядра меняется, необходимо соответствующим образом изменить и файл меню GRUB, а также создать Initrd-файл, подходящий для нового ядра. Во всех распространенных дистрибутивах эти операции выполняются автоматически в процессе обновления, и после перезапуска компьютера уже используется новое ядро. (В некоторых дистрибутивах в меню GRUB может также сохраняться и запись для старого ядра. Она пригодится, если с обновлениями возникнут проблемы, и систе-му придется далее использовать со старым ядром.)

Просмотр Initrd-файла. В версии ядра 2.6 и выше Initrd-файлы внутрисистемно представлены как файлы initramfs. Initrd-файл — это сжатый файл-архив (cpio), состоящий из различных каталогов и файлов. Если вы хотите просмотреть содержимое этого архива, сделайте так:

root# cd /boot

root# cp initrd-n.n initrd-test.gz

root# gunzip initrd-test

root# mkdir test

root# cd test

root# cpio -i < ../initrd-test

root# ls -lR

 

 

Базовая конфигурация

Grub.cfg. Меню GRUB определяется в файле grub.cfg, который в зависимости от дистрибутива может находиться в разных местах:

/boot/grub/grub.cfg — файл меню GRUB в Debian и Ubuntu;

/boot/grub2/grub.cfg — файл меню GRUB в Fedora и openSUSE версия 12.2 и выше;

/etc/grub2.cfg — ссылка на /boot/grub2/grub.cfg в Fedora и openSUSE.

/etc/grub.d/. В принципе возможность вручную вносить изменения в файл grub.cfg не предусмотрена. Поэтому права доступа к этому файлу указаны как «только для чтения». Если вы хотите изменить меню GRUB, то измените лежащие в его основе конфигурационные файлы. Не может не радовать, что в Debian, Ubuntu, openSUSE и Fedora эти файлы находятся в одном и том же месте:

/etc/grub.d/* — общие конфигурационные файлы GRUB;

/etc/default/grub — дополнения, специфичные для конкретных дистрибутивов.

Update-grub. Чтобы заново сгенерировать эти файлы после внесения изменений или после обновления ядра, нужно выполнить одну из следующих команд:

root# update-grub (Debian/Ubuntu)

root# grub2-mkconfig -o /boot/grub2/grub.cfg (Fedora)

Пример grub.cfg. Результирующий файл grub.cfg выглядит наподобие приведенного ниже примера. Этот листинг автоматически создан в Ubuntu 12.10 с помощью grub.cfg и сокращен ради экономии места. Кстати, пусть вас не смущает строка insmod ext2: этот модуль GRUB отвечает за работу со всеми файловыми системами ext, в том числе с ext3 и ext4. Детали синтаксиса grub.cfg будут объяснены ниже в этом разделе:

# Пример /boot/grub/grub.cfg

# из /etc/grub.d/00_header

# Управление переменными

if [ -s $prefix/grubenv ]; then

set have_grubenv=true

load_env

fi

set default=»0″

if [ «${prev_saved_entry}» ]; then

set saved_entry=»${prev_saved_entry}»

save_env saved_entry

set prev_saved_entry=

save_env prev_saved_entry

set boot_once=true

fi

# Определение различных функций

function savedefault { … }

function recordfail { … }

function load_video { … }

# Выбор раздела с установочными файлами GRUB

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-dc01887b140b

if loadfont /usr/share/grub/unicode.pf2 ; then

set gfxmode=auto

load_video

insmod gfxterm

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-

dc01887b140b

set locale_dir=($root)/boot/grub/locale

set lang=de_AT

insmod gettext

fi

terminal_output gfxterm

if [ «${recordfail}» = 1 ]; then

set timeout=-1

else

set timeout=10

fi

# из /etc/grub.d/10_linux

# Запуск Ubuntu

menuentry ‘Ubuntu, mit Linux 3.5.0-2-generic’ … {

recordfail

gfxmode $linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid

—set=root 474ef599-7665-4fe0-a4fd-97df765db80e

linux boot/vmlinuz-3.5.0-2-generic root=UUID=474e… ro quiet splash

initrd /boot/initrd.img-3.5.0-2-generic

}

menuentry ‘Ubuntu, с Linux 3.5.0-2-generic (режим восстановления)’ … {

linux /boot/vmlinuz-3.5.0-2-generic root=UUID=474e…

ro recovery nomodeset

}

# из /etc/grub.d/20_memtest86+

# Тест памяти

menuentry «Memory test (memtest86+)» {

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-

dc01887b140b

linux16 /boot/memtest86+.bin

}

# из /etc/grub.d/30_os-prober

# Запуск Windows

menuentry «Windows (loader) (on /dev/sda1)» {

insmod ntfs

set root='(hd0,1)’

search —no-floppy —fs-uuid —set 2ca80f2ba80ef35e

chainloader +1

}

Создание grub.cfg заново. В Debian и Ubuntu команда update-grub создает новую версию файла grub.cfg. В Fedora и openSUSE в аналогичном случае выполняется команда grub2-mkconfig -o /boot/grub2/grub.cfg. (Сценарий update-grub, специфичный для Debian/Ubuntu, так или иначе, содержит только эту команду.)

grub[2]-mkconfig интерпретирует описанные ниже конфигурационные файлы или сценарии. При этом, в частности в каталоге /boot меню GRUB, создаются ­записи для всех файлов ядра. Кроме того, просматриваются все доступные разделы жесткого диска. Если на диске есть и другие операционные системы, то записи в меню GRUB создаются и для них. Поэтому выполнение update-grub на компьютере с большим количеством сегментов на диске может длиться достаточно долго.

grub[2]-mkconfig автоматически выполняется при каждом обновлении ядра и удостоверяет, что в меню GRUB содержится новейшая версия ядра Linux.

/etc/default/grub. в файле /etc/default/grub содержатся некоторые глобальные настройки GRUB. Не забудьте, что вносимые здесь изменения вступают в силу лишь тогда, когда вы заново сгенерируете grub.cfg! В Ubuntu конфигурационный файл содержит следующие настройки:

# Файл /etc/default/grub

GRUB_DEFAULT=0

GRUB_HIDDEN_TIMEOUT=0

GRUB_HIDDEN_TIMEOUT_QUIET=true

GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian `

GRUB_CMDLINE_LINUX_DEFAULT=»quiet splash»

GRUB_CMDLINE_LINUX=»»

# GRUB_TERMINAL=console

# GRUB_GFXMODE=640×480

# GRUB_DISABLE_LINUX_UUID=true

# GRUB_DISABLE_RECOVERY=»true»

# GRUB_INIT_TUNE=»480 440 1″

 

Стандартная конфигурация в Fedora выглядит так:

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR=»Fedora»

GRUB_DEFAULT=saved

GRUB_CMDLINE_LINUX=»rd.md=0 rd.dm=0 quiet SYSFONT=latarcyrheb-sun16 rhgb \

rd.lvm.lv=vg_fedora16vbox/lv_root rd.luks=0 LANG=de_DE.UTF-8 \

rd.lvm.lv=vg_fedora16vbox/lv_swap KEYTABLE=de-latin1-nodeadkeys»

Далее объясняются значения многочисленных параметров.

Переменная GRUB_DEFAULT указывает, какая запись меню GRUB должна выбираться по умолчанию. Обратите внимание на то, что количество записей может изменяться после каждого вызова update-grub и особенно после каждого обновления ядра. Поэтому такая настройка, как GRUB_DEFAULT=5, обычно не подходит.

Настройка saved означает, что будет активизирована запись меню, которая использовалась последней. Правда, это работает лишь при условии, что файлы GRUB расположены в обычном разделе диска! Если же используется LVM или RAID, то после выбора из меню GRUB не сможет сохранять каких-либо переменных окружения.

Вы также можете присвоить GRUB_DEFAULT последовательность символов (строку) menuentry, где menuentry — желаемая строка меню. Но при этом строго соблюдайте порядок записи данной строки (в том числе все номера версий и устройств, которые могут находиться в записи меню).

Переменная GRUB_HIDDEN_TIMEOUT важна в тех случаях, когда при установке GRUB опознает на вашем компьютере только одну операционную систему (в нашем случае — Linux). В таком случае значение GRUB_HIDDEN_TIMEOUT задает, сколько времени будет у пользователя, чтобы отобразить меню GRUB нажатием клавиши Shift (в течение этого времени ожидания экран остается черным).

В Ubuntu значение параметра GRUB_HIDDEN_TIMEOUT=0 приводит к тому, что GRUB сразу запускает операционную систему. Чтобы вмешаться в процесс загрузки, нужно нажать Shift сразу же после запуска компьютера. Если на компьютере установлено несколько операционных систем, то GRUB игнорирует настройку GRUB_HIDDEN_TIMEOUT и сразу отображает меню.

Переменная GRUB_HIDDEN_TIMEOUT_QUIET=true отменяет показ счетчика с обратным отсчетом в период ожидания, заданный в GRUB_HIDDEN_TIMEOUT . Если вы хотите, чтобы меню GRUB отображалось (в том числе и тогда, когда на компьютере установлена только Ubuntu), закомментируйте строки GRUB_HIDDEN_TIMEOUT=… и GRUB_HIDDEN-TIMEOUT_QUIET=… (поставьте перед каждой из них символ комментария #).

Переменная GRUB_TIMEOUT=n указывает, в течение какого количества секунд GRUB дожидается выбора одной из записей меню. Если за это время не поступит ни- какого пользовательского ввода, GRUB запустит уже выбранную операционную систему. Указанное здесь время учитывается лишь в том случае, если меню GRUB вообще появляется на экране, то есть, если на компьютере установлено несколько операционных систем или пользователь нажал клавишу Shift во время периода ожидания, заданного в GRUB_HIDDEN_TIMEOUT.

Переменная GRUB_DISTRIBUTOR интерпретируется сценарием 10_linux (см. ниже), в ней содержится имя текущего дистрибутива (например, Fedora или Ubuntu).

Значения переменных GRUB_CMDLINE_LINUX и GRUB_CMDLINE_LINUX_DEFAULT также учитываются сценарием 10_linux. В них указывается, какие параметры должны быть сообщены ядру. Параметры GRUB_CMDLINE_LINUX действуют при каждом запуске, а параметры GRUB_CMDLINE_LINUX_DEFAULT дополнительно применяются при запуске, происходящем по умолчанию (но не в режиме восстановления).

По умолчанию меню GRUB отображается в графическом режиме с разрешением 640 × 480 пикселов. Если вы хотите работать с более высоким разрешением,его можно задать в переменной GRUB_GFXMODE (разумеется, в пределах возможностей вашей графической карты). Если вы желаете вообще отказаться от графического режима, активизируйте специально предусмотренную для этого настройку GRUB_TERMINAL=console. Обе переменные интерпретируются сценарием 00_header. При стандартных настройках значительные различия между текстовым и графическим режимами отсутствуют, но только в графическом режиме могут отображаться символы Unicode.

Как правило, GRUB передает ядру, которое предполагается запустить, корневой каталог в качестве UUID-номера. Если вы, напротив, предпочитаете указывать номер устройства (например, /dev/sda1), активизируйте строку GRUB_DISABLE_LINUX_UUID=true. Эта настройка влияет только на запуск активного дистрибутива (сценарий 10_linux), но не на другие дистрибутивы.

update-grub или grub-mkconfig создают, как правило, записи меню и для запуска Linux в режиме восстановления. При этом Linux запускается в однопользовательском режиме, без отображения экрана-заставки. Если вы хотите отказаться от записей, необходимых для восстановления, активизируйте строку GRUB_DISABLE_RECOVERY=»true».

С помощью GRUB_INIT_TUNE = можно сопроводить запуск GRUB звуковым сигналом.

Автоматическое создание файла grub.cfg. Основная идея конфигурации GRUB заключается в том, что сами вы задаете лишь ключевые данные этой конфигурации. Готовый конфигурационный файл grub.cfg создается специальным сценарием с учетом указанных вами параметров. Здесь важно подчеркнуть, что сценарии GRUB пытаются опознать все операционные системы, установленные на компьютере (Linux, Windows и т. д.) и сделать в файле grub.cfg соответствующие записи. Это же касается и тех операционных систем, которые могут быть позже добавлены на компьютер.

Для этого в каталоге /etc/grub.d содержатся исполняемые скриптовые (сценарные) файлы (табл.). Когда следует создать новую версию grub.cfg, программа update-grub по порядку выполняет все сценарии, содержащиеся в grub.d. Результат (стандартный вывод) сценариев сохраняется в grub.cfg. Но из-за такого метода работы конфигурационные файлы получаются довольно путаными: в коде то и дело встречаются команды вида cat » EOF, переадресующие в стандартный вывод все строки вплоть до аббревиатуры EOF. Сами эти строки часто содержат сценарный код, который интерпретируется GRUB только при запуске системы.

 

Два наиболее интересных сценария — 10_linux и 30_os-prober. Сценарий 10_linux выдает для каждой версии ядра, находящейся в каталоге /boot/, две записи меню: одну для обычного запуска и одну для восстановительного запуска в однопользовательском режиме, без экрана-заставки. Записи меню сортируются по номеру версии, причем в начале списка идет самая новая версия.

30_os-prober вызывает сценарий os-prober. Этот сценарий выводит список всех операционных систем (Linux, Windows, Mac OS X), расположенных на всех доступных сегментах жесткого диска. Для каждой из этих операционных систем создается своя запись в меню, причем, в случае с дистрибутивами Linux, может быть применен вариант конфигурации GRUB, который уже задан. При этом вызываются многочисленные сценарии, входящие в состав пакета os-prober.

Во время моих тестов распознавание различных дистрибутивов Linux и версий Windows на компьютерах BIOS функционировало великолепно. С EFI все было гораздо сложнее. Операционные системы, запускаемые через EFI, не находят входа в меню GRUB. В общем-то, в этом нет ничего удивительного: вы же можете выбрать операционную систему в меню EFI, зачем же GRUB решать ту же задачу? Но, по моему опыту, интеграция с меню GRUB все же является желательной. На многих компьютерах меню EFI отображается именно в тех случаях, когда при запуске компьютера в определенный момент времени нажато нужное сочетание клавиш. Я об этом не раз забывал и оказывался в операционной системе, в которую совершенно не собирался попадать! В автоматическом меню GRUB ошибку допустить намного сложнее.

Самостоятельное внесение дополнений в grub.cfg. Если вы хотите дополнить grub.cfg собственными записями, добавьте в каталог grub.d свои сценарии. Эти сценарии выполняются в том порядке, который определяется их нумерацией (при одинаковом порядковом номере — в алфавитном порядке). Не забудьте поставить бит исполнения (Execute-Bit). Обратите внимание и на то, что в grub.cfg попадает не сам файл, а его результат (стандартный вывод)!

В файле шаблона 40_custom показан пример подобной работы. Здесь к файлу применяется команда tail (параметр $0). Благодаря параметру -n +3, файл выводится, начиная с третьей строки, первые две строки не отображаются.

#!/bin/sh

exec tail -n +3 $0

# в этом файле показан пример добавления собственных записей

В другом варианте показан пример 41_custom. Содержащийся здесь код без изменений переносится в grub.cfg и интерпретируется только к моменту запуска (то есть при отображении меню GRUB). В этот момент проверяется, существует ли файл /boot/grub/custom.cfg (Ubuntu) или /boot/grub2/custom.cfg (Fedora, openSUSE). Если он существует, то этот файл добавляется в конфигурацию GRUB. Поскольку source исполняется при выполнении GRUB, изменения в custom.cfg вступают в силу и не приходится дополнительно создавать конфигурационный файл GRUB grub.cfg.

#!/bin/sh

cat <<EOF

if [ -f \$prefix/custom.cfg ]; then

source \$prefix/custom.cfg;

fi

EOF

Синтаксис и внутренняя организация

Размеры статьи не позволяют привести здесь полное описание синтаксиса всех ключевых слов, допустимых для использования в grub.cfg. Поэтому ниже я рас- скажу лишь о важнейших ключевых словах, которые употребляются в примерах из этого раздела. Официальный учебник по GRUB (PDF-документ содержит более 100 страниц!) находится по адресу http://www.gnu.org/software/grub/manual/. Переменные. С помощью set varname=value осуществляется присваивание переменных. Для считывания переменных применяется запись вида $varname . При интерактивном выполнении команд GRUB команда echo $varname отображает содержимое переменной, а set возвращает все определенные переменные.

Некоторые переменные обладают, кроме того, особым значением. К ним относятся, например, default, timeout , color_xxx, menu_color_xxx и особенно root: прлюбом доступе к файлам автоматически происходит считывание раздела, определенного в root.

GRUB может долговременно сохранять переменные на время работы. Для этого сначала (в Linux) должен быть создан файл /boot/grub[2]/grub-editenv (по умолчанию в большинстве дистрибутивов он уже создан).

root# grub-editenv /boot/grub[2]/grubenv create

Теперь во время работы GRUB может с помощью save_env имяпеременной сохранить в этом файле переменную либо считывать переменные из этого файла с помощью load_env. Перед этим необходимо настроить root так, чтобы эта переменная указывала на раздел с файлом окружения. В Linux вы также можете считывать или изменять переменные GRUB с помощью grub-editenv.

Разделы. В GRUB существует собственная номенклатура для обозначения жестких дисков и содержащихся на них разделов (табл.). Но нумерация при этом не совпадает: первый жесткий диск имеет номер 0, а первый раздел — номер 1!

 

Перед номером раздела допускается ставить сокращенное обозначение, указывающее способ секционирования: msdos для носителей, чья таблица секционирования записана в главной учетной записи, gpt — для носителей, применяющих таблицу разбиения GUID. Таким образом могут получаться названия вида (hd0,msdos3) или (hd0,gpt2).

Работа с номерами UUID. В grub.cfg часто встречается следующая последовательность команд:

set root=(hd1,1)

search —no-floppy —fs-uuid —set 12345678…

Первая команда инициализирует переменную root. Вторая команда ищет файловую систему с указанным номером UUID. Если поиск оканчивается успехом, то GRUB, на основании значения параметра —set, сохраняет соответствующее имя раздела в переменной root.

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

Модули. С помощью insmod name GRUB загружает во время работы модули расширений с дополнительными функциями. GRUB ищет файлы модулей name.mod в каталоге /boot/grub[2], в разделе, указанном в переменной root. Следует в частности отметить важные модули part_msdos и part_gpt (считывание таблиц секционирования), ext2 (файловые системы ext2 и ext4), raid, raid5rec, raid6rec и mdraid (программные массивы RAID), lvm, gfxterm (графическая консоль), vbe (графическая система), а также jpeg, tga и png для считывания графических файлов.

 

Записи меню GRUB

Menuentry. Записи меню GRUB вводятся ключевым словом menuentry. Следующий за ним текст записывается в кавычках, поэтому в нем допускаются интернациональные символы.

Подменю. В версии GRUB 2.00 и выше поддерживаются подменю (меню второго порядка). В файле grub.cfg подменю определяются так:

submenu ‘Подменю’ {

menuentry ‘Запись 1’ { … }

menuentry ‘Запись 2’ { … }

}

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

Запуск Linux. Запись в меню GRUB 2, предназначенная для запуска Linux, в минимальном варианте выглядит примерно так:

menuentry «Linux» {

set root=(hd0,3)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

set root указывает раздел, в котором находится ядро и Initrd-файл. Ключевые слова linux и initrd задают имена файлов относительно раздела диска. Указанные параметры передаются ядру. Обязательно требуются root для указания системного раздела и ro, чтобы доступ к системному разделу был открыт сразу только для чтения. Все остальные параметры специфичны для конкретных дистрибутивов. Вот примеры:

Debian 6 — root=/dev/xxx ro quiet ;

Fedora 17 — root=/dev/xxx ro rhgb quiet LANG=… SYSFONT=… KEYTABLE=… ;

openSUSE 12.2 — root=UUID=xxx resume=/dev/xxx splash=silent showopts video=nxn quiet ;

Ubuntu 12.10 — root=UUID=xxx ro quiet splash .

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

menuentry «Linux — Mit eigener Bootpartition» {

set root=(hd0,2)

linux /vmlinuz-n.n.n root=… ro quiet splash

initrd /initrd.img-n.n.n

}

Если раздел с ядром и Initrd-файлом входит в состав LVM-системы и/или программного массива RAID, то для работы потребуется загрузить соответствующие модули GRUB. В случае с RAID-5 и, соответственно, RAID-6 применяются модули raid5rec и raid6rec. В set root теперь можно указать системный раздел с помощью, соответственно, (lvname) и (mdn):

menuentry «Linux — Mit Software-RAID» {

insmod raid mdraid

set root=(md0)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

menuentry «Linux — Mit LVM» {

insmod lvm

set root=(vg1-root)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

menuentry «Linux — LVM auf RAID-5» {

insmod raid raid5rec mdraid lvm

set root=(vg1-root)

linux /boot/vmlinuz-n.n.n root=/dev/mapper/… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

Если вы не хотите полагаться на номера устройств, вы можете также сами найти системный раздел в таблице UUID с помощью команды search. Если команда search сработает успешно, то GRUB-переменная root будет соответствующим образом изменена. Это работает и с LVM-, и с RAID-разделами, если предварительно загрузить нужные модули GRUB. В Ubuntu по умолчанию за set root следует подходящая команда search, позволяющая максимально снизить зависимость GRUB от номеров устройств.

menuentry » — настройка root-переменной Linux по UUID » {

set root=(hd0,3)

search —no-floppy —fs-uuid —set 12345678…

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

Запуск Windows. Для запуска Windows на компьютере с BIOS выберите с помощью set root системный раздел с Windows и запустите его загрузчик, используя chainloader +1. Обратите внимание на то, что Windows версии 7 и выше по умолчанию создает на диске два раздела: один загрузочный раздел размером около 100 Мбайт с файлами bootmgr и bootsect.bak и другой, значительно более крупный, системный раздел. В GRUB требуется указывать загрузочный раздел. Команда search остается опциональной. От drivemap, как правило, можно отказаться. Команда пытается «уверить» Windows в том, что система Windows расположена на первом жестком диске, даже если это совсем не так. Иногда требуется в первую очередь запускать именно Windows.

menuentry «Windows 7» {

set root=(hd0,1)

search —no-floppy —fs-uuid —set 12345678…

drivemap -s (hd0) $root

chainloader +1

}

О том, как запустить Windows на компьютере с EFI с помощью GRUB, рассказано в следующем разделе.

 

Ветвление и переход к работе с другим загрузчиком

Уже упоминавшаяся выше команда GRUB chainloader позволяет путем ветвления перейти к работе с другим загрузчиком. Соответствующие команды лучше всего вставить в конфигурационный файл, оформляемый по образцу /etc/grub.d/40_custom.

Запуск загрузчика из другого раздела диска. Если вы установите на компьютере еще один загрузчик в стартовом секторе раздела, то в меню GRUB 2 можно перейти к работе с этим загрузчиком. В таком случае укажите этот раздел с помощью set root (или search) и выполните chainloader +1:

menuentry «GRUB in /dev/sdb7» {

set root=(hd1,7)

search —no-floppy —fs-uuid —set 12345678…

chainloader +1

}

В данном случае у меня возникли проблемы, когда я пытался ветвлением перейти в другой установленный экземпляр GRUB. Система выдавала сообщение об ошибке invalid signature (недействительная подпись). Частично справиться с этой проблемой удавалось, дополнительно указав параметр —force:

menuentry «GRUB2 in /dev/sdb7» {

set root=(hd1,7)

chainloader +1 —force

}

К сожалению, это тоже работает не всегда. Особенно сложно переходить с GRUB 2 на GRUB 0.97. В этом случае целесообразно вообще отказаться от set root и задать желаемый раздел непосредственно с помощью chainloader:

menuentry «GRUB 0.97 in /dev/sdb7» {

chainloader (hd1,7)+1 —force

}

Если в другом дистрибутиве также используется GRUB 2, то ключевое слово config — file позволяет загрузить конфигурационный файл GRUB grub.cfg этого дистрибутива:

menuentry «GRUB in /dev/sdb7» {

set root=(hd1,7)

search —no-floppy —fs-uuid —set 12345678…

configfile /boot/grub/grub.cfg

}

Ветвление для работы с загрузчиком EFI. На компьютерах с EFI можно прямо из GRUB запускать другой загрузчик EFI. В приведенных далее примерах предполагается, что раздел с EFI является первым разделом первого жесткого диска; если это не так, то нужно соответствующим образом откорректировать set root.

menuentry » Запуск загрузчика Windows (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/Microsoft/Boot/bootmgfw.efi

}

menuentry «Запуск загрузчика Fedora (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/redhat/grub.efi

}

menuentry «Запуск загрузчика Ubuntu (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/ubuntu/grubx64.efi

}

Чтобы быстро узнать, какой загрузчик EFI вам подходит, выполните следующую команду:

root# find /boot/efi -name ‘*.efi’ | sort

/boot/efi/EFI/Boot/bootx64.efi

/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi

/boot/efi/EFI/Microsoft/Boot/bootmgr.efi

/boot/efi/EFI/Microsoft/Boot/memtest.efi

/boot/efi/EFI/redhat/grub.efi

/boot/efi/EFI/ubuntu/grubx64.efi

Индивидуальная конфигурация

GRUB 2 заранее сконфигурирован так, чтобы любые операционные системы можно было запускать на компьютере с BIOS. Стандартная конфигурация функционирует хорошо и, как правило, в большинстве случаев ее достаточно. Этот подраздел ориентирован только на тех пользователей Linux, которые хотят настроить GRUB под себя.

Деактивация os-probe. Если на жестком диске компьютера много разделов, то выполнение сценария 30_os-probe длится достаточно долго. Если данный сценарий вам не нужен (например, для запуска других дистрибутивов вы предпочитаете использовать самостоятельно определенные записи в меню GRUB), то добавьте в /etc/default/grub строку GRUB_DISABLE_OS_PROBER=true.

Фоновая графика. В качестве фона меню GRUB можно задать картинку. GRUB может работать с форматами JPG, PNG и TGA. Код, необходимый для интеграции фоновой картинки, в Debian и Ubuntu уже содержится в сценарии 05_debian_theme. Нужно всего лишь изменить три переменные и задать имя файла с вашим изображением, а также желаемые цвета для текста (рис.).

# в /etc/grub.d/05_debian_theme

WALLPAPER=»/boot/grub/myown.png»

COLOR_NORMAL=»white/black»

COLOR_HIGHLIGHT=»yellow/black»

Закрепление операционной системы по умолчанию. В файле /etc/default/grub можно закрепить номер определенной записи в меню GRUB. Операционная система, указанная под этой записью, будет запускаться автоматически. На практике пользы от этого немного. Если вы, например, хотите, чтобы по умолчанию запускалась система Windows XP, а в меню GRUB запись с Windows XP идет на десятом месте, то задайте параметр GRUB_DEFAULT=9 (отсчет начинается с нуля). Но не исключено, что после обновления ядра в меню GRUB появятся две дополнительные записи и ваша настройка станет неверной. Гораздо удобнее оставить параметр GRUB_DEFAULT=0, а желаемую запись меню GRUB разместить перед всеми остальными. Для этого лучше всего воспользоваться дополнительным сценарием в /etc/grub.d, причем имя файла должно начинаться с целого числа меньше 10. Возьмем следующие строки в качестве образца:

#!/bin/sh

exec tail -n +3 $0

# Файл /etc/grub.d/09_boot-windows-by-default

menuentry «Windows 7» {

set root=(hd0,1)

chainloader +1

}

Другая возможность заключается в том, чтобы точно задать запись в меню GRUB, например, вот так:

GRUB_DEFAULT=’Windows 7 (loader) (on /dev/sda1)’

Но такой метод целесообразен лишь при условии, что при обновлениях GRUB номер этой записи в меню не изменяется. С Windows это работает хорошо, чего не скажешь о Linux, поскольку в автоматически генерируемых записях меню указана версия ядра — а она меняется при каждом обновлении ядра.

 

Установка вручную и первая помощь при работе с компьютерами с BIOS

Как правило, GRUB 2 правильно создается при установке вашего дистрибутива Linux. В дальнейшем вы, возможно, будете вносить изменения в конфигурацию GRUB, то есть в файл grub.cfg , но установкой GRUB как таковой заниматься больше не придется.

Этот подраздел о компьютерах с BIOS и следующий подобный подраздел о компьютерах с EFI актуален лишь в случаях, когда вы по каким-то причинам устанавливаете GRUB вручную либо когда хотите исправить поврежденную установку GRUB (например, если другая операционная система перезаписывает информацию в MBR).

Установка вручную с помощью grub-install. Сценарий grub-install (в Fedora и openSUSE он называется grub2-install ) устанавливает загрузчик в первый сектор указанного жесткого или твердотельного диска (то есть в MBR и во все остальные сектора, которые находятся на диске до начала первого раздела). Как правило, в качестве единственного параметра вы передаете в данном случае имя устройства, соответствующее носителю данных. При этом допускается запись как по принципу Linux (например, /dev/sda ), так и по принципу GRUB (например, (hd0) ):

root# grub-install /dev/sda

Теоретически возможно выполнить установку и в стартовом секторе сегмента (это записывалось бы как grub-install/dev/sda3 или (hd0,3)), но этого не рекомендуется делать, если вы не работаете с GRUB 0.97. В стартовом секторе слишком мало места для внедрения всего кода GRUB, а при применении блок-списков система считается нестабильной. (Блок-список содержит информацию о том, в каких блоках с данными на жестком/твердотельном диске находится следующая часть GRUB-кода.) Если эти аргументы кажутся вам неубедительными, можете произвести принудительную установку с помощью параметра —force.

Особый случай: ПК с BIOS и GPT. Linux можно инсталлировать на жестком/ твердотельном диске, на котором находится таблица секционирования GUID, а сам диск установлен на компьютере с BIOS. (Что касается Windows, то эта операционная система, напротив, может быть установлена только на ПК с EFI, если на жестком или твердотельном диске содержится таблица секционирования GPT.) Так или иначе, в подобном особом случае в учебнике по GRUB рекомендуется выделять для установки GRUB собственный раздел размером около 1 Мбайт, снабженный флагом bios_grub. Этот раздел предусмотрен только для установки BIOS-совместимых загрузчиков.

Такой раздел bios_grub не нуждается в форматировании. До сих пор Fedora 16 остается единственным дистрибутивом, самостоятельно создающим такой раздел при автоматическом сегментировании жестких дисков с таблицей GPT (в версии 17 Fedora снова отказалась от того, чтобы автоматически создавать GPT на пустых жестких дисках).

Разумеется, раздел диска можно создать и вручную. Для этого поставьте флаг bios_grub с parted, заменив n на желаемый номер раздела:

root# parted /dev/sda set n bios_grub on

Когда при установке GRUB обнаруживает наличие раздела bios_grub , этот загрузчик, как обычно, устанавливает первую часть кода GRUB в главную загрузочную запись, а остальной код — в раздел, помеченный как bios_grub . Применять именно такой подход при установке GRUB на жестких дисках с GPT, конечно, необязательно. Но этот подход считается достаточно надежным вариантом, особенно если на компьютере установлены другие операционные системы (Windows). Но у этого метода есть и свой недостаток: если на компьютере существует такой раздел, то на машине становится невозможно параллельно инсталлировать несколько экземпляров GRUB-2, поскольку при каждой новой установке GRUB содержимое раздела bios_grub перезаписывается. Более подробно о GRUB и GPT рассказано здесь: http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html и http://www.wensley.org.uk/gpt .

Ремонт GRUB с помощью «живого диска» (на компьютерах с BIOS). Если при установке GRUB что-то пошло не так либо загрузчик был стерт при установке другой операционной системы, то GRUB нужно переустановить с «живого диска», на котором находятся инструменты с актуальными инструментами GRUB 2. После запуска системы перейдите в режим администратора (root) (в Ubuntu — sudo -s), подключите системный раздел, а также активные каталоги /dev, /proc и /sys к файловой системе, а потом выполните chroot. Возможно, после этого понадобится также подключить загрузочный раздел к новой root-файловой системе. Затем обновите конфигурацию GRUB и запишите GRUB в желаемое место с помощью grub[2]-install (обычно для этого используется главная загрузочная запись первого жесткого диска). Как обычно, в следующих командах необходимо заменить /dev/sdan вашими номерами устройств.

root# mkdir /syspart

root# mount /dev/sda2 /syspart (Системный раздел)

root# mount -o bind /dev /syspart/dev

root# mount -o bind /proc /syspart/proc

root# mount -o bind /sys /syspart/sys

root# chroot /syspart

root# mount /dev/sda1 /boot/efi (Раздел с EFI)

root# update-grub

root# grub-install

root# exit

Вручную вводим команды GRUB для запуска Linux

Если GRUB удается запустить, но после выбора Linux из меню GRUB саму операционную систему запустить не получается, то можно, нажав клавишу C, перейти в меню GRUB в интерактивный режим, а затем выполнить следующие команды:

grub> set root=(hd0,1)

grub> linux /vmlinuz root=/dev/sda1

grub> initrd /initrd.img

grub> boot

Вместо (hd0,1) и /dev/sda1 задайте имя вашего системного раздела с Linux. В большинстве дистрибутивов файлы /vmlinuz и /initrd.img указывают на новейшую версию ядра и файла Initrd. Эти файлы находятся в каталоге /boot. Если в вашем случае это не так, нужно точно задать местоположение ядра и Initrd-файла. GRUB обеспечивает при этом функцию автозавершения, оно выполняется клавишей Tab.

 

Изменение загрузочных записей и настроек EFI вручную (efibootmgr)

Откуда EFI известно, какие операционные системы установлены на компьютере и, соответственно, какие загрузочные записи должны отображаться? На материнских платах с EFI эта информация хранится в энергонезависимой памяти (NVRAM).

Всякий раз при установке новой операционной системы, после создания *.efi -файла в EFI-разделе, соответствующая запись сохраняется в энергонезависимой памяти.

В Linux можно считывать и изменять EFI-данные, сохраненные таким образом, с помощью команды efibootmgr. Данная команда предполагает, что в системе загружен модуль ядра efivars. Если это не так, то выполните modprobe efivars. Обратите внимание: модуль efivars можно применять лишь в том случае, когда Linux был загружен в режиме EFI (а не в режиме BIOS!). Для восстановительных работ используйте по возможности «живой диск» с Linux, который можно запускать в EFI-режиме.

Если команда efibootmgr выполняется без дополнительных параметров, то она выводит список загрузочных записей EFI, а также некоторых других параметров загрузчика EFI. Следующий вывод, например, означает, что на компьютере установлены Ubuntu, Fedora и Windows в EFI-режиме. При перезапуске по истечении времени ожидания (около одной секунды) автоматически запустится Ubuntu (BootCurrent). В период ожидания можно отобразить меню EFI с помощью сочетания клавиш, специфичного для конкретной материнской платы (на моем компьютере требуется нажать F8).

root# efibootmgr

BootCurrent: 0000

Timeout: 1 seconds

BootOrder: 0000,0005,0003,0001,0002

Boot0000* ubuntu

Boot0001* Hard Drive

Boot0002* CD/DVD-drive

Boot0003* Windows Boot Manager

Boot0005* Fedora

Если вы хотите после перезапуска один раз запустить Fedora, отметьте загрузочную запись этого дистрибутива параметром -n:

root# efibootmgr -n 5

Если же порядок загрузки потребуется изменить надолго, то сопроводите желаемую загрузочную запись параметром -o:

root# efibootmgr -o 5

Следующая команда создает новую загрузочную запись EFI. Путь задается относительно раздела с EFI (то есть /boot/efi), при этом должен использоваться разделитель каталогов \. Удваивать символ \ необходимо потому, что оболочка интерпретирует одиночный слэш \ как указатель специальных символов. С помощью параметра -L можно указать имя, которое должно отображаться в меню EFI.

root# efibootmgr -c -l \\EFI\\test\\abc.efi -L abc

Разумеется, загрузочные записи можно снова удалять. Для этого нужно указать номер записи с параметром -b:

root# efibootmgr -b 6 -dw

Другие параметры команды efibootmgr описаны на странице справки man по этой команде.

 

——

Теперь установка Grub не вызовет у вас проблем. Мы разобрали не только как установить Grub2 в MBR но и в EFI. Кроме того, всю приведенную здесь информацию вы можете использовать для восстановления Grub. Так вы будете лучше понимать что происходит во время восстановления.



Поделись статьей с друзьями


47 просмотров




Оставить свой комментарий



Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: