image Хорошего настроения, Хаброжители!

Познакомьтесь со всеми тонкостями работы операционной системы Linux — от системного администрирования до глубинных механизмов, обеспечивающих низкоуровневый функционал Linux. Эта книга, сразу после выхода ставшая бестселлером Amazon, даст вам базовые знания о работе с ядром Linux и принципах правильной эксплуатации компьютерных сетей, о программировании сценариев оболочки и обращении с языком С. Вы изучите вопросы защиты информации, виртуализацию и многое другое. Книга необходима системным администраторам, программистам, специалистам по защите информации, а также всем, кто изучает или хочет изучить Linux максимально быстро и эффективно.
Для кого эта книга
Интерес к устройству Linux затрагивает разные сферы жизни. Профессионалы в сфере DevOps и разработчики должны знать почти всю информацию, которая рассматривается в этой книге. Архитекторы и разработчики программного обеспечения Linux также должны знать это, чтобы пользоваться операционной системой наилучшим образом. Для исследователей и студентов, часто работающих в своих собственных системах Linux, будет полезно узнать, почему в системе все устроено именно так, а не иначе, что и рассказывается в книге. Кроме того, есть еще и любители — люди, которые просто проводят время за своими компьютерами ради развлечения, выгоды или и того и другого сразу.

Хотите знать, почему одни вещи работают, а другие нет? Вам интересно, что произойдет, если что-либо изменить? Если вы ответили «Да!», то вы, скорее всего, любитель и найдете ответы на свои вопросы в этой книге.

Загрузка ядра Linux


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

Упрощенно процесс загрузки выглядит следующим образом.
  1. BIOS или загрузочная программа компьютера загружается и запускает загрузчик.
  2. Загрузчик находит образ ядра на диске, загружает его в память и запускает.
  3. Ядро инициализирует устройства и их драйверы.
  4. Ядро монтирует корневую файловую систему.
  5. Ядро запускает программу под названием init с идентификатором процесса 1. Эта точка является началом пользовательского пространства.
  6. Программа init приводит в действие остальные системные процессы.
  7. В какой-то момент запускается процесс, позволяющий пользователю войти в систему, обычно в конце или ближе к концу процесса загрузки.

В этой главе рассматриваются первые четыре этапа, основное внимание уделяется загрузчику и ядру. В главе 6 продолжается изучение загрузки пользовательского пространства: подробно описывается программа systemd — наиболее распространенная версия программы init в системах Linux.

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

5.1. Сообщения при загрузке


Традиционные системы Unix при загрузке выдают множество диагностических сообщений, которые рассказывают вам о ее ходе. Сообщения поступают сначала от ядра, а затем от процессов и систем инициализации, которые постепенно запускаются. Однако они не последовательны, а в некоторых случаях даже не особо информативны. Кроме того, аппаратные улучшения привели к тому, что теперь ядро запускается намного быстрее, чем раньше, и сообщения мелькают так быстро, что бывает трудно понять, что происходит. В результате большинство современных дистрибутивов Linux делают все возможное, чтобы скрыть диагностику загрузки с помощью заставок и других форм заполнения экрана, чтобы отвлечь вас во время запуска системы.

Лучший вариант просмотреть диагностические сообщения о загрузке ядра и времени выполнения — открыть системный журнал ядра с помощью команды journalctl. При запуске journalctl -k отображаются сообщения текущей загрузки, а с помощью параметра -b можно просмотреть предыдущие загрузки. Мы рассмотрим этот журнал более подробно в главе 7.

Если у вас нет системы systemd, можете поискать файл журнала /var/log/kern.log или выполнить команду dmesg для просмотра сообщений в кольцевом буфере ядра.

Пример вывода команды journalctl -k:

microcode: microcode updated early to revision 0xd6, date = 2019-10-03
Linux version 4.15.0-112-generic (buildd@lcy01-amd64-027) (gcc version 7.5.0
(Ubuntu 7.5.0-3ubuntu1~18.04)) #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020
(Ubuntu 4.15.0-112.113-generic 4.15.18)
Command line: BOOT_IMAGE=/boot/vmlinuz-4.15.0-112-generic root=UUID=17f12d53-c3d7-
4ab3-943e-a0a72366c9fa ro quiet splash vt.handoff=1
KERNEL supported cpus:
--пропуск--
scsi 2:0:0:0: Direct-Access ATA KINGSTON SM2280S 01.R PQ: 0 ANSI: 5
sd 2:0:0:0: Attached scsi generic sg0 type 0
sd 2:0:0:0: [sda] 468862128 512-byte logical blocks: (240 GB/224 GiB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO
or FUA
sda: sda1 sda2 < sda5 >
sd 2:0:0:0: [sda] Attached SCSI disk
--пропуск--

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

5.2. Параметры инициализации и загрузки ядра


При запуске ядро Linux инициализируется в таком порядке:
  1. Проверка процессора.
  2. Проверка памяти.
  3. Обнаружение шины устройства.
  4. Обнаружение устройств.
  5. Настройка вспомогательной подсистемы ядра (сеть и т. п.).
  6. Монтирование корневой файловой системы.
  7. Запуск пользовательского пространства.

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

В целом, вам не нужно беспокоиться о зависимостях, за исключением того, что некоторые необходимые компоненты могут быть загружаемыми модулями ядра, а не частью основного ядра. Некоторым системам может потребоваться загрузить эти модули ядра до того, как будет смонтирована основная корневая файловая система. Мы рассмотрим эту проблему и ее решения для начальной файловой системы оперативной памяти (initrd) в разделе 6.7.

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

Freeing unused kernel memory: 2408K
Write protecting the kernel read-only data: 20480k
Freeing unused kernel memory: 2008K
Freeing unused kernel memory: 1892K

Здесь оно не только очищает часть незадействованной памяти, но и защищает собственные данные. Затем, если вы запускаете достаточно новое ядро, то увидите, что оно запускает первый процесс в пользовательском пространстве как init:

Run /init as init process
with arguments:
--пропуск-

После этого монтируется корневая файловая система и запускается systemd, отправляя несколько собственных сообщений в журнал ядра:

EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
systemd[1]: systemd 237 running in system mode. (+PAM +AUDIT +SELINUX +IMA
+APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4
+SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
systemd[1]: Detected architecture x86-64.
systemd[1]: Set hostname to <duplex>.

На этом этапе пользовательское пространство запущено.

5.3. Параметры ядра


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

Вы можете изучить параметры, переданные в активное ядро вашей системы, просмотрев файл /proc/cmdline:

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.15.0-43-generic root=UUID=17f12d53-c3d7-4ab3-943e
-a0a72366c9fa ro quiet splash vt.handoff=1

Параметры представляют собой либо простые однословные флаги, такие как ro и quiet, либо пары key=value, например vt.handoff=1. Многие параметры не особо значимы для работы системы (например, флаг splash используется для отображения экрана загрузки), однако root — один из важнейших. Он отвечает за расположение корневой файловой системы, без него ядро не сможет правильно запустить пользовательское пространство. Корневую файловую систему можно указать как файл устройства, например:

root=/dev/sda1

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

root=/dev/mapper/my-system-root
Второй — отображает UUID (см. подраздел 4.2.4):
root=UUID=17f12d53-c3d7-4ab3-943e-a0a72366c9fa

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

Параметр ro указывает ядру смонтировать корневую файловую систему в режиме «только для чтения» при запуске пользовательского пространства. Так и должно быть: режим «только для чтения» гарантирует, что утилита fsck сможет безопасно проверить корневую файловую систему, прежде чем пытаться выполнить более серьезные задачи. После проверки процесс загрузки повторно подключает корневую файловую систему в режиме чтения/записи.

Обнаружив незнакомый параметр, ядро Linux сохраняет его. Позже оно передает параметр программе init при запуске пользовательского пространства. Например, если вы добавляете параметр -s к параметрам ядра, оно передает init указание, что та должна запускаться в однопользовательском режиме.

Если вас интересуют основные параметры загрузки, на странице руководства bootparam(7) приведен их обзор. Если вам нужен конкретный параметр, проверьте файл kernel-params.txt, который поставляется с ядром Linux.

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

5.4. Загрузчики


В начале загрузки, до загрузки ядра и команды init, программа загрузчика запускает ядро. Задача загрузчика проста: ему нужно загрузить ядро в память с диска, а затем запустить его с набором определенных параметров. Однако выполнить ее сложнее, чем кажется. Чтобы понять, почему так, рассмотрим вопросы, на которые должен ответить загрузчик:

  • Где находится ядро?
  • Какие параметры ядра должны быть переданы ему при запуске?

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

Загрузчику действительно нужен драйвер для доступа к диску, но не тот, который использует ядро. В системе Windows для доступа к дискам загрузчики применяют традиционную базовую систему ввода-вывода (BIOS, Basic Input-Output System) или более новый интерфейс Unified Extensible Firmware Interface (UEFI). (Интерфейсы Extensible Firmware Interface (EFI) и UEFI подробнее рассмотрим в подразделе 5.8.2.) Современное дисковое оборудование включает встроенное ПО, позволяющее BIOS или UEFI получать доступ к подключенному оборудованию хранения данных через стандартизованный механизм адресации (Logical Block Addressing, LBA). LBA — это универсальный простой способ доступа к данным с любого диска, но его производительность довольно низка. Это не проблема, поскольку загрузчики часто являются единственными программами, которые должны использовать этот режим для доступа к диску: после запуска ядро получает доступ к собственным высокопроизводительным драйверам.

ПРИМЕЧАНИЕ
Чтобы определить, задействует ли ваша система BIOS или UEFI, запустите утилиту efibootmgr. Если вы получите список целей загрузки, значит, в системе применяется UEFI. Если же придет сообщение, что переменные EFI не поддерживаются, — применяется BIOS. Кроме того, можете проверить, есть ли в вашей системе файл /sys/firmware/efi. Если это так, она использует интерфейс UEFI.

Как только доступ к необработанным данным диска разрешен, загрузчик должен выполнить работу по поиску нужных данных в файловой системе. Большинство распространенных загрузчиков могут считывать таблицы разделов и имеют встроенную поддержку доступа к файловым системам только для чтения. Таким образом, они могут находить и считывать файлы, необходимые для загрузки ядра в память. Эта возможность значительно упрощает динамическую настройку и усовершенствование загрузчика. Загрузчики Linux не всегда имели такую возможность, а без нее настроить загрузчик сложнее.

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

5.4.1. Задачи загрузчика


Основная функция загрузчика Linux включает в себя возможность выполнять следующие задачи:
  • выбирать одно из нескольких ядер;
  • переключаться между наборами параметров ядра;
  • разрешить пользователю вручную переопределять и редактировать имена и параметры образов ядра (например, для входа в однопользовательский режим);
  • обеспечить поддержку загрузки других операционных систем.

За время, прошедшее с момента создания ядра Linux, загрузчики стали более эффективными, появились новые функции, например история командной строки и системы меню, но основной задачей всегда была гибкость в выборе образа ядра и параметров. (Удивительно, но необходимость в некоторых задачах действительно снизилась. Например, поскольку вы можете выполнить аварийную или восстановительную загрузку с USB-накопителя, не нужно беспокоиться о ручном вводе параметров ядра или переходе в однопользовательский режим.) Современные загрузчики обеспечивают большую мощность, чем когда-либо, что может быть особенно удобно, если вы создаете собственные ядра или хотите настроить параметры ядра.

5.4.2. Обзор загрузчиков


Вот основные загрузчики, которые вы можете встретить в системах Unix:
  • GRUB. Почти универсальный загрузчик для систем Linux с версиями BIOS/MBR и UEFI.
  • LILO. Один из первых загрузчиков Linux. ELILO — версия UEFI.
  • SYSLINUX. Может быть настроен для запуска из множества файловых систем.
  • LOADLIN. Загружает ядро из MS-DOS.
  • systemd-boot. Простой менеджер загрузки UEFI.
  • coreboot (ранее LinuxBIOS). Высокопроизводительная замена BIOS для персональных компьютеров, которая может содержать ядро.
  • Linux Kernel EFISTUB. Плагин ядра для загрузки ядра непосредственно из системного раздела EFI/UEFI (ESP).
  • efilinux. Загрузчик UEFI, предназначенный для применения в качестве модели и эталона для других загрузчиков UEFI.

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

Чтобы изучить информацию о загрузчике, перейдите в приглашение загрузки и введите имя ядра и параметры. Однако для этого нужно знать, как попасть в приглашение загрузки или меню. К сожалению, иногда это сложно найти, потому что дистрибутивы Linux сильно видоизменяют поведение и внешний вид загрузчика. Бывает, что, просто наблюдая за процессом загрузки, невозможно определить, какой именно загрузчик используется дистрибутивом.

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

5.5. Введение в загрузчик GRUB


GRUB расшифровывается как Grand Unified Boot Loader — главный унифицированный загрузчик. Мы рассмотрим версию GRUB 2, но существует также устаревшая версия под названием GRUB Legacy, которая применяется все реже.

Одной из наиболее важных возможностей GRUB является навигация по файловой системе, которая позволяет легко выбирать образ ядра и его параметры. Лучший способ увидеть это в действии и узнать о загрузчике GRUB в целом — заглянуть в его меню. Интерфейс прост в навигации, но есть большая вероятность, что ранее вы никогда его не видели.
Чтобы получить доступ к меню GRUB, нажмите и удерживайте клавишу Shift при первом появлении экрана запуска BIOS или ESC, если в вашей системе есть UEFI. В противном случае конфигурация загрузчика может не приостанавливаться перед загрузкой ядра. На рис. 5.1 показано меню GRUB.

image

Выполните следующие действия, чтобы изучить загрузчик:
  1. Перезагрузите или включите свою систему Linux.
  2. Удерживайте нажатой клавишу Shift во время загрузки BIOS или Esc на экране загрузки, чтобы открыть меню GRUB. (Иногда заставка загрузки экрана не отображается, поэтому нужно угадать, когда нажимать кнопку.)
  3. Нажмите клавишу e, чтобы просмотреть команды конфигурации загрузчика для параметра загрузки по умолчанию. Появится экран, как на рис. 5.2 (прокрутите страницу вниз, чтобы увидеть все детали)

image

Данный экран сообщает нам, что для этой конфигурации корневой каталог задан с идентификатором UUID, образ ядра — это /boot/vmlinuz-4.15.0-45-generic и параметры ядра включают ro, quiet и splash. Начальная файловая система оперативной памяти — это /boot/initrd.img-4.15.0-45-generic. Но если вы никогда раньше не видели подобной конфигурации, она может вас несколько сбить с толку. Почему существует несколько ссылок на root и почему они разные? Почему здесь указан параметр insmod? Если же вы встречали ее раньше, то, возможно, помните, что это функция ядра Linux, обычно запускаемая udevd.

Дубли в выводе обусловлены тем, что GRUB не использует ядро Linux (помните, что его задача — это именно запустить ядро). Конфигурация, которую вы видите, полностью состоит из функций и команд GRUB, она существует в собственном отдельном мире. Путаница частично связана с тем фактом, что GRUB заимствует терминологию из многих источников. GRUB имеет собственное «ядро» и собственную команду insmod для динамической загрузки модулей GRUB, полностью независимую от ядра Linux. Многие команды GRUB похожи на команды оболочки Unix, есть даже команда ls для перечисления файлов.

ПРИМЕЧАНИЕ
Существует модуль GRUB для LVM, необходимый для загрузки систем, в которых ядро находится на логическом томе. Вы можете увидеть это и в своей системе.

Безусловно, наибольшая путаница возникает из-за использования GRUB слова root. Обычно root применяется для определения корневой файловой системы вашей системы. В конфигурации GRUB это параметр ядра, расположенный после имени образа команды linux.

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

На рис. 5.2 корень GRUB сначала устанавливается на устройство, специфичное для GRUB (hd0,msdos1), значение по умолчанию для этой конфигурации ❶. В следующей команде GRUB выполняет поиск определенного UUID для раздела ❷. Если он найдет UUID, то установит корень GRUB в данный раздел.

Чтобы завершить процесс, первым аргументом команды linux (/boot/vmlinuz-...) должно стать расположение файла образа ядра Linux ❸. GRUB загружает этот файл из корневого каталога GRUB. Аналогично работает команда initrd, указывающая файл для описанной в главе 6 начальной файловой системы оперативной памяти ❹.

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

5.5.1. Изучение устройств и разделов с помощью командной строки GRUB


Как показано на рис. 5.2, GRUB имеет собственную схему адресации устройств. Например, первый найденный жесткий диск называется hd0, за ним следует hd1 и т. д. Присвоение имен устройствам может быть изменено, но, к счастью, GRUB может выполнить поиск UUID во всех разделах, чтобы найти тот, в котором находится ядро, с помощью команды search, как вы только что видели на рис. 5.2.

Перечисление устройств


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

grub>

Здесь можно ввести любую команду, отображенную в конфигурации, но для начала попробуйте выполнить диагностическую команду ls. Без аргументов вывод представляет собой список устройств, известных GRUB:

grub> ls
(hd0) (hd0,msdos1)

В этом случае имеются одно основное дисковое устройство, обозначаемое (hd0), и один раздел (hd0,msdos1). Если бы на диске был раздел подкачки, он также отображался бы, например как (hd0,msdos5). Префикс msdos в названиях разделов сообщает, что диск содержит таблицу разделов MBR; префикс будет начинаться с gpt для GPT таблицы в системах UEFI. (Существуют еще более глубокие комбинации с третьим идентификатором, когда карта разметки диска BSD находится внутри раздела, но обычно он не требуется, если вы не задействуете несколько операционных систем на одной машине.)

Для вывода более подробной информации используйте команду ls -l. Она может быть особенно полезна, поскольку отображает любые идентификаторы UUID разделов диска, например:

grub> ls -l
Device hd0: No known filesystem detected — Sector size 512B - Total size
32009856KiB
Partition hd0,msdos1: Filesystem type ext* — Last modification time
2019-02-14 19:11:28 Thursday, UUID 8b92610e-1db7-4ba3-ac2f-
30ee24b39ed0 - Partition start at 1024Kib - Total size 32008192KiB

Этот конкретный диск имеет файловую систему Linux ext2/ext3/ext4 на первом разделе MBR. Системы, применяющие раздел подкачки, покажут другой раздел, но вы не сможете определить его тип по выводу.

Перемещение по файлам


Теперь рассмотрим возможности навигации по файловой системе GRUB. Определите корень GRUB с помощью команды echo (напомним, что именно здесь GRUB ищет ядро):

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 и т. д.) тоже сработают.

Вы можете просмотреть все текущие установленные переменные GRUB с помощью команды set:

grub> set
?=0
color_highlight=black/white
color_normal=white/black
--пропуск--
prefix=(hd0,msdos1)/boot/grub
root=hd0,msdos1

Одной из наиболее важных переменных является $prefix — файловая система и каталог, в которых GRUB ищет необходимую конфигурацию и вспомогательную поддержку. Далее мы обсудим конфигурацию GRUB.

Закончив изучать интерфейс командной строки GRUB, нажмите клавишу Esc, чтобы вернуться в меню GRUB. В качестве альтернативы, если установили всю необходимую конфигурацию для загрузки (включая переменные linux и, возможно, initrd), можете ввести команду boot для загрузки этой конфигурации. В любом случае загрузите свою систему. Мы собираемся изучить конфигурацию GRUB, и делать это лучше всего, когда у вас есть полноценная и доступная система.

5.5.2. Конфигурация GRUB


Каталог конфигурации GRUB — это обычно /boot/grub или /boot/grub2. Он содержит центральный файл конфигурации grub.cfg, каталог для конкретной архитектуры, например i386-pc, содержащий загружаемые модули с суффиксом .mod, и несколько других элементов, таких как шрифты и информация о локализации. Мы не будем изменять grub.cfg напрямую — вместо этого используем команду grub-mkconfig (или grub2-mkconfig в Fedora).

Файл конфигурации grub.cfg


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

if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
--пропуск—

ПРИМЕЧАНИЕ
Многие переменные, такие как $font, происходят из вызова load_env в начале файла grub.cfg.

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

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os
$menuentry_id_option 'gnulinux-simple-8b92610e-1db7-4ba3-ac2f-30ee24b39ed0' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
search --no-floppy --fs-uuid --set=root 8b92610e-1db7-4ba3-ac2f-
30ee24b39ed0
linux /boot/vmlinuz-4.15.0-45-generic root=UUID=8b92610e-1db7-4ba3-ac2f-
30ee24b39ed0 ro quiet splash $vt_handoff
initrd /boot/initrd.img-4.15.0-45-generic
}

Проверьте файл grub.cfg на наличие команд submenu, содержащих несколько команд 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 не запускает эти сценарии во время загрузки — мы запускаем их в пользовательском пространстве для создания файла grub.cfg, который запускает сам GRUB.

Попробуйте выполнить настройку от имени суперпользователя. Не беспокойтесь о перезаписи своей текущей конфигурации. Сама по себе эта команда просто отображает конфигурацию на стандартный вывод:

# grub-mkconfig

Что делать, если нужно добавить пункты меню и другие команды в конфигурацию GRUB? Если кратко, то вы должны поместить свои настройки в новый файл custom.cfg в каталоге конфигурации GRUB (обычно /boot/grub/custom.cfg).

А если развернуто, то все немного сложнее. Каталог конфигурации /etc/grub.d предоставляет вам два варианта сценария: 40_custom и 41_custom. Первый, 40_custom, — это сценарий, который вы можете редактировать самостоятельно, но он наименее стабилен: обновление пакета, скорее всего, уничтожит все внесенные вами изменения. Сценарий 41_custom проще — это просто серия команд, которые загружают файл custom.cfg при запуске GRUB. Если вы выберете этот вариант, ваши изменения не будут отображаться при создании файла конфигурации, потому что GRUB выполняет всю работу во время загрузки.

ПРИМЕЧАНИЕ
Числа перед именами файлов влияют на порядок обработки: файлы с меньшими числами занимают первые места в файле конфигурации.

Оба варианта пользовательских файлов конфигурации не особенно обширны, вы можете добавлять собственные сценарии для создания данных конфигурации. В каталоге /etc/grub.d вы можете найти дополнительные настройки, относящиеся к конкретному дистрибутиву. Например, Ubuntu добавляет в конфигурацию загрузки параметры проверки памяти (memtest86+).

Чтобы записать и установить недавно созданный файл конфигурации GRUB, внесите в свой каталог GRUB новую конфигурацию с параметром -o в команду grub-mkconfig, как в примере:

# grub-mkconfig -o /boot/grub/grub.cfg

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

Теперь перейдем к техническим деталям работы GRUB и загрузчиков. Если вы хотите пропустить информацию о загрузчиках и ядре, открывайте сразу главу 6.

Об авторе
Брайан Уорд работает с операционной системой Linux с 1993 года. Кроме этой, он написал книги The Linux Kernel HOWTO, The Book of VMware и The Linux Problem Solver.
О научных редакторах
Жорди Гутьеррес Эрмосо — профессиональный разработчик и пользователь GNU/Linux с почти двадцатилетним опытом работы, внесший вклад в развитие GNU Octave и Mercurial. В разное время он работал с криптографией, медицинской визуализацией и в сфере экологии — везде на Linux. Когда Жорди не сидит за компьютером, то занимается плаванием, математикой и вязанием.

Петрос Кутупис в настоящее время старший инженер по производительности программного обеспечения в компании HPE (ранее Cray Inc.) в подразделении Lustre High Performance File System. Он создатель RapidDisk Project (www.rapiddisk.org) и занимается его сопровождением. Петрос более десяти лет работает в индустрии хранения данных и помог внедрить многие современные технологии.

Более подробно с книгой можно ознакомиться на сайте издательства:
» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Linux

Комментарии (0)