GRUB  Grand Unified Bootloader

 

В общем и целом;

При загрузке компьютера происходит последовательная передача управления от системной прошивки компьютера (BIOS или UEFI) к загрузчику, а от него — к ядру. Затем ядро запускает планировщик (для реализации многозадачности) и выполняет программу init (которая настраивает пользовательское окружение и позволяет осуществлять взаимодействие с пользователем и вход в систему), после чего ядро переходит в состояние бездействия до тех пор, пока не получит внешний вызов.

BIOS/UEFI

BIOS:

    GRUB поддерживает и прямой, и цепной способ загрузки, а также LBA, ext2, и «истинно командно-ориентированную, до операционную среду на машинах x86». Он имеет три интерфейса: меню выбора, редактор настроек и командную консоль.

UEFI:

    Загруженный со служебного раздела EFS GRUB (специальная версия бинарного файла, который умеет загружать UEFI) содержит в себе все необходимые компоненты для доступа к файловой системе /boot где находятся конфигурация и дополнительные файлы загрузчика. Отображается меню загрузчика и отображает меню запуска GRUB. Оно также позволяет выбрать среду выполнения и просмотреть параметры системы. Когда операционная система выбрана, она загружается и ей передаётся управление.

MBR

1) главная загрузочная информация,  в первых 446 байтах;

2) информация о таблице разделов  в следующих 64 байтах;

3) и последние 2 байта нужны для проверки корректности mbr.

GRUB

Конфигурационный файл Grub обычно лежит по пути /boot/grub/grub.conf, файл содержит путь к ядру и образу initrd.

При загрузке через UEFI:  В UEFI загрузчик сразу запускается в защищенном режиме (32- или 64-битном) и фактически загружается сразу все фазы загрузчика (с учетом загрузки со служебного раздела для загрузчика нет необходимости разбивать себя на отдельные фазы и размещать их в разных местах). В остальном процесс загрузки и инициализации ядра не отличается от варианта с BIOS.

Kernel

$ ps -ef | grep init   ...........root 1 0 0 13:41 00:00:07 /sbin/init

initrd используется самим ядром в качестве временной корневой файловой системы, пока kernel не загрузится в реальную примонтированную файловую систему. Этот временный диск также содержит необходимые для загрузки драйверы, позволяющие получить доступ к разделам дисков и другому оборудованию Ядро ОС управляет главными функциями, такими как управление памятью, диспетчер задач, ввод-вывод, межпроцессное взаимодействие и общее управление системой. Загрузка проходит в несколько этапов: 

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

Ядро при загрузке обычно имеет вид файла-образа, сжатого в формат zImage или bzImage с помощью zlib. В нём содержится головная программа, которая проводит минимальную настройку оборудования, распаковывает образ целиком в верхнюю память и монтирует RAM-диск, если он предусмотрен. После этого она выполняет запуск ядра посредством ./arch/x86/boot/head и процесса startup_32() (для процессоров семейства x86).

Init

https://sites.google.com/site/processy

http://unixgems.jinr.ru/oss/linux/lig/node284.html

    Init является родителем всех процессов. Его главная задача — создавать процессы по сценарию из файла /etc/inittab. В этом файле обычно содержатся записи, указывающие init породить getty для каждой линии, по которой пользователи могут входить в систему. Он также контролирует автономные процессы, требуемые какой-либо системе.

    Уровень выполнения (run level) программная конфигурация системы, которая позволяет существовать только заданной группе процессов. Процессы, порождаемые init на каждом из таких уровней выполнения, определяются в файле /etc/inittab. Есть следующие уровни выполнения:

0 – прервать выполнение

1 – Однопользовательский режим (Single user mode), или  консоль восстановления

2 – Многопользовательский режим без поддержки NFS

3 – Полноценный многопользовательский режим

4 – не используется

5 – X11

6 – перезагрузка

    Init определяет уровень выполнения по умолчанию исходя из /etc/inittab и использует его для загрузки всех необходимых программ.

PS: Что касается Linux. Якобы для распараллеливания процессов загрузки и более полной обработки зависимостей от SysV перешли к SystemD (Fedora, Mandira, Arch Linux, CentOS, Red Hat, Debian) и  /etc/init/rc-sysinit.conf. Что касается Linux после 6.0.0.0 (может быть и раньше) Ubuntu, Debian, ..они вообще забыли про /etc/inittab, и вспомнили про дремучий Upstart

посмотреть уровень загрузки:                  systemctl get-default

посмотреть все доступные уровни:         ls -al /lib/systemd/system/runlevel*

 

> man inittab

>The /etc/inittab file was the configuration file used by the original System V init(8) daemon. The Upstart init(8) daemon does not use this file, and instead reads its configuration from files in /etc/init. See init(5) for more details.  https://habr.com/ru/sandbox/112588/

PS: Что касается Solaris. Это носит название  milestones(вехи). Milestones - это особый вид сервиса, представляющий группу услуг.  Milestones состоит из нескольких SMF services. 

Runlevel 

    Запуск служб (точнее демонов - стандартно /etc/init.d). Реализация init в стиле System V используется понятие уровня выполнения — степени загрузки операционной системы; в этом случае стартовые сценарии для каждого уровня разложены по каталогам от /etc/rc0.d до /etc/rc6.d, где цифра после rc соответствует номеру уровня инициализации. Исходя из настроек по умолчанию, система будет выполнять файлы в соответствии с нижеприведенными директориями.

Выполнение уровня 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.

========================

«GUID Partition Table (GPT) является стандартным форматом размещения таблиц разделов на физическом жестком диске. Он является частью Extensible Firmware Interface (EFI) (Расширяемый Микропрограммный Интерфейс) — стандарта, предложенного Intel на смену отжившего BIOS, одного из последних реликтов первозданной IBM PC. EFI использует GPT там, где BIOS использует Главную загрузочную запись (MBR)....»

========================

GRUB

grub-install --version      -------->   grub-install (GRUB) 2.02+dfsg1-.....

/boot/grub/grub.cfg - основной файл конфигурации, генерируется автоматически при помощи файла настроек /etc/default/grub и скриптов директории /etc/grub.d, представляет собой набор опций в формате ОПЦИЯ=ЗНАЧЕНИЕ.

/etc/grub.d - каталог содержит в себе скрипты, которые используются при создании "grub.cfg". 

При обновлении grub2 они находят все установленные на компьютере системы и ядра и формируют в "grub.cfg" меню загрузки, которое мы и видим. Два основных из них - "10_linux" и "30_os-prober"  отвечают за поиск linux-ядер и остальных ОС на других разделах соответственно. 

Файл "40_custom" позволяет добавлять свои пункты загрузки. Это может быть полезно, если вы, например, хотите добавить какие-то особые варианты загрузки системы. (Файл "40_custom" должен заканчиваться пустой строкой, иначе последний пункт не будет отображаться в меню!)

sudo update-grub - обязательное действие после редактирования, которое обновит /boot/grub/grub.cfg, выполнив скрипты в каталоге "/etc/grub.d" и применит заданные в "/etc/default/grub" параметры.

Скрипт бэк-апов:

$ cat > grub-backup

#!/bin/bash

datev=$(date +%Y_%m_%d)

mkdir -p ~/.grub.bak/$datev

cd ~/.grub.bak/$datev

mkdir -p boot/grub etc/default

cp /boot/grub/grub.cfg boot/grub

cp -Rp /etc/grub.d etc

cp /etc/default/grub etc/default

echo "Резервная копия создана. Папка: "$HOME"/.grub.bak/"$datev

^C

$ chmod 755 grub-backup

$ sudo cp grub-backup /usr/bin 

$ grub-backup

Резервная копия создана. Папка: /home/dell/.grub.bak/2019_03_12

System.map – системные вызовы ядра к процессу загрузки, файл, внутри которого находится символьная таблица адресов функций и процедур, используемых ядром, имена переменных и функций и их адреса в памяти компьютера. System.map генерируется при компиляции ядра.

vmlinux – Это ядро Linux в статически связанном формате исполняемого файла,это всего лишь промежуточный шаг в процедуре загрузки.Необработанный файл vmlinux может быть полезен для целей отладки.

vmlinux.bin – То же, что vmlinux, но в формате загрузочного двоичного файла. Все символы и информация о перемещении отбрасываются. Сгенерировано из vmlinux помощью objcopy -O binary vmlinux vmlinux.bin .

vmlinuz – Файл vmlinux обычно сжимается с помощью zlib . С 2.6.30 также доступны LZMA и bzip2 . Добавив дополнительные возможности для загрузки и декомпрессии в vmlinuz, образ можно использовать для загрузки системы с ядром vmlinux. Сжатие vmlinux может происходить с помощью zImage или bzImage.

Название файла с образом ядра  историческое. Изначально образ ядра классического UNIX назывался просто unix, но, когда появилась версия ядра для процессоров с защитой памяти, чтобы избежать путаницы, название сменили на vmunix. Буква z вместо x на конце, в свою очередь, означает, что образ сжат с помощью утилиты gzip.


zImage (make zImage) – Это старый формат для небольших ядер (сжатый, ниже 512 КБ). При загрузке этот образ загружается с низким объемом памяти (первые 640 КБ ОЗУ).

bzImage (make bzImage) – Большой zImage (это не имеет ничего общего с bzip2 ), был создан, когда ядро росло и обрабатывало  большие образы (сжатые, более 512 КБ). Образ загружается в память (выше 1 МБ ОЗУ). 

Поскольку сегодняшние ядра имеют более 512 КБ, это обычно является предпочтительным способом.

error unknown filesystem grub rescue

https://losst.ru/oshibka-grub-rescue-unknown-filesystem

http://www.lexpr.ru/grub2_commandline_and_rescuemode

 

Если GRUB обнаруживает ошибки в процессе загрузки и не может передать управление указанному в записи ядру из-за ошибки в grub.cfg,  он переходит в режим Rescue:

grub rescue> ls

grub rescue> ls (hd0,1)/

grub rescue> set root=(hd0,1)

grub rescue> set prefix=(hd0,1)/boot/grub

grub rescue> insmod normal

grub rescue> normal

Надо учесть, что в результате подобных действий мы загрузим только установленную систему(естественно) в том смысле, что если ошибка появилась после каких либо зксперементов с дисками, например две "оси" Micro_soft и Linux то для появления меню Grub надо редактировать MBR, сделать это можно либо с помощью LiveCD c Linux, либо програмно из установленной системы, в Linux это умеет  "Grub-customizer" в меню найти пункт "прописать в MBR", можно и так: #grub-install /dev/sdX

sdX - это диск на который мы ходим установить Grube. Из терминала это делается при помощи fdisk  в случае таблицы разделов MSDOS, в случае GPT gdisk

Потренироваться можно на команде set прямо из меню Grube нажав с.   https://help.ubuntu.ru/grub

GRUB НЕ ВИДИТ WINDOWS 

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

$ sudo os-prober

/dev/sda2:Windows 10:Windows:chain

$

Далее:

$ sudo update-grub

И по идее update-grube должен добавить /dev/sda2:Windows 10:Windows:chain  в  /boot/grub/grub.cfg, то есть update grube после запуска должен выполнить два скрипта (в том числе), это /etc/grub.d/10_linux и /etc/grub.d/30_os-prober, которые должны это сделать, и тут не мешает проверить исполняемые они или нет: 

$ ls -l /etc/grub.d/10_linux

-rwxr-xr-x 1 root root 14K Jun 15 17:29 /etc/grub.d/10_linux*

$ ls -l /etc/grub.d/30_os-prober

-rwxr-xr-x 1 root root 13K Jun 15 17:29 /etc/grub.d/30_os-prober*


 Исполняемые, НО Windows у нас грузится с UEFI, grube не сканирует uefi и выдает ошибку (предупреждение, или другие причины):

$ ...................................

Warning: os-prober will not be executed to detect other bootable partitions.

Systems on them will not be added to the GRUB boot configuration.

Check GRUB_DISABLE_OS_PROBER documentation entry.

$

И тогда следующим шагом будет редактирование файла  /etc/grub.d/40_custom (название говорит само за себя), но для начала следует выяснить UUID раздела диска, на который установлена Windows:

$ sudo blkid /dev/sda2

/dev/sda2: LABEL="RECOVERY" BLOCK_SIZE="512" UUID="28A6A902A6A8D19C" TYPE="ntfs" PARTUUID="00a30100-02"

$

Далее: vim /etc/grub.d/40_custom , файл наверное пустой, дописываем:

menuentry "Windows 10" {

insmod ntfs

set root='(hd0,2)'

search --no-floppy --fs-uuid --set 28A6A902A6A8D19C

chainloader +1

}

В конце:

$ sudo update-grub , что наверное ни чего не даст, но в меню появится  "Windows 10" 


И конечно самый лучший способ это делать бэк-апы ......