Текст книги "Внутреннее устройство Linux"
Автор книги: Брайан Уорд
Жанры:
Программное обеспечение
,сообщить о нарушении
Текущая страница: 9 (всего у книги 30 страниц) [доступный отрывок для чтения: 11 страниц]
5. Как происходит загрузка ядра Linux
Теперь вы знаете о физической и логической структуре системы Linux, что такое ядро и как работать с процессами. В этой главе вы получите информацию о том, как ядро начинает работу или загружается, иначе говоря, как ядро перемещается в память до того момента, где начинается первый пользовательский процесс.
Упрощенная схема процесса загрузки выглядит так.
1. Система BIOS или прошивка загрузки загружают и запускают загрузчик системы.
2. Загрузчик системы отыскивает образ ядра на диске, загружает его в память и запускает.
3. Ядро выполняет инициализацию устройств и их драйверов.
4. Ядро монтирует корневую файловую систему.
5. Ядро запускает команду init с идентификатором процесса 1. Эта точка является началом пространства пользователя.
6. Команда init приводит в действие остальные системные процессы.
7. В определенный момент команда init запускает процесс, позволяющий вам войти в систему. Обычно это происходит в конце или незадолго до окончания загрузки системы.
В этой главе рассмотрены шаги с первого по четвертый, основное внимание уделено загрузчикам ядра и системы. В главе 6 продолжается рассказ о загрузке пространства пользователя.
Способность определять каждую стадию процесса загрузки окажется неоценимой, когда вам придется устранять проблемы при загрузке, а также поможет понять систему в целом. Однако принятый по умолчанию режим загрузки во многих версиях Linux зачастую затрудняет (если не делает невозможным) идентификацию некоторых первых этапов, и вам, вероятно, удастся посмотреть на них только по их завершении, после входа в систему.
5.1. Сообщения при запуске
Традиционные системы Unix во время загрузки выводят множество диагностических сообщений, чтобы проинформировать вас о ходе загрузки. Эти сообщения исходят сначала от ядра, а затем от процессов и процедур инициализации, которые запускает команда init. Однако такие сообщения не очень привлекательны и последовательны, а в некоторых случаях они даже не слишком информативны. В большинстве современных версий Linux стараются скрыть их с помощью экранов загрузки, заполнителя и параметров загрузки. Кроме того, улучшенные аппаратные средства привели к тому, что ядро загружается намного быстрее, чем раньше, поэтому сообщения проскакивают настолько быстро, что было бы трудно уяснить, что происходит.
Существуют два способа увидеть сообщения ядра о загрузке и оперативной диагностике. Вы можете:
• заглянуть в системный журнал ядра. Обычно он находится в файле /var/log/kern.log, но в зависимости от конфигурации вашей системы может также оказаться вместе с другими системными журналами в каталоге /var/log/messages или где-либо еще;
• воспользоваться командой dmesg, не забыв при этом указать параметр less, поскольку результаты займут намного больше места, чем один дисплей. Команда dmesg использует циклический буфер ядра, размер которого ограничен, но в большинстве новых версий ядра буфер достаточно велик, чтобы хранить сообщения в течение длительного времени.
Вот пример того, что можно ожидать в результате работы команды dmesg:
$ dmesg
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.2.0-67-generic-pae (buildd@toyol) (gcc version 4.
6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #101-Ubuntu SMP Tue Jul 15 18:04:54 UTC 2014
(Ubuntu 3.2.0-67.101-generic-pae 3.2.60)
[ 0.000000] KERNEL supported cpus:
–snip—
[ 2.986148] sr0: scsi3-mmc drive: 24x/8x writer dvd-ram cd/rw xa/form2 cdda tray
[ 2.986153] cdrom: Uniform CD-ROM driver Revision: 3.20
[ 2.986316] sr 1:0:0:0: Attached scsi CD-ROM sr0
[ 2.986416] sr 1:0:0:0: Attached scsi generic sg1 type 5
[ 3.007862] sda: sda1 sda2 < sda5 >
[ 3.008658] sd 0:0:0:0: [sda] Attached SCSI disk
–snip—
Процедура запуска пространства пользователя часто оставляет сообщения после запуска ядра. Эти сообщения будет сложнее увидеть и просмотреть, поскольку в большинстве систем они не находятся в одном файле журнала. Сценарии запуска, как правило, выводят собщения в консоль, а по завершении процесса загрузки они стираются. Тем не менее это не является проблемой, поскольку каждый сценарий обычно ведет собственный журнал. Определенные версии команды init, например Upstart и systemd, способны перехватывать диагностические сообщения процесса загрузки и обычной работы, которые в обычном случае отображаются в консоли.
5.2. Инициализация ядра и параметры загрузки
Во время запуска ядро системы Linux выполняет инициализацию в следующем порядке.
1. Проверка центрального процессора.
2. Проверка оперативной памяти.
3. Обнаружение шины устройств.
4. Обнаружение устройств.
5. Настройка вспомогательной подсистемы ядра (сеть и т. п.).
6. Монтирование корневой файловой системы.
7. Запуск пространства пользователя.
Первые шаги не слишком примечательны, но зато, когда ядро добирается до устройств, возникает вопрос о зависимостях. Например, драйверы дисковых устройств могут зависеть от поддержки шины и подсистемы SCSI.
Далее в ходе инициализации ядро должно смонтировать корневую файловую систему до запуска команды init. Как правило, вам не придется беспокоиться об этих процессах, исключая тот случай, когда необходимые компоненты являются загружаемыми модулями ядра, а не частями основного ядра. На некоторых компьютерах вам может потребоваться загрузить такие модули ядра до монтирования реальной корневой файловой системы. Мы рассмотрим этот вопрос и обходные пути его решения в разделе 6.8.
На момент написания книги ядро не выводит каких-либо специальных сообщений, когда оно готово к запуску первого пользовательского процесса. Тем не менее приведенные ниже сообщения об управлении памятью являются верным признаком того, что скоро вступит в игру пространство пользователя, так как именно сейчас ядро защищает собственную память от процессов из пространства пользователя:
Freeing unused kernel memory: 740k freed
Write protecting the kernel text: 5820k
Write protecting the kernel read-only data: 2376k
NX-protecting the kernel data: 4420k
Вы можете также увидеть сообщение о том, что в данный момент происходит монтирование корневой файловой системы.
примечание
Можете спокойно переходить к главе 6, чтобы узнать об особенностях запуска пространства пользователя и команде init, которую ядро запускает в качестве первого процесса. Далее в данной главе приводятся подробности запуска ядра.
5.3. Параметры ядра
При запуске ядра Linux загрузчик передает ему набор текстовых параметров ядра, которые говорят ядру о том, как оно должно быть запущено. Эти параметры описывают различные варианты действий, такие как, например, величина выполняемого ядром диагностического вывода и варианты настроек, зависящие от драйверов устройств.
Параметры ядра при загрузке вашей системы можно увидеть в файле /proc/cmdline:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.2.0-67-generic-pae root=UUID=70ccd6e7-6ae6-44f6-
812c-51aab8036d29 ro quiet splash vt.handoff=7
Эти параметры являются либо простыми однословными флагами, вроде ro и quiet, либо парами key=value, например vt.handoff=7. Многие из этих параметров не являются существенными, например флаг splash, отвечающий за отображение экрана загрузки. Действительно важным является параметр root. Он задает местоположение корневой файловой системы, без него ядро не может отыскать команду init, а следовательно, и выполнить запуск пространства пользователя.
Корневая файловая система может быть определена как файл устройства, например так:
root=/dev/sda1
Однако в большинстве современных ПК более распространенным является применение идентификаторов UUID (см. подраздел 4.2.4):
root=UUID=70ccd6e7-6ae6-44f6-812c-51aab8036d29
Параметр ro стандартен; он указывает ядру на то, что корневую файловую систему при запуске пространства пользователя следует монтировать в режиме «только чтение». Этот режим гарантирует возможность безопасной проверки корневой файловой системы с помощью команды fsck. По окончании проверки процесс загрузки выполняет повторное монтирование корневой файловой системы в режиме «чтение-запись».
При обнаружении какого-либо непонятного параметра ядро Linux сохраняет его, а затем передает команде init при выполнении запуска пространства пользователя. Например, если вы добавите к параметрам ядра флаг -s, оно передаст его команде init, и это будет означать, что запуск следует выполнить в режиме одиночного пользователя.
Теперь рассмотрим механику того, как загрузчики системы запускают ядро.
5.4. Загрузчики системы
В начале процесса загрузки, до запуска ядра и команды init, загрузчик системы запускает ядро. Задача загрузчика системы выглядит просто: он загружает ядро в память, а затем запускает его с определенными параметрами. Рассмотрим вопросы, на которые должен ответить загрузчик системы.
• Где находится ядро?
• Какие параметры ядра должны быть переданы ему при запуске?
Ответ (как правило) такой: ядро и его параметры обычно располагаются в корневой файловой системе. Кажется, что параметры ядра отыскать несложно, но ведь само ядро еще не запущено, поэтому оно не может «пройтись» по файловой системе в поисках необходимых файлов. Кроме того, драйверы устройств, которые ядро обычно использует для доступа к диску, также недоступны. Можно увидеть в этом нечто вроде проблемы «яйцо или курица».
Начнем разбираться с драйверами. На персональных компьютерах загрузчики системы используют систему BIOS или интерфейс UEFI, чтобы получить доступ к дискам. Практически все дисковые аппаратные средства снабжаются прошивками, которые позволяют системе BIOS получать доступ к присоединенным устройствам хранения с помощью блочной адресации LBA (Linear Block Addressing). Хотя производительность этого режима невысока, он все же позволяет получить универсальный доступ к дискам. Загрузчики системы часто являются единственными программами, которые используют систему BIOS для доступа к дискам; ядро применяет собственные высокопроизводительные драйверы.
Вопрос о файловой системе более сложен. Многие современные загрузчики системы способны читать таблицы разделов, а также имеют встроенную поддержку доступа к файловым системам в режиме «только чтение». Следовательно, они могут находить и читать файлы. Такая возможность значительно облегчает динамическую конфигурацию и улучшение загрузчика системы. Загрузчики системы Linux не всегда обладали этой возможностью; без нее настройка загрузчика была намного более сложной.
5.4.1. Задачи загрузчика системы
Основные функции загрузчика системы Linux содержат следующие возможности:
• выбор среди нескольких ядер;
• переключение между наборами параметров ядра;
• разрешение ручного переопределения и редактирование имен образов ядра и его параметров пользователем (например, чтобы войти в режим одиночного пользователя);
• поддержка загрузки других операционных систем.
Загрузчики системы стали более сложными по сравнению с начальными вариантами ядра Linux. Появились такие функции, как история и меню, однако главной потребностью всегда остается гибкость образа ядра и выбор его параметров. Интересным фактом является то, что некоторые возможности были ослаблены. Поскольку теперь вы можете, например, выполнять аварийную или восстановительную загрузку частично или полностью с USB-накопителя, вам, вероятно, не придется беспокоиться о том, чтобы вручную вводить параметры ядра или переходить в режим одиночного пользователя. К тому же современные загрузчики предлагают больше возможностей, чем когда-либо ранее. Это может быть чрезвычайно удобно, если вы разрабатываете пользовательское ядро или желаете настроить параметры.
5.4.2. Общий обзор загрузчиков системы
Приведем перечень основных загрузчиков системы, которые могут вам встретиться, в порядке их популярности:
• GRUB – почти универсальный стандарт для систем Linux;
• LILO – один из первых загрузчиков системы Linux. Версия ELILO предназначена для интерфейса UEFI;
• SYSLINUX – может быть настроен для запуска в множестве различных типов файловых систем;
• LOADLIN – загружает ядро из оболочки MS-DOS;
• efilinux – загрузчик с интерфейсом UEFI, призванный быть моделью и эталоном для других загрузчиков с интерфейсом UEFI;
• coreboot (ранее назывался LinuxBIOS) – высокопроизводительная замена системы BIOS в персональных компьютерах. Может содержать ядро;
• Linux Kernel EFISTUB – плагин ядра для загрузки напрямую из системного раздела ESP (EFI/UEFI System Partition), имеющегося в современных системах.
В этой книге речь пойдет исключительно о загрузчике GRUB. Основная причина для использования других загрузчиков системы заключается либо в более простом их конфигурировании, по сравнению с GRUB, либо в быстроте работы.
Чтобы ввести имя ядра и параметры, вам сначала необходимо узнать, как попасть в строку приглашения загрузчика. К сожалению, иногда это бывает сложно выяснить, поскольку различные версии Linux по-разному настраивают поведение загрузчика и его отображение.
В следующих разделах вы узнаете о том, как оказаться в строке приглашения загрузчика, чтобы ввести имя ядра и параметры. Когда вы освоитесь с этим, вы изучите настройку и установку загрузчика системы.
5.5. Первое знакомство с загрузчиком GRUB
Аббревиатура GRUB означает Grand Unified Boot Loader (Большой унифицированный загрузчик системы). Мы рассмотрим версию GRUB 2; есть также более старая версия GRUB Legacy, использование которой постепенно сходит на нет.
Одной из наиболее важных возможностей загрузчика GRUB является навигация по файловой системе, которая позволяет намного проще выбирать ядро и настраивать параметры. Лучший способ увидеть это в действии и узнать в общих чертах о загрузчике GRUB – заглянуть в его меню. Интерфейс снабжен простой навигацией, однако есть большая вероятность того, что вы никогда его раньше не видели. Системы Linux изо всех сил стараются скрыть от вас свой загрузчик.
Чтобы получить доступ к меню загрузчика GRUB, нажмите клавишу Shift и удерживайте ее, когда появится начальный экран системы BIOS или прошивки. В противном случае процесс настройки загрузчика может не сделать паузы перед загрузкой ядра. На рис. 5.1 показано меню загрузчика GRUB. Нажмите клавишу Esc, чтобы временно отключить автоматическое истечение времени ожидания загрузки после появления меню.
Рис. 5.1. Меню загрузчика GRUB
Попробуйте следующим образом исследовать загрузчик системы.
1. Перезагрузите или включите компьютер с Linux.
2. Удерживайте нажатой клавишу Shift при появлении начального экрана системы BIOS или самопроверки прошивки и/или экрана загрузки, чтобы попасть в меню загрузчика GRUB.
3. Нажмите клавишу E, чтобы увидеть команды конфигурирования загрузчика для принятого по умолчанию варианта загрузки. Должно появиться что-то вроде показанного на рис. 5.2.
Этот экран говорит нам о том, что для данной конфигурации корневой каталог установлен с помощью идентификатора UUID, образ ядра называется /boot/vmlinuz-3.2.0-31-generic-pae, а параметры ядра содержат ro, quiet и splash. Начальной файловой системой оперативной памяти является /boot/initrd.img-3.2.0-31-generic-pae. Если вы раньше никогда не встречали подобного рода конфигурацию, она может показаться немного запутанной. Почему несколько раз встречается параметр root, причем в разных вариантах? Почему здесь указан параметр insmod? Разве эта функция ядра не запускается обычно менеджером udevd?
Двойные записи оправданны, поскольку загрузчик GRUB в действительности не использует ядро Linux – он его запускает. Конфигурация, которую вы видите, полностью состоит из внутренних команд загрузчика GRUB. Этот загрузчик представляет собой совершенно особый мир.
Рис. 5.2. Редактор конфигурации загрузчика GRUB
Путаница возникает вследствие того, что загрузчик GRUB заимствует терминологию из нескольких источников. У него есть собственное «ядро» и собственная команда insmod, чтобы динамически загружать модули GRUB, совершенно независимо от ядра Linux. Многие команды загрузчика GRUB похожи на команды оболочки Unix; есть даже команда ls для отображения списка файлов.
Больше всего путаницы возникает из-за применения слова root. Чтобы прояснить ситуацию, следуйте одному простому правилу при отыскании корневой файловой системы: только корневой параметр ядра будет корневой файловой системой при загрузке.
В приведенной конфигурации загрузчика GRUB такой корневой параметр располагается где-то после имени образа в команде linux. Любая другая ссылка на root в этой конфигурации относится к корневому каталогу загрузчика GRUB, который существует только внутри загрузчика. «Корень» загрузчика GRUB – это файловая система, в которой загрузчик отыскивает файлы образов ядра и файловой системы оперативной памяти.
На рис. 5.2 корневой каталог загрузчика GRUB сначала настроен на специфичное для загрузчика устройство (hd0, msdos1). В следующей команде загрузчик отыскивает конкретный идентификатор UUID для раздела. Если такой идентификатор находится, то корневой каталог загрузчика настраивается на этот раздел.
В завершение первый аргумент команды linux (/boot/vmlinuz-...) задает расположение файла образа ядра Linux. Загрузчик GRUB загружает этот файл из своего корневого каталога. Команда initrd действует подобным образом, отвечая за файл для начальной файловой системы оперативной памяти.
Эту конфигурацию можно редактировать внутри загрузчика GRUB; обычно это самый простой способ временно исправить ошибку при загрузке. Чтобы полностью устранить такую ошибку, вам потребуется изменить конфигурацию (см. подраздел 5.5.2), но сейчас копнем поглубже и исследуем некоторые внутренние части загрузчика GRUB с помощью интерфейса командной строки.
5.5.1. Выявление устройств и разделов с помощью командной строки загрузчика GRUB
Как можно заметить на рис. 5.2, загрузчик GRUB обладает собственной схемой адресации устройств. Например, первый обнаруженный жесткий диск назван hd0, следующий – hd1 и т. д. Однако назначения устройств могут измениться. К счастью, загрузчик GRUB может выполнить поиск идентификаторов UUID во всех разделах, чтобы обнаружить именно тот, на котором расположено ядро, как вы только что убедились на примере команды search.
Перечисление устройств
Чтобы получить представление о том, как загрузчик GRUB ссылается на устройства в вашей системе, получите доступ к командной строке загрузчика, нажав клавишу C в меню загрузки или в редакторе конфигурации. Вы должны увидеть такое приглашение загрузчика GRUB:
grub>
Здесь можно ввести любую команду, которую вы видите в конфигурации, но для начала попробуйте диагностическую команду ls. Если не указывать аргументы, результатом работы станет перечень устройств, известных загрузчику GRUB:
grub> ls
(hd0) (hd0,msdos1) (hd0,msdos5)
В данном случае присутствует одно основное дисковое устройство, обозначенное как (hd0), а также разделы (hd0,msdos1) и (hd0,msdos5). Префикс msdos в названиях разделов говорит о том, что такой диск содержит таблицу разделов MBR; для таблицы GBT название начиналось бы с префикса gpt. Могут также встретиться более сложные комбинации с третьим идентификатором, когда карта разметки диска располагается внутри раздела; но вам, как правило, не придется об этом беспокоиться, если вы не запускаете несколько операционных систем на одном компьютере.
Чтобы получить более детальную информацию, используйте команду ls -l. Эта команда может оказаться исключительно полезной, поскольку она отображает идентификаторы UUID для разделов диска. Например, так:
grub> ls -l
Device hd0: Not a known filesystem–Total size 426743808 sectors
Partition hd0,msdos1: Filesystem type ext2 – Last modification time
2015-09-18 20:45:00 Friday, UUID 4898e145-b064-45bd-b7b4-7326b00273b7 -
Partition start at 2048–Total size 424644608 sectors
Partition hd0,msdos5: Not a known filesystem–Partition start at
424648704–Total size 2093056 sectors
Данный конкретный диск имеет файловую систему Linux ext2/3/4 в первом разделе MBR, а также сигнатуру области подкачки в разделе 5, что является довольно распространенной конфигурацией. Хотя на основе этого вывода нельзя сказать, что раздел (hd0,msdos5) является областью подкачки.
Файловая навигация
Рассмотрим навигационные возможности файловой системы загрузчика GRUB. Определите корневой каталог загрузчика с помощью команды echo (вспомните, что именно в нем загрузчик ожидает найти ядро системы):
grub> echo $root
hd0,msdos1
Чтобы использовать команду ls загрузчика GRUB для перечисления файлов и каталогов в этом корневом каталоге, следует снабдить ее после названия раздела символом косой черты:
grub> ls (hd0,msdos1)/
Запоминать и набирать полное имя корневого раздела неудобно, поэтому для экономии времени используйте переменную root:
grub> ls ($root)/
Результатом работы будет краткий перечень имен файлов и каталогов файловой системы данного раздела, например etc/, bin/ и dev/. Следует понимать, что теперь это совершенно другая функция ls загрузчика GRUB: до этого перечислялись устройства, таблицы разделов и, возможно, некоторая заголовочная информация о файловой системе. Теперь же вы на самом деле смотрите на содержимое файловых систем.
Подобным образом можно заглянуть чуть глубже в файлы и каталоги раздела. Например, чтобы исследовать каталог /boot, начните с такой команды:
grub> ls ($root)/boot
примечание
Используйте клавиши ↑ и ↓, чтобы перемещаться по истории команд загрузчика GRUB, а также клавиши ← и →, чтобы редактировать командную строку. Стандартные комбинации клавиш (Ctrl+N, Ctrl+P и т. п.) также применимы.
Можно просмотреть все установленные для загрузчика переменные с помощью команды set:
grub> set
?=0
color_highlight=black/white
color_normal=white/black
–snip—
prefix=(hd0,msdos1)/boot/grub
root=hd0,msdos1
Одной из самых важных переменных является $prefix, которая определяет файловую систему и каталог, в котором загрузчик GRUB ожидает отыскать свою конфигурацию и дополнительную поддержку. Об этом пойдет речь в следующем разделе.
По окончании работы с командной строкой загрузчика GRUB введите команду boot, чтобы загрузить текущую конфигурацию, или нажмите клавишу Esc для возврата в меню загрузчика. В любом случае загрузите систему: мы собираемся исследовать конфигурацию загрузчика GRUB, а это лучше всего делать тогда, когда система доступна полностью.
5.5.2. Конфигурация загрузчика GRUB
Конфигурационный каталог загрузчика GRUB содержит центральный файл конфигурации (grub.cfg) и многочисленные загружаемые модули с суффиксами .mod. С выходом новых версий загрузчика GRUB такие модули будут перемещены в подкаталоги, например i386-pc. Каталог, как правило, называется /boot/grub или /boot/grub2. Мы не будем напрямую изменять файл grub.cfg, вместо этого воспользуемся командой grub-mkconfig или командой grub2-mkconfig в Fedora.
Обзор файла Grub.cfg
Сначала бегло просмотрите файл grub.cfg, чтобы понять, как загрузчик GRUB инициализирует свое меню и параметры ядра. Вы увидите, что файл grub.cfg состоит из команд загрузчика GRUB, которые обычно начинаются с нескольких шагов инициализации, а затем продолжаются рядом пунктов меню для различных конфигураций ядра и загрузки. Инициализация не является сложной: это набор определений функций и команд настройки видео, вроде этих:
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=auto
load_video
insmod gfxterm
—snip—
Далее в этом файле вы должны увидеть доступные конфигурации загрузки, каждая из которых начинается с команды menuentry. Вы должны быть способны прочитать и понять данный пример, основываясь на том, что вы узнали из предыдущего раздела:
menuentry 'Ubuntu, with Linux 3.2.0-34-generic-pae' —class ubuntu —class gnu-linux —class gnu
–class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search —no-floppy —fs-uuid —set=root 70ccd6e7-6ae6-44f6-812c-51aab8036d29
linux /boot/vmlinuz-3.2.0-34-generic-pae root=UUID=70ccd6e7-6ae6-44f6-812c-51aab8036d29
ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.2.0-34-generic-pae
}
Присмотритесь к командам submenu. Если ваш файл grub.cfg содержит множество команд menuentry, большинство из них, вероятно, свернуто внутри команды submenu. В старых версиях ядра это сделано для того, чтобы они не переполняли меню загрузчика GRUB.
Создание нового файла конфигурации
Если вы желаете внести изменения в конфигурацию загрузчика GRUB, не следует редактировать файл grub.cfg напрямую, поскольку он создается автоматически и система время от времени его перезаписывает. Необходимо дополнить конфигурацию где-либо в другом месте, а затем запустить команду grub-mkconfig, чтобы создать новый файл.
Чтобы понять, как происходит создание конфигурации, посмотрите в самое начало файла grub.cfg. Там должны быть строки с комментариями, например такими:
### BEGIN /etc/grub.d/00_header ###
Продолжая осмотр, вы обнаружите, что каждый файл в каталоге /etc/grub.d является сценарием оболочки, который производит фрагмент файла grub.cfg. Да и сама команда grub-mkconfig – это сценарий оболочки, который запускает все, что находится в каталоге /etc/grub.d.
Попробуйте запустить ее самостоятельно с правами корневого пользователя. Не беспокойтесь о том, что ваша текущая конфигурация будет перезаписана: данная команда всего лишь отображает конфигурацию в стандартном выводе.
# grub-mkconfig
Как быть, если вам необходимо добавить пункты меню и другие команды в конфигурацию загрузчика GRUB? Если отвечать кратко – следует указать необходимые вам настройки в новом файле custom.cfg и поместить его в каталог с конфигурацией загрузчика, например /boot/grub/custom.cfg.
Полный ответ выглядит немного сложнее. Конфигурационный каталог /etc/grub.d предлагает вам на выбор два варианта: 40_custom и 41_custom. Первый, 40_custom, является сценарием, который вы можете редактировать самостоятельно, но это, вероятно, наименее надежно: обновление пакета удалит все внесенные вами изменения. Сценарий 41_custom проще. Это всего лишь последовательность команд, загружающих файл custom.cfg при запуске загрузчика GRUB. Имейте в виду, что, если вы выберете второй вариант, изменения не отображаются, когда вы создаете файл конфигурации.
Эти варианты для создания пользовательского файла конфигурации не исчерпывают все возможности. Дополнения вы найдете в каталоге /etc/grub.d вашей версии системы. Так, например, Ubuntu добавляет в конфигурацию загрузки параметры для проверки памяти (memtest86+).
Чтобы записать и установить вновь созданный файл конфигурации GRUB, можно записать этот файл в каталог загрузчика GRUB, указав флаг -o в команде grub-mkconfig:
# grub-mkconfig -o /boot/grub/grub.cfg
Если же вы работаете в Ubuntu, просто запустите команду install-grub. В любом случае создайте резервную копию предыдущей конфигурации, убедитесь, что установка производится в правильный каталог, и продолжайте.
Теперь мы приступаем к рассмотрению дополнительных подробностей загрузчика GRUB и загрузчиков системы. Если вы устали от загрузчиков и от ядра, можете спокойно переходить к главе 6.
5.5.3. Установка загрузчика GRUB
Установка загрузчика GRUB является более сложной по сравнению с его настройкой. К счастью, вам, как правило, не придется об этом беспокоиться, поскольку ваше ПО должно выполнить это за вас. Однако если вы пытаетесь продублировать или восстановить загружаемый диск, а также подготавливаете собственную последовательность загрузки, вам может потребоваться установить загрузчик самостоятельно.
Прежде чем продолжать чтение, загляните в подраздел 5.8.3, чтобы получить представление о том, как загружается компьютер, и определить, какой тип загрузки вы применяете: MBR или EFI. Затем соберите ПО загрузчика GRUB и определите, где будет расположен каталог загрузчика; по умолчанию используется путь /boot/grub. Нет необходимости выполнять сборку загрузчика GRUB, если ваш дистрибутив делает это за вас. Если вы займетесь этим, загляните в главу 16, чтобы узнать о том, как выполняется сборка ПО на основе исходного программного кода. Убедитесь в том, что вы собираете верный целевой объект: он различен для загрузок MBR и UEFI (имеются также различия для 32– и 64-битного вариантов EFI).
Установка загрузчика GRUB в систему
При установке загрузчика системы необходимо, чтобы вы или установщик определили следующее.
• Целевой каталог загрузчика GRUB – каким его видит работающая в данный момент система. Обычно это каталог /boot/grub, но он может быть и другим, если вы устанавливаете загрузчик GRUB на другой диск или в другую операционную систему.
• Текущее устройство для целевого диска загрузчика GRUB.
• Для загрузки UEFI – текущую точку монтирования загрузочного раздела UEFI.
Помните о том, что загрузчик GRUB является модульной системой, но для загрузки модулей он должен читать файловую систему, которая содержит каталог загрузчика GRUB. Ваша задача заключается в создании версии загрузчика GRUB, которая способна читать эту файловую систему, чтобы иметь возможность загрузки остальной части своей конфигурации (файл grub.cfg) и любых необходимых модулей. В Linux это обычно означает, что нужно собрать версию загрузчика GRUB с предварительно загруженным модулем ext2.mod. Как только у вас будет такая версия, вам потребуется лишь поместить ее в загружаемую часть диска, а остальные необходимые файлы – в каталог /boot/grub.
Загрузчик GRUB снабжен утилитой под названием grub-install (не смешивайте с командой install-grub в Ubuntu), которая выполняет за вас основную часть работы по установке файлов загрузчика GRUB и его конфигурации. Например, если ваш текущий диск расположен в /dev/sda и вы желаете установить загрузчик GRUB на этот диск с текущим каталогом /boot/grub, используйте такую команду установки загрузчика GRUB для таблицы MBR:
# grub-install /dev/sda
внимание
Неправильная установка загрузчика GRUB может нарушить последовательность загрузки вашей системы, поэтому не относитесь к этой команде легкомысленно. Если же такое произошло, прочитайте о том, как создать резервную копию MBR с помощью команды dd, сделайте резервную копию любого другого установленного в данный момент каталога GRUB и убедитесь в том, что у вас есть план аварийной загрузки.
Установка загрузчика GRUB на внешнем устройстве хранения данных
Чтобы установить загрузчик GRUB на устройстве хранения вне текущей системы, необходимо вручную указать каталог загрузчика на таком устройстве, каким его видит ваша система. Допустим, у вас есть целевое устройство /dev/sdc, а корневая/загрузочная файловая система этого устройства (например, /dev/sdc1) смонтирована в каталоге /mnt вашей нынешней системы. Это подразумевает, что при установке загрузчика GRUB ваша система будет видеть файлы загрузчика в каталоге /mnt/boot/grub. При запуске команды grub-install сообщите ей, где расположены эти файлы, таким образом: