Efi linux что это
English version of this wiki page is available on GitHub.
На GitHub’е есть английская версия этой вики-статьи (не дословный перевод, а вольное изложение идей).
Uefi-Boot — это простенький проект по организации загрузки Ubuntu на компьютерах с поддержкой UEFI без использования загрузчиков. Здесь описано полноценно работающее решение, но само собой для его реализации на другом компьютере могут потребоваться некоторые изменения. Поэтому я советую пользоваться предложенными командами и файлами вдумчиво, понимая и сверяя все действия в соответствии с вашей конфигурацией и настройками.
Как было указано в статье, UEFI поддерживает мультизагрузку (можно настроить несколько вариантов загрузки, которые выбираются из меню UEFI). Так же было отмечено, что все последние ядра в репозитории Ubuntu собираются с опцией UEFISTUB, которая позволяет загружать ядро непосредственно как EFI-приложение. В разделе Загрузка ядра из UEFI были поверхностно разобраны варианты реализации такой загрузки.
Эта статья посвящена последнему варианту (вариант монтирования ESP раздела как /boot). Здесь мы детально рассмотрим как реализовать этот вариант с автоматическим обновлением пунктов загрузки UEFI при установке новых и удалении старых ядер из системы.
Решение в деталях
Давайте разберём в деталях реализацию. Начинать мы будем из конфигурации, в которой система оказывается после установки в режиме UEFI. При этом во время установки /boot не был размещён на отдельном разделе. Если у вас /boot был вынесен в отдельный раздел, то действия будут чуточку отличаться,а после окончания настройки вы сможете удалить ваш boot-раздел — он больше не будет нужен.
Желательно, чтобы ESP-раздел был хотя бы 200–300 Мб (лучше 500), ведь в нём будут храниться наши ядра и их образы начальной инициализации (т. е. он и будет нашим /boot).
Монтируем ESP как /boot
Тут всё тривиально просто:
Вы можете не выполнять эти команды вручную, а воспользоваться скриптом, ссылка на который есть в конце статьи. Тут все действия нужно производить из под рута — будьте крайне внимательны в записи и исполнении команд.После этих изменений у вас и после перезагрузки ESP раздел будет смонтирован в /boot и в нем будут находится ядра и образы рамдисков периода начальной инициализации.
Утилита для обновления меню загрузки UEFI
Я написал эту утилиту на BASH, который практически не знаю 1) , поэтому, наверняка, задачу можно было решить и более изящно, но я приведу тот код, который у меня заработал.
Конфигурационный файл
Вписывать фиксированные опции загрузки ядра и UUID корневого раздела и прямо в код утилиты, так же, как и полагаться только на автоматическое определение корневого раздела через информацию в /etc/fstab , — не слишком верное решение, довольно часто возникают ситуации, требующие не-дефолтовых настроек. И каждый раз корректировать скрипт принципиально неправильно. Поэтому настройки можно прописать руками в конфигурационном файле утилиты. Все настройки утилиты хранятся в /etc/uefiboot.conf (файл доступен на GitHub’е) 2) .
Если корневой раздел системы расположен на подразделе BTRFS (установщик Ubuntu размещает корень на подразделе @ btrfs, даже не спрашивая у вас), то в переменную ROTFLAGS нужно указать параметр rootflags=subvol=@ , чтобы ядро смогло найти корень. Если переменная не определена то имя подтома с корнем будет взято из /etc/fstab.
Дополнительно в конфигурационный файл добавлен параметр K_SUFFIX — это необходимо для работы с подписанными ядрами из пакета linux-signed-generic, в котором поставляются ядра с подписью ключом Canonical. Подпись необходима для организации загрузки в режиме Secure boot. Если пользоваться ядрами из пакета linux-signed-generic, то в список ключей db должен быть добавлен сертификат с ключом Canonical (сертификат с этим ключом можно найти на GitHub’е). А в опцию загрузки должно добавляться ядро с суффиксом .efi.signed . Если вы организовали подпись ядер своим ключом, и решили использовать иной суффикс, то в переменную K_SUFFIX нужно будет его прописать.
Использование пакета linux-signed-generic имеет странный нюанс, ядра из этого пакета, почему то, не вызывают триггеры ядра (которые используются в нашем решении для обновления пунктов загрузки UEFI). Поэтому не удаляйте пакет с обычными ядрами (linux-generic) - его ядра при установке/удалении нужные триггеры активизируют исправно.Утилита uefiboot-update
Собственно скрипт утилиты располагается в /usr/bin/uefiboot-update, его код на GitHub’е:
Код достаточно простой:
Сначала определяем необходимые настройки. После определения необходимых параметров по умолчанию код читает конфигурационный файл, а потом параметры командной строки. Таким образом все необходимые настройки берутся из трех мест с приоритетом от дефолтов (минимальный приоритет) через конфиг, до параметров командной строки (самый высокий приоритет).
Затем определяются версии существующих в /boot ядер и версии указанные в загрузочных записях UEFI. Сравнивая эти два списка сначала удаляются те загрузочные записи для которых не осталось ядер в /boot, а затем добавляются записи для тех ядер из /boot, для которых еще не было загрузочных записей UEFI. Порядок добавления организован так, что последним добавляется ядро с самой новой версией. Это автоматически делает эту запись первой в порядке загрузки, т.е. по умолчанию, после установки нового ядра загружаться будет именно оно. Однако если вы ставите более старое ядро руками, то оно будет добавлено последним и следующая загрузка будет именно в то ядро, которое вы установили последним.
Приоритет загрузки конечно можно поменять вручную через efibootmgr, если вас не устроил тот что, сделала утилита.
В скрипте предусмотрена автоматическая инициализация переменных настройки ROOT, OPTIONS, ROOTFLAGS др., которые обеспечивает работу утилиты без дополнительных настроек в большинстве стандартных ситуаций. Но, например, для настройки загрузки системы в режиме SecureBoot нужно будет обязательно указать значение переменной K_SUFFIX в файле /etc/uefiboot.conf или в параметре командной строки -s.
Инициализация синхронизации пунктов загрузки
Самый простой способ инициализировать синхронизацию — воспользоваться теми же средствами, которыми пользуется grub для обновление своей конфигурации.
Ядро — это довольно важный компонент системы и на его установку/удаление завязано немало процессов. Для того, чтобы упростить процесс взаимодействия с процессом изменения версий ядер были предусмотрены триггеры ядра — это полная аналогия скриптов DEB-пакета: пред/постинсталляция и пред/постудаление, но лежат они в соответствующих папках /etc/kernel ,а не в deb-пакете ядра. Таким образом, любое приложение, которому надо прореагировать на появление нового или удаление старого ядра могут сделать символьные ссылки на свои утилиты из соответствующих каталогов или просто разместить там свои скрипты (собственно именно так и поступает grub). Скрипты эти будут автоматически вызываться при наступлении событий связанных установкой или удалением ядер.
Нас будут интересовать каталоги /etc/kernel/postinst.d и /etc/kernel/postrm.d, именно в них мы создадим символьные ссылки на нашу утилиту.
Теперь пункты загрузки UEFI будут автоматически обновляться после установки нового ядра или после удаления одного из ранее установленных. А если изменений в версиях ядер и их количестве не было, то утилита ничего не будет менять.
Подчистим систему
Т. к. мы настроили все для загрузки без GRUB/Shim, то необходимо вычистить все, что связано с этими загрузчиками из системы (при обновлении GRUB будет создавать свою запись в пунктах меню UEFI):
Но оказывается, этого не всегда достаточно. Любое ядро в репозитории Ubuntu имеет grub в зависимостях (зависимость типа рекомендованные — recommends) и вот, в некоторых случаях, 3) grub пытается установится вместе с ядром (причем ставится почему-то grub-pc). Чтобы этого не происходило, нужно apt дать четкую и постоянную инструкцию не ставить рекомендованные.
Сделать это можно, записав значение APT::Install-Recommends "false"; в файл (новый) /etc/apt/apt.conf.d/zz-no-recommends :
Финальная настройка
Теперь осталось запустить утилиту обновления пунктов меню загрузки UEFI
И последний штрих - уменьшение или вовсе обнуление тайм-аута меню загрузки UEFI (обычно, значение по умолчанию для этого тайм-аута 5-10 секунд, столько нам совсем не нужно
Автоматизированная установка и настройка
На GitHub’е есть установочно-настроечный скрипт, который выполняет все необходимые подготовительные операции (перемонтирование ESP в /boot), копирует все файлы на нужные места, а также создает нужные ссылки и удаляет загрузчики. Однако я не советую исполнять его бездумно — стоит проверить, что команды соответствуют конфигурации вашей системы.
Плюсы полученного решения
Из процесса загрузки исключены все загрузчики - ядро ОС загружается непосредственно из UEFI. Это приводит к не слишком значительному, но, вместе с тем, заметному убыстрению процесса загрузки (обычно экономия - 0.5 - 1.5 секунды). Как и при использовании GRUB/Shim нет никакой необходимости следить за обновлениями ядер - при установке нового ядра система автоматически будет загружать его при следующей загрузке.Минусы такого решения
Описав подробно решение я не могу не упомянуть о некоторых сложностях с которыми можно столкнутся. Ниже перечислены «тяжелые» ситуации, с которыми вам, скорее всего, и не придется столкнуться, но не упомянуть о них — совершенно не допустимо.
Пункты загрузки UEFI доступны из меню самого UEFI, и тут у разных производителей могут быть свои реализации этого меню. Попадаются и такие, которые вообще ничего не показывают или не дают выбора. Это не так критично, если у вас первым пунктом правильно прописана загрузка единственной ОС на вашем компьютере, но может стать проблемой, если вы используете несколько ОС или вам, по какой-то причине, нужно загрузится в UFIShell или просто загрузится с более старым ядром (после неудачной установки обновлений, например). Есть ещё производители, которые жёстко прописывают один единственный пункт загрузки в UEFI (как ни странно — это ссылка на загрузчик Windows). На таком оборудовании описанное решение можно будет реализовать только с значительными изменениями. В частности из-за такого ограничения нет возможности прописать несколько вариантов загрузки для нескольких версий ядра. Некоторые прошивки UEFI имеют в меню своей конфигурации пункт сбросить настройки, и при этом сбрасываются все пункты меню загрузки (как часть настроек). Пользователь может воспользоваться сбросом для сброса неправильных настроек в других пунктах настроек UEFI, а в результате получит не загружающуюся машину. Особо стоит упомянуть про VirtualBox, он при закрытии виртуальной машины просто сбрасывает пункты загрузки и приходится загружать систему вручную через UEFIShell. Для VirtualBox есть решение: необходимо добавить строку fs0:\EFI\ubuntu\grubx64.efi (или аналогичную) в файл startup.nsh в корне EFI раздела.Анализ ситуации показал, что и в этом случае виновата кривизна прошивки UEFI - она не смогла распознать кривую запись переменных в nvram. По стандарту, любая кривизна в NVRAM должна восприниматься как сигнал к обнулению NVRAM до factory default. Но моя прошивка не отловила глюки в записях и не обнулила NVRAM с нарушенной внутренней структурой. Справедливости ради надо заметить, что я умудрился отловить крайне маловероятную ситуацию сбоя именно в момент записи в NVRAM, которая, к тому же, наложилась на кривость в реализации UEFI.
Нужно отметить, что большинство неприятностей с UEFI, возникают от кривых реализаций UEFI. И эти кривости, так или иначе, но вылезают боком для любых ОС или загрузчиков, использующих UEFI.Восстановление сброшенных или искаженных настроек пунктов загрузки UEFI
Если есть возможность загрузиться в UEFIShell
грузимся в UEFIShell (либо через консоль настройки UEFI, либо через пункт меню загрузки) набираем буквы vml и жмем TAB пока в строке ввода не появится нужное (последнее) ядро, допустим это будет vmlinuz-3.19.0-23-generic вводите пробел и начинаете набирать initr и снова жмете TAB пока не появится полное имя соотвествующего нашему ядру образа рамдиска. В нашем примере это должно быть initrd.img-3.19.0-23-generic после этого стрелочками переводим курсов перед initrd.img-3.19.0-23-generic и вписываем: root=/dev/sda2 ro quiet initrd=Вместо /dev/sda2 - пропишите раздел где у вас корневая ФС. По окончании этих манипуляций у вас будет строка такого вида:
fs0:\> vmlinuz-3.19.0-23-generic root=/dev/sda2 ro quiet initrd=initrd.img-3.19.0-23-generic
Жмем Enter и ждем когда загрузится Ubuntu, после чего идем в терминал и выполняем
Все. Пункты меню UEFI восстановлены.
Если возможности загрузиться в UEFIShell нет
Потребуется LiveUSB/CD с образом Ubuntu который может загружаться EFI-режиме.
устанавливаем утилиту efibootmgr (пакет утилиты есть на диске, поэтому даже соединение с Internet настраивать не нужно) Прописываем верный пункт загрузки через утилиту efibootmgr командой типа этой:Версии ядер пропишите свои, как и укажите свой раздел корневой ФC вместо /dev/sda2. После перезагрузки идем в терминал и выполняем
Всё. Пункты меню UEFI восстановлены.
Копилефт
Предложенный набор файлов и решений распространяется под GPL . Берите, пользуйтесь, изменяйте под себя.
Компьютеры с каждым днем развиваются все больше и это позволяет им работать еще лучше и надежнее. Многие уже, наверное, слышали о BIOS, а если уже устанавливали Linux, то, наверное, знаете что это такое и уже имели опыт настройки. Вы, скорее всего, заметили, что BIOS трудно настраивать и использовать. Это программное обеспечение низкого уровня, и оно остается неизменным на протяжении двух последних десятилетий. Из-за этого сейчас технологию BIOS можно считать устаревшей и нуждающейся в замене.
Новая система - UEFI со временем вытеснит BIOS, но, как и большинство новых технологий ее реализация движется очень медленно и долго. Пользователи упускают важность операционной системы низкого уровня, именно этот недостаток пытается закрыть UEFI. В этой статье мы рассмотрим чем отличается uefi от bios, попытаемся выяснить что лучше bios или uefi, а также определим что лучше использовать.
Что такое BIOS?
BIOS расшифровывается как Basic Input / Output System или по-русски - базовая система ввода и вывода. Это программное обеспечение низкого уровня, которое обеспечивает прослойку между аппаратными средствами компьютера и операционной системой.
BIOS запускается как только вы включаете компьютер, выполняется проверка и тестирование оборудования, а затем уже загрузка загрузчика операционной системы.
Плата BIOS встроена в каждую материнскую плату и, кроме подготовки оборудования BIOS, может пригодиться еще в ряде нескольких случаев. Поскольку BIOS не зависит от операционной системы, вы можете получить доступ к ее настройкам без установленной ОС. Кроме того, можно настроить различные параметры оборудования - частоту процессора и памяти, рабочее напряжение, задержку и так далее. Это позволяет выполнить тонкую настройку компьютера и получить максимальную производительность.
Вообще говоря, это все, чем занимается BIOS, здесь есть только псевдографический интерфейс, управление с помощью клавиш и только настройки оборудования. Загрузчик BIOS берет из главной загрузочной записи - MBR, и загрузчик может быть только один. Естественно, никакой речи о выборе загрузчика и быть не может.
Что такое UEFI?
UEFI, или Unified Extensible Firmware Interface, основан на EFI - разработке компании Intel, которая призвана заменить BIOS. Разработан стандарт EFI в течение нескольких последних лет и уже начал набирать большую популярность, поскольку производители начинают использовать его на своих устройствах вместо устаревшей технологии BIOS.
UEFI поддерживает все функции, которые были реализованы в BIOS, а также многие новые функции, что и делает ее лучшим решением для использования на современных компьютерах.
Здесь, кроме инициализации оборудования, чтения настроек из энергонезависимой памяти и запуска загрузчика поддерживается еще большое количество функций. Можно сказать, что это операционная система низкого уровня. Это главное отличие bios от uefi. Здесь поддержка драйверов оборудования, а отсюда поддержка мыши и графической карты, также есть полноценная консоль с поддержкой запуска приложений, сети и работы с оборудованием. Вплоть до того, что вы можете не только копировать и перемещать файлы в поддерживаемых файловых системах, но и проигрывать диски или музыку, если это поддерживается программами EFI.
Несмотря на значительное преимущество по сравнению с BIOS, в UEFI есть некоторые ограничения на 32 битных процессорах. 64 битные процессоры полностью поддерживают UEFI, а вот 32 битные не поддерживают часть функций и операционная система должна эмулировать для них среду BIOS, чтобы нормально работать.
Определить UEFI или BIOS используется на вашем компьютере очень просто вы можете просто посмотреть на интерфейс настройки компьютера перед загрузкой. Я думаю вы уже тут все поймете.
Какая технология лучше?
Старая технология BIOS была промышленным стандартом на протяжении последних двадцати лет и за это время он не получил большого количества изменений из-за таких ограничений, как только один мегабайт памяти, 16-битных инструкций и таблицы разметки диска MBR, которая поддерживает жесткие диски максимум 2 Тб и не более чем на четыре раздела. Двадцать лет назад этого было вполне достаточно, но при современных стандартах такие ограничения слишком жесткие.
Кроме того, гибкость UEFI необходима для технологий доступных уже сейчас или тех, которые станут доступны в будущем. Ограничение BIOS в один мегабайт создавало очень большое количество проблем разработчикам оборудования, но теперь места для загрузки драйверов устройств точно хватит.
Благодаря модульной структуре UEFI, новые функции могут быть добавлены позже и тем самым расширить существующую систему. Это делает такую систему более перспективной и простой в использовании.
Использовать новые системы UEFI намного проще, у них есть полноценный графический интерфейс с указателем мыши и интуитивно понятным меню. Вы получаете возможность все очень просто настроить. Кроме того, производители материнских плат могут разрабатывать различные программные модули UEFI, которые позволят легко тестировать различное оборудование.
В целом, если сравнивать UEFI и BIOS, то первая побеждает благодаря своей модульности, расширяемости, а также независимым драйверам и простоте использования. Пройдет некоторое время, пока пользователи смогут выбрать BIOS или UEFI и новая технология медленно заменит старую. Все больше и больше производителей применяют UEFI на своих платах и компьютерах и все реже используются 32-битные процессоры. Но, как и со всеми другими достижениями в области компьютерной техники, для перехода на UEFI потребуется много времени. Вы теперь знаете чем отличается uefi от bios и сможете сделать правильный выбор при покупке нового устройства.
Задумывались ли вы о том, как происходит загрузка операционной системы? Как компьютер узнаёт о том, где находится операционная система? Давайте рассмотрим процесс запуска Linux от включения компьютера и до входа в систему.
Практически каждый этап загрузки может идти несколькими путями. Например, вы узнаете о том, чем отличается BIOS от UEFI, что делает GRUB и чем его можно заменить, почему одного лишь ядра Linux недостаточно для функционирования операционной системы.
Процесс загрузки Linux
Процесс загрузки операционной системы можно разбить на 5 этапов, причём первые три зависят от материнской платы. Ниже вы можете видеть схематичное изображение этапов загрузки Linux.
Как видите, до того, как загрузится ядро, процесс имеет существенные отличия. И всё же любая загрузка системы начинается с включения компьютера.
Первый этап: включение компьютера
Запуск компьютера с BIOS и UEFI отличается. Первый BIOS появился в середине 70-х годов, а MBR стали использовать с 1983 года. Стоит ли говорить о том, что для современного компьютера предпочтительнее использовать UEFI и GPT. А теперь перейдём непосредственно к рассмотрению первого этапа загрузки.
BIOS + MBR
BIOS – это базовая система ввода-вывода. Она представляет из себя набор программ для взаимодействия с устройствами компьютера. BIOS хранится на микросхеме EEPROM материнской платы. При каждом запуске компьютера плата автоматически отправляет код процессору на исполнение. Далее BIOS проводит проверку оборудования (тест POST) и обращается к жёсткому диску или твердотельному накопителю. От него ему нужны первые 512 байт, именно там находится главная загрузочная запись (MBR). Ниже вы можете видеть структуру MBR.
Если подпись MBR равна 55AAh, то система начинает выполнять код первичного загрузчика. В случае с Linux, MBR передаёт управление основному загрузчику GRUB. Он располагается сразу после MBR. До начала первого раздела на накопителе есть не менее 32 килобайт свободного места (современные системы оставляют 1 Мбайт), этого достаточно для того, чтобы разместить GRUB.
Таблица разделов в MBR имеет крайне скромный размер, есть место всего на 4 позиции. В связи с этим нельзя разметить накопители объёмом более 2 терабайт. К тому же она использует устаревшую адресацию, с цилиндрами, головками и секторами жёсткого диска.
На компьютерах с UEFI поддержка MBR никуда не делась, но для этого вам придётся активировать BIOS или CSM mode, в зависимости от производителя материнской платы. Это нужно для совместимости со старыми операционными системами.
UEFI + GPT
Интерфейс расширяемой прошивки EFI (позднее унифицированный UEFI) – это разработка Intel. Он был создан потому, что BIOS имеет ряд недостатков. К ним можно причислить работу в 16-битном режиме, последовательную проверку устройств и загрузку только через MBR.
Физически поменялось не многое, разве что FLASH-накопитель для хранения прошивки стал больше. Зато программная часть претерпела значительные изменения. UEFI работает в 32- и 64-битном режиме, поддерживает таблицу разделов GPT, может иметь красивый графический интерфейс, оболочку EFI Shell и управление с помощью мыши. К тому же опрос оборудования происходит гораздо быстрее.
Оглавление таблицы GPT располагается в первом логическом блоке (LBA 1). В GPT перешли к использованию логических блоков, к тому же их понимают современные жёсткие диски и SSD. Нулевой блок по-прежнему отдаётся под MBR, но в этот раз он выполняет защитную функцию, чтобы старые операционные системы не переписали GPT.
Каждой записи таблицы даётся 128 байт, что позволяет разметить накопители практически неограниченного объёма. Да и самих записей может быть больше 100.
В конце таблицы находится контрольная сумма. Если будет обнаружено несоответствие, то система попробует обратиться к резервной копии таблицы, расположенной в последних блоках накопителя.
После проверки устройств, UEFI может самостоятельно обратиться к таблице разделов GPT. В ней её интересует EFI раздел. Обычно под него выделяется 520-540 Мбайт. Такой размер связан с тем, что ранние версии EFI могли выдавать ошибку при работе с меньшим объёмом. Но Windows уже отходит от этой традиции и ограничивается 100 Мбайтами.
В разделе EFI обязательно должна быть папка EFI/BOOT, в ней находится загрузчик по умолчанию. Но никто не мешает добавить свой загрузчик, например, для Ubuntu и Windows.
К минусам UEFI можно отнести Secure Boot. Загрузчик без подписи просто не сможет быть использован. Эти меры направлены в первую очередь на компьютеры с Windows, чтобы не допустить использование старых систем на новых омпьютерах. Для Linux в этом случае приходится искать подписанный загрузчик или отключать Secure Boot, если имеется такая возможность.
Ещё одним способом загрузки является PXE – загрузка через сетевой интерфейс. Первичный загрузчик находится в ПЗУ сетевой карты. С его помощью карта через протокол TFTP получает основной загрузчик.
Этот способ загрузки будет работать как с BIOS, так и с UEFI. Он полезен для работы с тонкими клиентами и для установки операционной системы по сети.
Второй этап: загрузчик
Загрузчик подготавливает систему к загрузке ядра операционной системы. Например, для Linux он может передавать параметры запуска ядра. В зависимости от того, что используется, BIOS или UEFI, выбор загрузчика отличается.
Как можете видеть, в Ubuntu есть как .efi загрузчик, так и GRUB.
GRUB – это основной загрузчик для большинства дистрибутивов Linux. Он примечателен тем, что позволяет не только запустить ядро Linux или другой операционной системы, но ещё и сам по себе способен выполнять некоторые операции. Он имеет собственную командную строку и в теории позволяет устранить собственные ошибки. GRUB существует в версиях как для BIOS, так и UEFI. Но последний не имеет цифровой подписи для Secure Boot.
Syslinux Project
Дальше выполняется загрузка ядра Linux. Ядро лежит в папке boot под названием vmlinuz. «vm» в начале говорит о том, что ядро будет размещено в виртуальной памяти. А «z» на конце означает то, что ядро запаковано в архив и требует распаковку. Это возможно благодаря тому, что в начале архива находится исполняемый код.
В процессе запуска ядра настраивается оборудование, запускается менеджер памяти, планировщик задач и многое другое, необходимое для функционирования операционной системы.
Ядро Linux монолитное, драйверы устройств хранятся прямо в нём. Однако, это утверждение верно лишь отчасти. Большая часть периферийных устройств не имеет драйверов в ядре Linux. Вместо этого в оперативной памяти распаковывается ещё один файл во временной файловой системе – initrd.img.
После запуска всех необходимых служб временный раздел удаляется. Но это происходит не всегда. Например, он остаётся после запуска в режиме liveCD и при использовании тонкого клиента.
Четвертый этап: запуск пользовательских служб
Ядро загрузилось и работает. Но этого недостаточно для работы с операционной системой. Вы по-прежнему не можете взаимодействовать с ней на прикладном уровне. Для того, чтобы можно было что-то сделать в Linux, управление получает подсистема инициализации и управления службами. Обычно этот процесс имеет идентификационный номер PID-1.
Systemd
Systemd – это самая популярная система инициализации. Она хорошо распараллеливает задачи и практически вытеснила другие решения. Запускаются десятки служб. Например, такие, которые управляют звуковыми устройствами, мультимедийными клавишами, запускают графическую оболочку. Большая часть файлов подсистемы представлена конфигурационными файлами, ссылающимися на конкретные утилиты и сервисы, но есть и собственные службы.
Стоит пару слов уделить D-Bus. Эта служба позволяет процессам взаимодействовать друг с другом. Например, через неё служба управления звуковыми устройствами узнаёт о том, что была нажата клавиша увеличения громкости, распознанная другой службой. Такой подход позволяет создавать простые, но эффективные службы.
А ещё в комплект утилит Systemd входит супервизор. Он следит за тем, чтобы все критически важные службы работали. Если он заметит, что какой-то службы не хватает, то сразу же запустит её снова. Его также применяют для поддержания работы серверов.
Sysvinit, OpenRC и другие
Sysvinit считается устаревшей системой. Она следует принципам, заложенным ещё в 80-х годах для операционной системы Unix System V. Запуск служб происходит последовательно, а настройка производится с помощью скриптов, что несколько проще, чем у systemd.
Для дистрибутива Gentoo разрабатывается система инициализации OpenRC. Её можно назвать осовремененной sysvinit. Но важно понимать, что рядовому пользователю система инициализации безразлична, она интересует лишь тех, кто добавляет свои службы и утилиты в дистрибутив Linux.
О других системах, вроде Runit, Daemontools или S6, справедливо предыдущее утверждение, к тому же их доля совсем невелика. Хотя они тоже имеют свои особенности. После этого процесс загрузки Linux практически завершен.
Пятый этап: экранный менеджер и окружение рабочего стола
Нельзя списывать со счетов и дисплейный менеджер. Это по сути первая программа с графическим интерфейсом. Она отвечает за вход в систему. Хотя и до её запуска проводились некоторые работы, был запущен сервер X11 для обращения к видеокарте и обработки команд управления c мыши и клавиатуры.
После ввода пароля запускается оконный менеджер с библиотеками отображения (обычно GTK3 или Qt) и непосредственно само окружение рабочего стола. Эти службы отвечают за то, чтобы вы могли перемещать окна, перетаскивать файлы, иметь несколько рабочих столов и тому подобное. Всё, загрузка Linux выполнена и операционная система полностью готова к использованию!
Выводы
В этой статье мы рассмотрели процесс загрузки Linux поверхностно, но этого достаточно, чтобы иметь общее представление об этом сложном многоступенчатом процессе. Несмотря на то, что каждый элемент выполняет свою функцию, после подготовки он передаёт управление следующему. Это позволяет автоматизировать загрузку и в целом упростить её.
Что же касается выбора между BIOS и UEFI, то последний однозначно выигрывает. Как минимум потому, что он практически не тратит время на проверку оборудования, а также позволяет практически сразу передать управление ядру Linux.
Итак, вы указали в настройках BIOS загрузку с CD/DVD или с USB, и при загрузке с Ubuntu LiveCD получили вместо фиолетового экрана с пиктограммами клавиатуры и человечка вот такой экран:
Ничего страшного, так бывает 1) . В этом случае нужно учесть ряд моментов, о которых и будет рассказано в этом разделе. Кстати, наличие фиолетового экрана при загрузке совсем не означает, что у вас нет UEFI, просто с чёрным экраном все особенности UEFI проявляются наиболее ярко. Так что, в любом случае прочитать этот раздел будет очень полезно. А пока смело выбирайте верхнюю строчку «Try Ubuntu without installing» и нажимайте Enter . После непродолжительного ожидания вы попадёте на рабочий стол Ubuntu, и, пока ждёте загрузки Ubuntu, поговорим об UEFI.
Введение в UEFI и GPT
Вы, наверное, помните, что одна из задач этого руководства — научить читателя эффективно и непринуждённо использовать все основные инструменты системы. Но для этого нужно копнуть глубже и рассказать об аппаратной начинке вашего компьютера, и как эта начинка работает с системой. Поэтому опять теория, без неё не обойтись.
Что происходит при включении компьютера? Прежде всего компьютер должен корректно инициализировать сам себя, то есть своё собственное оборудование, и передать управление загрузчику операционной системы. Занимается этим процессом «Extensible Firmware Interface» (EFI) (Расширяемый интерфейс прошивки) — интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования. Раньше за это отвечал BIOS, а теперь EFI, который после очередного изменения стандарта стал называться «Unified Extensible Firmware Interface» (UEFI) — это название и будет использоваться в дальнейшем. Надо заметить, что UEFI, как более современный интерфейс, полностью поддерживает все функции BIOS, обратное, к сожалению, не верно. В настройках режим поддержки BIOS чаще всего называется «Legacy» («наследуемый» или «традиционный» по-английски) или просто «UEFI Disabled» («UEFI отключён», как не трудно догадаться). Сейчас, однако, нас интересует включённый режим UEFI.
Итак, при включении компьютера UEFI начинает инициализировать оборудование и находит какое-то блочное устройство, скажем, жёсткий диск. Вы, наверное, знаете, что целиком жёсткий диск практически никогда не используется — диск обязательно разбивается на разделы, в том числе и для удобства в обращении. А вот разбить его на разделы можно, на сегодняшний день, двумя стандартными способами: с помощью MBR или GPT. В чём их отличие?
MBR («Master Boot Record» — основная загрузочная запись) использует 32-битные идентификаторы для разделов 2) , которые размещаются в очень маленьком кусочке пространства (64 байта) в самом начале диска (в конце первого сектора диска). Из-за такого маленького объёма поддерживаются только четыре первичных раздела (подробнее об этом можно узнать в этой статье). Поскольку используется 32-битная адресация, то каждый раздел может быть не более 2,2 ТБ. Кроме того, загрузочная запись не имеет никакой запасной MBR, так что если приложение перезапишет основную загрузочную запись, то вся информация о разделах будет потеряна.
GPT («GUID Partition table» — таблица разделов GUID) использует уже 64-битные идентификаторы для разделов, поэтому кусочек пространства, в котором сохраняется информация о разделах, уже больше чем 512 байт, кроме того, не существует ограничения на количество разделов. Заметьте, ограничение на размер раздела в этом случае почти 9,4 ЗБ (да-да, вы всё прочитали правильно — зеттабайт, единичка с двадцатью одним нулём!). А в конце диска имеется копия GPT, которая может использоваться для восстановления повреждённой основной таблицы разделов в начале диска 3) .
Так вот, когда связь между оборудованием и операционной системой осуществляется через включённый режим UEFI (а не Legacy BIOS), использование GPT для разбивки разделов является практически обязательным, иначе наверняка возникнут проблемы совместимости с MBR 4) .
Ну вот, с блочными устройствами, кажется, разобрались, UEFI всё корректно инициализировал, и теперь он должен найти загрузчик операционной системы и передать управление ему. В первом приближении это выглядит так: поскольку UEFI преемник BIOS, то он выполняет поиск загрузчика в строгом соответствии с установленными правилами. Если он находит загрузчик операционной системы, который не поддерживает UEFI, то активируется режим эмуляции BIOS (именно так, даже если Legacy BIOS явно не указан). И начинается всё сначала, с той лишь разницей, что теперь уже эмулированный BIOS проверяет состояние оборудования и загружает микропрограммное обеспечение — простые драйверы для отдельных аппаратных компонентов. После этого эмулированный BIOS опять выполняет поиск загрузчика ОС и активирует его. Тот, в свою очередь, загружает операционную систему или выводит на экран список доступных ОС 5) .
А в случае UEFI всё происходит несколько иначе. Дело в том, что UEFI имеет собственный загрузчик операционных систем с интегрированными менеджерами запуска установленных ОС. С этой целью для него — для загрузчика UEFI — на диске должен быть создан небольшой раздел (100–250 МБ), который называется «Extensible Firmware Interface System Partition» (системный раздел расширяемого интерфейса прошивки, ESP). Кроме указанного размера, раздел должен быть отформатирован в файловой системе FAT32 6) и быть загрузочным. На нем находятся драйверы аппаратных компонентов, к которым может получать доступ запущенная операционная система. И в этом случае загрузка происходит прямо с этого раздела, что намного быстрее.
Итак, подведём некоторые итоги: чтобы по полной задействовать функционал UEFI, диск должен быть с GPT, и на нём должен быть специальный раздел ESP 7) . Обратите внимание на фразу «чтобы по полной задействовать функционал» — существует масса способов установки Ubuntu на систему с «урезанным» в той или иной степени UEFI, и все они зависят от наличия или отсутствия предустановленных операционных систем на вашем компьютере. Например, вы хотите оставить предустановленную Windows. Какую Windows — «семёрку» или новомодную 8.1? А может быть у вас, не дай бог, установлена «ператская винда», активированная с MBR, и не желающая запускаться с GPT, и вы, тем не менее, хотите дальше её изучать? Кроме того, очень много зависит от разрядности операционных систем — без плясок с бубном невозможно 32-битную систему заставить работать с UEFI. И таких примеров достаточно много. Поэтому в этом разделе пойдёт разговор только про установку Ubuntu в режиме «максимально полного» задействования возможностей UEFI, хотя даже после прочтения этого введения, вы уже сможете представлять устройство своего компьютера и, при желании, реализовать свой собственный сценарий установки.
Ну что, приступим?
Разметка диска
Прежде чем продолжить, обязательно ознакомьтесь с правилами разметки диска и устройством файловой системы в Ubuntu, иначе некоторые вещи вам могут быть не совсем понятны.Итак, вы загрузились в Ubuntu с LiveCD в режиме UEFI. Открывайте «Редактор разделов GParted» 8) , а пока поговорим об очень важных особенностях, на которые нужно обратить внимание.
Самое главное, у вас должен быть план ваших действий, поверьте — перечень шагов и порядок их выполнения достаточно обширен, так что желательно записать где-нибудь на бумажке основные пункты плана и периодически с ними сверяться. Итак, что же вам известно. Для нормальной установки Ubuntu в режиме UEFI жёсткий диск вашего компьютера должен быть правильно подготовлен, а именно:
на диске должны быть стандартные разделы: системный, подкачки, а также раздел для домашнего каталога.Кроме того, нужно определиться с операционными системами на вашем компьютере — от того, будет ли Ubuntu единственной системой, или рядом с ней будут находиться другие поддерживающие режим UEFI системы, зависит план разбивки и установки.
Начнём с ответа на второй вопрос: о наличии других операционных систем. Если на вашем компьютере уже установлены операционные системы, поддерживающие загрузку в режиме UEFI (например, Windows 8), и вы не намерены пока от них отказываться, то первые два пункта плана уже выполнены: раздел ESP наверняка уже есть, ну и диск, разумеется, с GPT. Давайте проверим, что это действительно так.
Предположим, после запуска редактора разделов GParted у вас откроется вот такое окно 9) :
Какую информацию можно получить при внимательном изучении этого окна? Во-первых, посмотрите на столбец «File System» («Файловая система»): все разделы отформатированы в ntfs , кроме одного раздела с файловой системой fat32 — это, по всей видимости, и есть раздел ESP. На диске уже установлена Windows 8 (раздел /dev/sda4 — в Windows это диск C: ) — об этом говорит метка диска (столбец «Label»). Во-вторых, на жёстком диске есть ряд служебных разделов Windows — об этом можно узнать не только по меткам ( WINRE_DRV и LRS_ESP ), но и по флагам (столбец «Flags») — все эти разделы скрыты, поскольку у них установлен флаг hidden , что намекает на специальный характер информации на них. И, наконец, присмотритесь к разделу /dev/sda5 — вы случайно не потеряли диск D: в Windows? Вот он, в целости и сохранности.
Итак, первые два пункта плана уже выполнены, а реализация третьего пункта: создание разделов для Ubuntu — достаточно подробно описана в примере использования GParted для переразбивки жёсткого диска. Напомним вкратце, что от диска с данными (в примере это /dev/sda5, или диск D: в Windows) нужно «отрезать» достаточное пространство и на его месте создать три раздела: подкачки, системный и раздел для домашнего каталога. Учтите также, что ваш диск — GPT, так что расширенного раздела, содержащего логические диски, у него нет, следовательно, при создании разделов выбирайте Primary partition («Основной раздел»).
Не производите никаких операций со служебными разделами Windows — они предназначены для нормального функционирования этой ОС. Случайное или преднамеренное изменение этих разделов гарантировано приведёт к возникновению проблем в Windows, вплоть до полной её неработоспособности.В итоге должно получиться что-то похожее на эту картинку:
Здесь показаны дополнительно созданные разделы:
/dev/sda6 — системный раздел для вашей будущей Ubuntu, в примере его размер 15 ГБ; /dev/sda8 — раздел для пользовательских данных или, другими словами, раздел для домашнего каталога /home — в примере под него выделено всё оставшееся свободное пространство. /dev/sda6 — системный раздел (раздел для «корня» системы) /dev/sda8 — раздел для пользовательских данных.Эта информация очень пригодится в дальнейшем при установке Ubuntu, поскольку из-за большого количества разделов можно очень легко запутаться и назначить не той «цифре» требуемую точку монтирования.
А что делать, если ОН 11) уже наступил вы решили отказаться от использования других операционных систем и хотите установить Ubuntu единственной системой?
Нет ничего проще, хотя и придётся постараться. Прежде всего хочется предупредить, что после этого вся, абсолютно вся информация на вашем жёстком диске будет утрачена 12) . Так что позаботьтесь о резервном копировании всех важных для вас файлов. Есть, конечно, способ избежать бэкапа, но только если общий объём сохраняемых файлов немного меньше половины общего дискового пространства. Догадаетесь как 13) ?
Тем не менее, продолжаем работать с редактором GParted. Ваша задача — удалить все разделы и на свободном месте создать нужную для Ubuntu конфигурацию диска. Для этого можно щёлкнуть правой кнопкой мыши на каждом из разделов и выбрать из выпадающего меню пункт «Delete». Но лучше поступить по-другому: найдите на панели меню редактора GParted пункт «Device» (Устройство) и выберите в меню «Create Partition Table…» (Создать таблицу разделов…). Появится предупреждение:
WARNING: This will ERASE ALL DATA on the ENTIRE DISK /dev/sda(ВНИМАНИЕ: это приведёт к УДАЛЕНИЮ ВСЕХ ДАННЫХ на ВСЁМ ДИСКЕ /dev/sda)
Не переживайте, вы же позаботились о резервных копиях? Посмотрите чуть ниже — на надпись «Advanced» (Подробности). Щёлкните мышью на треугольник слева и в меню выберите gpt :
Всё дисковое пространство станет серым. Щёлкните на нём правой кнопкой мыши и начните создавать необходимые разделы, выбрав «New» (Новый) из выпадающего меню. Первый из новых разделов — специальный раздел ESP, требуемый, как вы помните, для работы UEFI. Поскольку он форматирован в неродной для Linux файловой системе, и кроме того, должен быть загрузочным, то расположить его надо в начале дискового пространства. Определите ему размер в поле «New size (MiB)» (Новый размер в МиБ 14) ) 100 МБ 15) , а файловую систему — fat32 :
Таким же образом создайте разделы под будущие: системный (15 ГБ с файловой системой ext4 ), раздел подкачки (4 ГБ с linux-swap ) и для домашнего каталога (всё оставшееся пространство в ext4 ). Как вы помните, GParted применяет изменения не сразу, а просто ставит их в очередь на выполнение. Поэтому нажмите на зелёную галочку «Apply All Operations» (Выполнить все операции):
Да, совсем не обязательно управлять флагами загрузки на этом этапе — установщик Ubuntu выполнит всё так, как надо. А теперь внимательно читайте про то, как устанавливать Ubuntu, и, как будете готовы, продолжим.
Установка Ubuntu
После такой подготовительной работы установка Ubuntu не вызовет трудностей, особенно если вы внимательно прочитали правила установки. Просто достаньте бумажку с перечнем разделов и обратите внимание, что для специального раздела EFI (/dev/sda2 из примера о совместной установки Ubuntu и Windows) нужно точно назначить свойство загрузочного раздела EFI, а не резервной загрузочной области BIOS:
Если вы этого не сделаете, то установщик покажет вам такое уведомление:
Исправьте ошибку, а если не получится, выйдите из установщика, запустите редактор GParted и проверьте, что всё, рассказанное выше, выполнено.
Назначения для всех остальных разделов, требуемых при установке Ubuntu, очень детально описаны в этом разделе, поэтому нет особого смысла останавливаться на этом подробней.
Возможные проблемы
Иногда бывает так, что после установки одна из операционных систем, предустановленных на компьютере, не запускается. Что ж, не вдаваясь в достаточно сложные способы приведения всего в норму, отметим, что есть комплексное решение возможных проблем с загрузкой. Имя этому решению — Boot-repair 16) .
Придерживайтесь золотого правила: «Никогда не чинить то, что ещё не сломалось»!Загрузитесь в Ubuntu. Не имеет значения как вы это сделаете — Boot-Repair работает как с LiveCD, так и на установленной системе. Разумеется, если вы испытываете трудности с загрузкой только что поставленной Ubuntu, то первый способ становится единственным 17) . Для начала Boot-Repair нужно поставить на ваш компьютер, делается это с помощью терминала. Нажмите Ctrl + Alt + T и в появившемся окне наберите:
: Изменить команду ближе к выходу релиза.
Сейчас вы, конечно, скажете: «Вы что там, совсем? Столько букв — я же ничего не понимаю и обязательно ошибусь!» Разумеется, никто представленную команду 18) по буквам в терминал не вводит — просто выделите её полностью и щёлкните средней кнопкой мыши в окне терминала, или перетащите выделенный текст туда же. Нажмите Enter . Если вы находитесь в уже установленной Ubuntu, появится предложение ввести ваш пароль. Обратите внимание, при вводе пароля никакие символы не отображаются: ни точки, ни звёздочки — вообще ничего, — наверное, не нужно объяснять почему так сделано. После ввода пароля опять нажмите Enter .
Загрузите открытый ключ репозитория с программой из хранилища доверенных ключей 19) :
Обновите список приложений командой:
Установите и запустите Boot-Repair :
После непродолжительного сканирования появится основное окно Boot-Repair :
: В процессе написания.
Читайте также: