GRUB Grand Unified Bootloader
http://citforum.ru/operating_systems/solaris/init.shtml
https://www.networkworld.com/unix-how-to-the-linux-etc-inittab-file.html
https://www.ibm.com/support/knowledgecenter/ru ------>
http://www.k-max.name/linux/nachalo-etapy-zagruzki ------>
Майкл Эбен, Брайан Таймэн - FreeBSD. Администрирование <<---PDF ст.81
В общем и целом;
При загрузке компьютера происходит последовательная передача управления от системной прошивки компьютера (BIOS или UEFI) к загрузчику, а от него — к ядру. Затем ядро запускает планировщик (для реализации многозадачности) и выполняет программу init (которая настраивает пользовательское окружение и позволяет осуществлять взаимодействие с пользователем и вход в систему), после чего ядро переходит в состояние бездействия до тех пор, пока не получит внешний вызов.
BIOS/UEFI
BIOS отвечает за базовый ввод/вывод данных с устройств/на устройства, выполняет первичную проверку и инициализацию аппаратного обеспечения, за тестирование работоспособности отвечает POST (Power-on self-test).
BIOS загружает и выполняет загрузочную запись (MBR).
В случае BIOS прошивка загружает в оперативную память и выполняет загрузочный код с одного из разделов заданного загрузочного устройства, который содержит фазу 1 загрузчика Linux. Фаза 1 загружает фазу 2 (значительный по размеру код загрузчика). Некоторые загрузчики могут использовать для этого промежуточный этап (под названием фаза 1,5), поскольку современные диски большого объёма могут некорректно считываться без дальнейшего кода. В случае UEFI запускается загрузчик загруженный со служебного раздела (EFS), который выбирается согласно настройкам приоритета загрузки определенного в энергонезависимой памяти компьютера. При этом возможна загрузка не только специализированного загрузчика, но можно загрузить и непосредственно ядро Linux (для этого ядро должно быть собрано с опцией EFI_STUB).
BIOS:
Загрузчик 1-й фазы считывается BIOS из MBR (главной загрузочной записи). Он загружает оставшуюся часть загрузчика (2-ю фазу). Если вторая фаза находится на большом диске, иногда загружается промежуточная фаза 1,5, которая содержит дополнительный код, позволяющий считывать цилиндры с номерами более 1024 (диски LBA). Загрузчик фазы 1,5 хранится (если это необходимо) в MBR или в загрузочном разделе.
Выполняется вторая фаза загрузчика и отображает меню запуска GRUB. Оно также позволяет выбрать среду выполнения и просмотреть параметры системы. Когда операционная система выбрана, она загружается и ей передаётся управление.
GRUB поддерживает и прямой, и цепной способ загрузки, а также LBA, ext2, и «истинно командно-ориентированную, до операционную среду на машинах x86». Он имеет три интерфейса: меню выбора, редактор настроек и командную консоль.
UEFI:
Загруженный со служебного раздела EFS GRUB (специальная версия бинарного файла, который умеет загружать UEFI) содержит в себе все необходимые компоненты для доступа к файловой системе /boot где находятся конфигурация и дополнительные файлы загрузчика. Отображается меню загрузчика и отображает меню запуска GRUB. Оно также позволяет выбрать среду выполнения и просмотреть параметры системы. Когда операционная система выбрана, она загружается и ей передаётся управление.
MBR
Предполагается, что MBR берет на себя следующий этап, связанный с загрузкой операционной системы
MBR Master Boot Record - это первый сектор (первые 512 байт) устройства хранения данных. MBR - это участок памяти, зарезервированный для загрузчика операционной системы и таблицы разделов диска главная загрузочная запись, хранящаяся на жестком диске.
Размещена в 1-м секторе загрузочного диска, например /dev/hda или /dev/sda
MBR занимает меньше, чем 512 байтов. Она состоит из трех компонентов:
1) главная загрузочная информация, в первых 446 байтах;
2) информация о таблице разделов в следующих 64 байтах;
3) и последние 2 байта нужны для проверки корректности mbr.
Далее, MBR загружает и выполняет загрузчик GRUB.
GRUB
GNU GRUB — эталонная реализация загрузчика, поддерживающего спецификацию Multiboot (обе версии), используемая в операционных системах GNU.
GRUB (Grand Unified Bootloader) - загружает и выполняет образы ядра и initrd.
Если система имеет более, чем одно ядро, GRUB предоставляет возможность выбирать, которое из них должно выполняться
GRUB понимает, что такое файловая система. GRUB, распознаёт распространённые файловые системы такие как, ext2 и ext3. Так как GRUB хранит свои данные в файле конфигурации, а не в загрузочной записи, и имеет интерфейс командной строки, и как следствие параметры GRUB легче править или изменить, если они повреждены.
GRUB умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать Windows (через загрузчик NTLDR (NT Loader) или bootmgr), MS-DOS, OS/2 и другие
Конфигурационный файл Grub обычно лежит по пути /boot/grub/grub.conf, файл содержит путь к ядру и образу initrd.
При загрузке через UEFI: В UEFI загрузчик сразу запускается в защищенном режиме (32- или 64-битном) и фактически загружается сразу все фазы загрузчика (с учетом загрузки со служебного раздела для загрузчика нет необходимости разбивать себя на отдельные фазы и размещать их в разных местах). В остальном процесс загрузки и инициализации ядра не отличается от варианта с BIOS.
Kernel
Ядро монтирует файловую систему в соответствии с настройкой «root=» в фале grub.conf
Выполняет программу /sbin/init, первый процесс, запущенный ядром PID 1.
$ ps -ef | grep init ...........root 1 0 0 13:41 00:00:07 /sbin/init
initrd — это Initial RAM Disk, он же временный диск в оперативной памяти
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"
И конечно самый лучший способ это делать бэк-апы ......