Linux boot from file

6 шагов загрузки Linux на пальцах

Нажмите кнопку включения питания на вашем системнике, и спустя несколько секунд вы увидите окно входа в систему.

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

Я предлагаю вам познакомиться со следующими уровнями типичной загрузки Linux:

1. BIOS

2. MBR

3. GRUB

#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
initrd /boot/initrd-2.6.18-194.el5PAE.img

4. Ядро или Kernel

5. Init

6. Уровень выполнения программ (Runlevel)

  • Когда Линукс выполняет свою загрузку, вы можете наблюдать загрузку различных служб. К примеру, это могут быть сообщения типа «starting Postfix … OK» (запускается Postfix). Эти службы — и называются программами уровня выполнения, выполняемые из директории, которая соответствует нужному уровню выполнения.
  • Исходя из настроек по умолчанию, система будет выполнять файлы в соответствии с нижеприведенными директориями.
    • Выполнение уровня 0 – /etc/rc.d/rc0.d/
    • Выполнение уровня 1 – /etc/rc.d/rc1.d/
    • Выполнение уровня 2 – /etc/rc.d/rc2.d/
    • Выполнение уровня 3 – /etc/rc.d/rc3.d/
    • Выполнение уровня 4 – /etc/rc.d/rc4.d/
    • Выполнение уровня 5 – /etc/rc.d/rc5.d/
    • Выполнение уровня 6 – /etc/rc.d/rc6.d/
  • Но имейте ввиду, что еще в каталоге /etc могут быть символические ссылки. Например, /etc/rc0.d залинкован на /etc/rc.d/rc0.d.
  • В каталогах /etc/rc.d/rc*.d/ вы можете увидеть список программ, имя которых начинается из букв S и K.
  • Программы, начинающиеся на S используются для запуска. S, потому что startup.
  • Программы, которые начинаются с литеры K используются — правильно — для завершения работы. K, потому что kill.
  • Еще есть номера рядом с буквами S и K в именах программ. Эти номера используются для определения порядка запуска этих программ.
  • К примеру, S12syslog предназначен для запуска демона syslog, его порядковый номер 12. S80sendmail — для запуска демона sendmail, имеющего порядковый номер 80. Таким образом, программа syslog будет запущена перед sendmail.

Вот и все. Возможно, некоторым из вас это не ново и особого интереса не было при чтении статью, поскольку она более ориентирована на начально-средний уровень знакомства з Линуксом.
В таком случае могу лишь сказать, что «повторение — мать учения» (с).

Дополнения, исправления, уточнения

В комментариях неоднократно было апеллировано к тексту статьи, поэтому, думаю, стоит учесть некоторые важные комментарии хабрасообщества. (спасибо artemlight, 3al, Tishka17, HhyperH, Next_Alex, Ilya_Shmelykh, Aux, soomrack, Xpeh )

  • artemlight:: «Ну скажем прямо — так грузятся далеко не все дистры». С ним согласилось большинство, отмечая и bsd-style init, u-boot, и хоть initrd в статье пропущен, стоить заметить, что он нужен ядру не во всех дистрибутивах. Также отмечено, что в slackware поддержка rc.d осуществляется только в качестве совместимости, а встраиваемые системы грузятся иначе. На декстопах иногда бывает EFI, а кроме того Linux популярен в мире embedded и там ещё куча разных платформ. Линукс в телефоне вообще иначе грузится.
  • soomrack, ссылая на википедию: Еще хочется сделать замечание по поводу MBR, первого сектора и пр. Все несколько усложнилось за последние годы. Сейчас уместней говорить о EFI.

Источник

Настройка UEFI-загрузчика. Самое краткое руководство в мире

Как устроена загрузка современных ОС? Как при установке системы настроить загрузку посредством UEFI, не утонув в руководствах и ничего не сломав?

Я обещал «самое краткое руководство». Вот оно:

  1. Создаём на диске таблицу разделов GPT
  2. Создаём FAT32-раздел на пару сотен мегабайт
  3. Скачиваем из интернета любой UEFI-загрузчик
    (нам нужен сам загрузчик, это один бинарный файл!)
  4. Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
  5. Создаём текстовый конфиг, кладем его там, где загрузчик ожидает его увидеть
    (настройка и местоположение конфига зависят от конкретной реализации загрузчика, эта информация доступна в интернете)
  6. После перезагрузки видим меню загрузчика
    (Если на диске установлена Windows 8 или 10 — с большой вероятностью это руководство сокращается до пунктов 3 — 5.)

TL;DR не надо прописывать путь к загрузчику в новых загрузочных записях UEFI — надо файл загрузчика расположить по стандартному «пути по-умолчанию», где UEFI его найдет, и вместо загрузочного меню UEFI пользоваться меню загрузчика, которое гораздо проще и безопаснее настраивается

Как делать не надо

Есть, на самом-то деле, несколько способов настроить UEFI-загрузку. Я начну с описания других вариантов — чтобы было понятно, как (и почему) делать не надо. Если вы пришли за руководством — мотайте в самый низ.

Не надо лезть в NVRAM и трогать efivars

Наиболее «популярная» процедура установки загрузчика в систему такова: установщик ОС создаёт специальный раздел, на нём — структуру каталогов и размещает файлы загрузчика. После этого он с помощью особой утилиты (efibootmgr в linux, bcdedit в windows) взаимодействует с прошивкой UEFI-чипа, добавляя в неё загрузочную запись. В этой записи указывается путь к файлу загрузчика (начиная от корня файловой системы) и при необходимости — параметры. После этого в загрузочном меню компьютера появляется опция загрузки ОС. Для linux существует возможность вообще обойтись без загрузчика. В загрузочной записи указывается путь сразу к ядру вместе со всеми параметрами. Ядро должно быть скомпилировано с опцией EFISTUB (что давно является стандартом для большинства дистрибутивов), в этом случае оно содержит в себе заголовок «исполняемого файла EFI», позволяющий прошивке его запускать без внешнего загрузчика.

При старте системы, когда пользователь выбирает нужную ему загрузочную запись, прошивка UEFI сперва ищет на прописанном в этой записи диске особый EFI-раздел, обращается к файловой системе на этом разделе (обязательно FAT или FAT32), и запускает загрузчик. Загрузчик считывает из файла настроек свой конфиг, и либо грузит ОС, либо предоставляет загрузочное меню. Ничего не замечаете? Да, у нас два загрузочных меню — одно на уровне прошивки чипа UEFI, другое — на уровне загрузчика. В реальности о существовании второго пользователи могут даже не догадываться — если в меню всего один пункт, загрузчик Windows начинает его грузить без лишних вопросов. Увидеть экран с этим меню можно, если поставить вторую копию Windows или просто криво её переустановить.

Обычно для управления загрузочными записями руководства в интернете предлагают взаимодействовать с прошивкой UEFI. Есть аж пять основных вариантов, как это можно сделать: efibootmgr под linux, bcdedit в windows, какая-то софтина на «Маках», команда bcfg утилиты uefi shell (запускается из-под UEFI, «на голом железе» и без ОС, поскольку скомпилирована в том самом особом формате) и для особо качественных прошивок — графическими средствами UEFI (говоря популярным языком, «в настройках BIOS»).

За всеми вышенаписанными «многобуков» вы могли легко упустить такую мысль: пользователь, чтобы изменить настройки программной части (например, добавить параметр запуска ОС), вынужден перезаписывать flash-память микросхемы на плате. Есть ли тут подводные камни? О да! Windows иногда способна сделать из ноутбука кирпич, linux тоже, причём разными способами. Качество прошивок часто оставляет желать лучшего — стандарты UEFI либо реализованы криво, либо не реализованы вообще. По логике, прошивка обязана переживать полное удаление всех переменных efivars без последствий, не хранить в них критичных для себя данных и самостоятельно восстанавливать значения по-умолчанию — просто потому что пользователь имеет к ним доступ, и вероятность их полного удаления далека от нуля. Я лично в процессе экспериментов неоднократно (к счастью, обратимо) «кирпичил» свой Lenovo — из загрузочного меню исчезали все пункты, включая опцию «зайти в настройки».

Работа с загрузочными записями UEFI — тоже не сахар. К примеру, утилита efibootmgr не имеет опции «редактировать существующую запись». Если ты хочешь немного изменить параметр ядра — ты удаляешь запись целиком и добавляешь её снова, уже измененную. При этом строка содержит в себе двойные и одинарные кавычки, а также прямые и обратные слеши в не особо очевидном порядке. Когда я наконец заставил эту магию работать — я сохранил её в виде bash-скриптов, которые до сих пор валяются у меня в корневой ФС:

Не надо использовать GRUB

Это чёртов мастодонт, 90% функциональности которого предназначено для дисков с MBR. Для настройки необходимо отредактировать ряд файлов, после чего выполнить команду генерации конфига. На выходе получается огромная малопонятная нормальному человеку простыня. В составе — гора исполняемых файлов. Ставится командой, которую просто так из головы не возьмешь — надо обязательно лезть в документацию

Для сравнения — самый простенький UEFI-bootloader, который есть в составе пакета systemd, ставится командой

Эта команда делает ровно две вещи: копирует исполняемый файл загрузчика на EFI-раздел и добавляет свою загрузочную запись в прошивку. А конфиг для неё занимает ровно СЕМЬ строчек.

«Самое краткое руководство» — чуть более подробно

Загрузочное меню надо реализовывать на уровне загрузчика — править текстовые конфиги гораздо проще и безопасней.

Загрузочная запись нам не нужна — дело в том, что при выставлении в настройках BIOS загрузки с диска прошивка UEFI сначала ищет на нём EFI-раздел, а затем пытается исполнить файл по строго фиксированному адресу на этом разделе: /EFI/Boot/BOOTX64.EFI

Что такое «EFI-раздел»? В теории, он должен иметь особый тип «EFI System» (ef00). На практике, годится первый раздел на GPT-диске, отформатированный в FAT32 и имеющий достаточно места, чтобы разместить загрузчик и вспомогательные файлы (если есть).

Пункт 3: «Скачиваем из интернета любой UEFI-загрузчик». Что это значит? Загрузчик — это просто исполняемый файл определенного формата, к которому в комплекте идет конфиг. К примеру, если у вас есть под рукой установленный пакет с systemd — файл загрузчика можно найти по адресу /usr/lib/systemd/boot/efi/systemd-bootx64.efi, переименовать его в bootx64.efi и скопировать в /EFI/Boot/ на EFI-разделе. Нет под рукой systemd? Скачайте архив с сайта Archlinux. Или с репозитария Ubuntu. Или Debian. Есть под рукой система с Windows? Возьмите виндовый загрузчик оттуда, тоже сгодится )) Если сумеете настроить, я честно говоря не пробовал.

Пункт 4: «Настроить конфиг». Как и обычная программа, когда загрузчик запускается — он ожидает найти по определенным путям файлы конфигурации. Обычно эту информацию легко найти в интернете. Для загрузчика systemd-boot нам необходимо в корне EFI-раздела создать каталог «loader», а в нём файл «loader.conf» с тремя строчками (привожу свои):

Параметр editor отвечает за возможность отредактировать пункт загрузочного меню перед запуском.

Рядом с loader.conf необходимо создать каталог entries — один файл в нём будет отвечать за одну загрузочную запись в boot-меню. У меня там один файл arch.conf с таким содержанием:

Я не упомянул, но довольно очевидно — ядро и initramfs должны лежать в одной файловой системе с загрузчиком, то есть на EFI-разделе. Пути к ним в конфигах отсчитываются от корня этой ФС.

Другие загрузчики

systemd-boot очень простой и предоставляет спартанского вида чёрно-белое меню. Есть варианты красивей, если душа просит красоты.

rEFind — очень красивый загрузчик. Скачать можно тут в виде deb-пакета. Использую на своём ноуте. Умеет создавать загрузочное меню автоматически, без конфига — просто сканируя файлы.

Clover. Позволяет выставлять нативное разрешение экрана, имеет поддержку мыши на экране загрузки, разные темы оформления. Дефолтная тема ужасна, конфиг в виде xml нечитаем, настроить не смог.

Различные неочевидные последствия

Вы можете легко попробовать эту схему в работе. Берёте USB-флешку, форматируете в таблицу разделов GPT, создаете FAT-раздел и копируете туда загрузчик. Комп сможет с неё стартовать.

Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.

Источник

Загрузка ОС Linux без загрузчика

Введение

Здесь по возможности я постараюсь как можно проще и детальнее ответить на вопрос:
«Как можно загрузить Linux (на примере ubuntu) без использования загрузчика такого как GRUB 2, iELILO»
Здесь не будет разбираться как запустить/установить Ubuntu в режиме [UEFI only]. Для этого обратитесь сюда help.ubuntu.ru/wiki/установка_дистрибутива_на_компьютер_с_efi
и сюда help.ubuntu.ru/wiki/lubuntu-osinstallation
Все действия будут производиться на уже работающей системе.

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

Требования

1. UEFI вместо BIOS (выставить режим [UEFI only]);
2. OS 64-bit;
3. Linux (Kernel >= 3.3);

Входные данные

Установленный дистрибутив lubuntu-13.04-desktop-amd64 с выставленным режимом [UEFI only]. Отключил Fast Boot (После завершения можно включить).

Полученная таблица разделов

Необходимо обратить внимание на 1 раздел, с него и будет осуществляться прямая загрузка ядра без участия отдельного загрузчика (например GRUB 2), предъявляемые к нему требования:

  1. Выставленный флаг boot;
  2. Рекомендуемый размер до 512 МБ (встречал разные рекомендации каким он должен быть размером, в основном это 200-300 МБ, от себя замечу, что на деле он будет занят на 5.3 МБ);
  3. Файловая система fat32/fat16/fat12 (UEFI имеет поддержку);

данный раздел не обязательно должен идти первым, главное, соблюсти требования выше (от себя советую поставить первым).

Подготовительные этапы выполнены, мы имеем работающую 64 битную операционную систему с выставленным режимом UEFI only и разделом для ядра (в данный момент там расположен GRUB, рядом мы положим ядро).

Получаем и настраиваем своё ядро

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

у меня ОС установлена на диске sda2.
Обычно эту строку передаёт загрузчик GRUB вместе со многими другими параметрами

Замечание
На сайте разработчика Ubuntu написано, что если вы используется не оригинальное ядро, а собрали его сами, то им будет трудно вам оказать поддержку и отчёты об ошибках не присылайте. (https://help.ubuntu.com/community/Kernel/Compile)

Получим необходимые инструменты (может занять продолжительное время)

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

Получить исходники последней версии ядра и подготовить окружение

Перейдём в папку linux-3.8.0

Теперь приступим к модификации конфигурации ядра

После выполнения последней команды вначале будет выведено уведомление:

Здесь как раз указано, что редактируем конфигурацию для 64 битного ядра, вводим Y, жмём ввод и получим окно

теперь открываем поиск (клавиша ‘/’), вводим cmdline и жмём ввод и видим то, что на скриншоте

затем жмём цифру 2 и переходим к правке параметра ‘Built-in kernel command line’, жмём ‘y’ и в данном поле выставляется звёздочка, символизирующая, что данный режим включен, теперь переходим на поле которое ниже, жмём ввод и вводим в него заветное

Эта и есть та самая опция, ради которой всё затевалось (Вместо sda2 подставьте свой диск).
Мы получили данный конфиг:

На этом этапе я остановился, собрал ядро, порадовался, что всё так просто и при загрузке свежесобранного ядра получил ошибку, что ядро не может найти корневой раздел (собственно это, ради чего весь процесс сборки ядра и затевался). Я долго недоумевал что же к чему и даже попробовал указать диск в формате UUID, но стабильно получал ошибку:

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

Теперь необходимо установить ещё некоторые опции ядра.
Водим в консоль (запустите ещё одну)

и полученный вывод вставляем в окно ввода на сайте
Debian GNU/Linux device driver check page
жмём check, получаем:

из этого списка нам нужно включить драйвер дискового контроллера, в моём случае это ahci (Строка ‘Sata Controller’, Столбец ‘Driver’).
Снова жмём ‘/’ для поиска и вводим ‘ahci’. Для верности отмечаем все три найденных варианта для встраивания SATA_AHCI_PLATFORM, SATA_ACARD_AHCI и SATA_AHCI.

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

Сборка ядра

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

После сборки копируем полученное ядро на загрузочный раздел в папку ‘EFI/boot’, т.к раздел примонтирован к папке /boot/efi, в результате имеем путь /boot/efi/EFI/boot/

Теперь необходимо скопировать ядро в эту папку дав ему название bootx64.efi

Стоит отметить, что загрузка с использованием загрузчика GRUB всё равно будет доступна, стоит только переключить в UEFI (нажать del или F12 при загрузке). Это может пригодиться, если ядро по каким либо причинам не загрузилось.

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

Убедимся, что у Вас есть доступ к UEFI переменным

Если отработало без ошибок, делаем последний штрих. Добавим наше ядро в UEFI с приоритетом на загрузку №1, название в кавычках после —label можете ввести своё. Регистр в пути к загрузчику не имеет значения, т.к он не регистро-зависимый.

Теперь в меню загрузки UEFI добавлена новая строчка с названием ‘Linux’, которая осуществляет прямую загрузку ядра. На этом всё. Можно перезагрузить компьютер и убедиться, что ядро загружается минуя загрузчик.

Чтобы убедиться, что ядро загружено вами собранное, введите

Вы увидете список параметров, передаваемых ядру при загрузке (мы их сами указали ранее):

Цель достигнута! Спасибо за внимание!

UPD:
Спасибо пользователю ValdikSS за ценное замечание. Достичь поставленную цель можно гораздо проще. Пересобирать ядро в данном случае нет необходимости. Его можно скопировать на FAT раздел вместе с initrd (из дириктории /boot) и указать загрузчику правильные параметры:

Источник

Читайте также:  Причины по которым может не загружаться windows
Оцените статью