Введение в процесс загрузки и запуска linux

Типичные проблемы

Как восстановить GRUB после удаления?

Это часто происходит, если вы устанавливаете Windows после Linux. Windows считает, что она единственная операционная система в мире и не пытается интерпретировать существующую информацию, находящуюся в MBR.
Она ее просто перезаписывает. Для людей, у которых имеется система двойной загрузки и небольшие познания в Linux, — это просто катастрофа. К счастью это очень легко поправимо.

Сложный способ

  • Загрузитесь с флоппи диска или CD (любой Linux live CD должен подойти)
  • Войдите в режим командной строки GRUB.
grub> find /boot/grub/stage1 (optional)
grub> root (hdX,Y)
grub> setup (hd0)
grub> quit

Все тоже самое, что и раньше!

Windows установлена не на первом жестком диске (Своппинг)

GRUB не может загрузить напрямую операционную систему Microsoft. Иногда даже последовательная загрузка может не работать, особенно, если Windows установлена не на первом жестком диске. И снова вы должны помнить, что нужно устанавливать Windows первой, на первый жесткий диск и на первый раздел (правило 3П — трех первых). При этом, даже если вы установили Windows на отдельном диске, вы можете решить проблему с помощью .

Вам необходимо сделать между жесткими дисками. Таким образом:

grub> map (hd0) (hd1)
grub> map (hd1) (hd0)

После добавления этих двух строк, вы должны загрузить Windows (или DOS).

С Windows опять могут возникнуть проблемы, если имеется несколько экземпляров размещенных на одном жестком диске, в особенности, если они установлены на первичных разделах. Раньше, когда вы использовали команду chainloader (последовательная загрузка), вы передавали управление начальному загрузчику Windows. Какому загрузчику операционной системы передать управление сейчас?

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

Приводимый здесь пример, взят из руководства, он демонстрирует этот момент.

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

grub> unhide (hd0,0)
grub> hide (hd0,1)
grub> rootnoverify (hd0,0)
grub> chainloader +1
grub> makeactive

Вы изменили размер раздела; GRUB не работает

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

Скорее всего повреждена файловая система и ее необходимо восстановить для решения данной проблемы.

Загрузитесь с live CD и выполните следующие команды (предполагается что вы знаете, где размещены Linux-разделы).

$ fsck.ext2 /dev/hdXY

Замените и буквой жесткого диска и номером раздела, который вы хотите проверить (hda2, hdb3, и т.д.).

Измените тип файловой системы на .

$ tune2fs -j /dev/hdXY

Теперь на и запустите :

$ mount -t ext2 /dev/hdXY /mnt/sysimage
ИЛИ
$ mount -t ext2 /dev/hdXY /mnt/sysimage
        
$ cd /mnt/sysimage/sbin
$ grub

Вы снова вернулись в знакомую среду.

Для получения дополнительной информации о командах Linux, например, , и других, обратитесь к на .

В заключение, несколько каверзных вопросов, отвеченных в Ubuntu :

Разнообразие PBR

Мы с вами выяснили, что MBR передает управление на активный раздел с PBR. PBR (Partition Boot Record), так же называют volume boot record (VBR) – это микрокод в начальном секторе раздела диска (часто это сектор 63), который содержит информацию, какой же загрузчик искать.

Существуют следующие загрузчики:

Тип MBR — NT 5.x/6.x, 1 сектор

  • io.sys для MS-DOS, Windows 95/98/МЕ
  • ntldr для Windows 2000/XP/2003
  • bootmgr для Windows Vista/7/8/8.1/10

Тип MBR — Grub4DOS, 18 секторов

grldr для Grub4DOS

Тип MBR — LILO/GRUB и др. линуксовые (к-во секторов зависит от версии и количества файлов)

  • ldlinux.sys – основной базовый модуль
  • syslinux.sys — для загрузки с FAT, FAT32, NTFS
  • isolinux.bin — для загрузки с iso9660
  • pxelinux — для загрузки по PXE
  • extlinux для загрузки с ext2/ext3/ext4 или btrfs

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

  • Файлы Windows NTLDR или BOOTMGR должны лежать в корне активного системного раздела и работают они по-разному. Об этом ниже.
  • Файл GRLDR используется Grub4DOS также должен лежать в корне партиции, с котрой выполняется загрузка
  • Syslinux – универсальный загрузчик, содержащий много модулей и поддерживающий загрузку с файловых систем ext2/3/4, FAT, NTFS, CD/DVD дисков, по сети через PXE. Позволяет организовать текстовое или графическое загрузочное меню. Чаще всего этот загрузчик используют для запуска Linux с файловых систем FAT/NTFS или же создания мультизагрузочных USB флэшек, позволяющих загружать как Linux-совместимые приложения под DOS, так и Windows PE.

Например, типичные пример создания мультизагрузочной флэшки – Multiboot USB 2k10, создаваемые уважаемыми conty9 & korsak7. Мультизагрузочный диск системного администратора с возможностью загрузки c CD/DVD, флешки, USB-HDD и обычного HDD и состоящий из нескольких Windows PE-сборок, а также DOS версий продуктов компании Acronis – например Acronis True Image (выполнены на Linux-ядре). Именно из-за этого смешанного зоопарка систем и приходится использовать загрузчик Syslinux (хотя можно и Grub4DOS).

В своем арсенале вам необходимо обязательно иметь утилиту BootICE. Уникальная в своём роде утилита для изменения или бэкапа/восстановления MBR (Master Boot Record) или PBR (Partition Boot Record). С BOOTICE, вы можете легко изменять тип MBR/PBR. Поддерживается загрузочные записи: Grub4DOS, SysLinux, PLoP, MS NT52/60… Например, с помощью этой утилиты, вы можете установить Grub4DOS вашим MBR или PBR, установить NTLDR или BOOTMGR к вашему PBR, установить SYSLINUX на PBR, и так далее.

Редактирование и установка MBR

Редактирование и установка загрузчика

Установка MBR GRUB4DOS

Помимо работы с MBR и PBR, BootICE позволяет редактировать разделы диска, выполнять ручное разбиение и форматирование, модифицировать тип раздела, сохранять и восстанавливать из бэкапа таблицу разделов.

Работа с таблицей разделов в BootICE

Кратко о загрузчике Syslinux

Обратите внимание, что загрузчик Syslinux сам по себе не может быть установлен в MBR, однако в пакете syslinux имеются два файла, из которых можно установить загрузочный код Syslinux в 440-байтную область загрузочного кода MBR: или. Конечно, это имеет смысл только для Linux

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

Итак, Syslinux состоит из файла загрузчика и файла конфигурации меню syslinux.cfg. Файл меню может вызывать графическое меню через подгрузку файла vesamenu.c32.

Установка Syslinux под Windows на другой диск выполняется достаточно просто: используется файл «win32/syslinux.exe» для 32-х битных систем и «win64/syslinux64.exe» для 64-х битных систем.

syslinux.exe —install a: — установка на флоппи-диск

syslinux.exe —mbr —active —directory /boot/syslinux/ —install z:    — установка на диск z:, например флешку, где

— в качестве разделителей должны быть использованы именно , а не \

— в каталоге z:\boot\syslinux\ будет размещён файл-загрузчик «ldlinux.sys»

— и раздел z: помечен как активный

— для организации меню должен быть создан файл z:\boot\syslinux\syslinux.cfg

Установка загрузчика Syslinux

Через BootICE вы также можете установить загрузчик Syslinux, указав в опциях альернативное местоположение файлов ldlinux.sys и и файла меню syslinux.cfg.

Аналогичную задачу может решить и LILO

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

Например, загрузка системы Windows, установленной в первом разделе, может быть обеспечена такими строками в lilo.conf:

other = /dev/hda1    	# Указываем загрузочный раздел Windows
table = /dev/hda   	# Таблицу разделов следует искать в MBR
label = windows      # Наименование загружаемой системы

Если Windows для загрузки использует NTLoader, то при выборе пункта windows в меню LILO вы получите еще одно меню — на этот раз соответствующее файлу C:\boot.ini.

Поскольку на самом деле строка other просто указывает на некоторый boot-сектор, коду которого должно быть передано управление, то таким же образом можно загружать и другие системы, например, FreeBSD (указав соответствующий раздел).

LILO и GRUB — близнецы-братья

Нет, конечно же, эти два популярных в среде Linux менеджера загрузки имеют ряд коренных отличий, однако применительно к теме данной статьи принцип их работы схож. Они записывают в MBR код, который безусловно (независимо от установленных признаков активности разделов) передает управление вторичному загрузчику (на этот раз он располагается непосредственно в файловой системе, а не в boot-секторе, причем в некоторых случаях это может быть не Linux-раздел; в случае GRUB возможно размещение части вторичного загрузчика — stage1_5 — и вне файловой системы). Эта программа отвечает за отображение меню выбора и (в случае, если выбрана загрузка Linux) передает управление загрузчику ядра.

Благодаря такому подходу, разработчики этих менеджеров загрузки смогли обойти очень жесткое ограничение на размер загрузочного сектора, но зато привязали себя (и пользователей) к Linux-разделу. То есть, если вы на свой компьютер с Windows решите поставить для пробы Linux (с LILO), а затем, по тем или иным причинам, захотите его удалить, то после удаления раздела с Linux ваша система потеряет способность. Впрочем, это довольно легко обойти с помощью организационных методов, например, размещая каталог /boot на отдельном небольшом разделе (и проследив, чтобы все нужные загрузчику файлы располагались в нем). Если же вы не были столь предусмотрительны, и при очередной загрузке видите на экране одинокое L, то решить эту проблему не сложно: загрузитесь с системной дискеты DOS или Windows 98 и выполните команду fdisk /mbr для записи стандартного загрузчика в MBR вместо LILO. Или перед тем, как удалять раздел, деинсталлируйте LILO следующей командой:

root# lilo u 

Правда, нужно учитывать, что восстановление произойдет успешно только в том случае, если в системе есть файлы с копией MBR до установки LILO (обычно они располагаются в каталоге /boot с именами boot.XXYY, например, boot.0300 для MBR первого диска). Когда вы выполняете команду /sbin/lilo для инсталляции загрузчика, нужные файлы должны создаваться автоматически; при повторных инсталляциях (когда вы меняете конфигурацию загрузчика или устанавливаете новое ядро) эти файлы не перезаписываются, сохраняя оригинальное содержимое. А вот если вы пробовали ставить GRUB, затем снова вернулись на LILO, то при выполнении вышеозначенной команды вы получите в MBR ваш старый GRUB-код.

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

Ядро


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

На этом этапе ядро тестирует ваше оборудование и подстраивается под него. Ядро также подгружает модули из образа , которые требуются для работы с вашим оборудованием. Учтите, что эта информация очень быстро пробегает по экрану, так что если вы считаете, что ваша проблема лежит на уровне ядра, смотрите очень внимательно, и вы наверняка получите подсказку о том, где её искать. Когда ядро завершает свою инициализацию, оно запускает первый системный процесс — .

[Большая часть загрузочной информации доступна в файле сразу после загрузки. — прим.ред.]

GRUB

После первичного загрузчика (MBR/GPT) подгружается GRUB (GRand Unified Bootloader), который уже понимает что такое файловая система и может показать показать список имеющихся ядер (которые определяются в /etc/grub.conf, с поддержкой мягких ссылок из /boot/grub/menu.lst и/boot/grub/grub.cfg). К примеру типичное меню с grub.cfg:

menuentry 'Ubuntu, with Linux 3.8.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root 2a1f9055-c025-4dcd-b3c8-b38b9e6ffb9c
        linux   /boot/vmlinuz-3.8.0-26-generic root=UUID=2a1f9055-c025-4dcd-b3c8-b38b9e6ffb9c ro
        initrd  /boot/initrd.img-3.8.0-26-generic
}

Здесь указываться образ временной файловой системы initrd.img и образ ядра vmlinuz, которому передается следующий этап загрузки.

The Boot Process

As previously mentioned, the stage of the boot process is a little more involved than the previous steps, primarily due to the additional complexity of reading the filesystem. The bootloader must also obtain information about the underlying machine hardware (either via the BIOS or on its own) in order to correctly load the desired operating system from the correct partition and provide any additional files or data that might be needed. It must also read its own configuration file from a regular file stored on the boot partition’s filesystem, so it needs to at the very least have full read support for whatever filesystem it resides on.

  • Initiate filesystem accessBefore anything else can happen, when the bootloader is first run it must load and run the primitive filesystem “drivers” that give it the ability to read, at the very least, the filesystem it is located on. Since it’s unable to read the filesystem before this, by necessity the code that provides this functionality must be compiled into the core bootloader file itself.
  • Load and read configuration file(s)With support for the filesystem loaded, the bootloader can now read the list of operating systems from the disk and the the event that there are multiple operating systems specified, prepare it for display.
  • Load and run supporting modulesFor bootloaders that are not wholly self-contained (such as NTLDR and GRUB 2), the bootloader now loads any supporting modules or helper programs (such as NTDETECT.COM) from the disk. The list of modules to load can be specified in the configuration file that was just read or hard-coded/compiled into the bootloader itself. Normally, each module will be executed as it is located and loaded from the disk.
  • Display the boot menuAt this point, with all the relevant configuration in hand, the bootloader can display what is commonly known as the boot menu on the screen. If multiple operating systems are installed, it is via the boot menu that the user of the computer can navigate a list of operating systems and choose which to load. From here, certain bootloaders also make it possible to specify run-time options, such as whether to load the selected operating system in safe mode.
  • Load the OS kernelOnce the user’s selection has been recorded, the bootloader moves on to the last and final stage of the boot process. Depending on the OS and the type of kernel, the bootloader will load the kernel image from the path specified in the configuration file (with the help of any submodules, if needed) into the memory. It then instructs the CPU to JMP to a certain location within the newly-loaded kernel and begin executing from there.

BIOS POST

Первый этап процесса загрузки Linux на самом деле не имеет ничего общего с Linux. Это аппаратная часть процесса загрузки и она одинаковая для любой операционной системы. Когдана компьютер подается питание, он запускает процедуру POST (Power On Self Test), которая является частью BIOS (Basic I/O System).

Когда IBM разработала первый компьютер, еще в 1981 году, для инициализации аппаратных компонентов был разработан BIOS. POST является частью BIOS, задачей которого является обеспечение правильного функционирования оборудования. Если POST не сработал нормально, компьютер может не использоваться, поэтому процесс загрузки не будет продолжен.

BIOS POST проверяет базовую работоспособность аппаратного обеспечения, а затем выдает прерывание BIOS, INT 13H, которое находит загрузочные секторы на всех подключенных загрузочных устройствах. Первый загрузочный сектор с правильной загрузочной записью, который он находит, загружается в ОЗУ, а затем управление передается коду, загруженному из загрузочного сектора.

Загрузочный сектор — это фактичеки первый этап загрузчика. Существует три загрузчика, используемые большинством дистрибутивов Linux: GRUB, GRUB2 и LILO. GRUB2 является самым современным и используется сегодня гораздо чаще, чем более старые варианты.

Начальный этап настройки ядра

Наконец, мы находимся в ядре! Технически, ядро ещё не работает; во-первых, часть ядра, отвественная за настройку, должна подготовить декомпрессор, вещи связанные с управлением памятью и т.д. После всех подготовок код настройки ядра должен распаковывать фактическое ядро и совершить переход на него. Выполнение настройки начинается в файле arch/x86/boot/header.S, начиная с метки . Это немного странно на первый взгляд, так как перед этим есть ещё несколько инструкций.

Давным-давно у Linux был свой загрузчик, но сейчас, если вы запустите, например:

то увидите:

На самом деле, начинается с MZ (см. картинку выше), вывода сообщения об ошибке и PE заголовка:

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

Настоящая настройка ядра начинается с:

Загрузчик (grub2 или другой) знает об этой метке (при смещении от ) и сразу переходит на неё, несмотря на то, что начинается с секции , который выводит сообщение об ошибке:

Точка входа настройки ядра:

Здесь мы можем видеть опкод инструкции () к метке . Нотация означает, что ссылается на следующую локальную метку ; в нашем случае это метка , которая расположена сразу после инструкции jump и содержит оставшуюся часть . Сразу после заголовка настроек мы видим секцию , которая начинается с метки .

Это первый код, который на самом деле запускается (отдельно от предыдущей инструкции jump, конечно). После того как настройщик ядра получил управление от загрузчика, первая инструкция располагается по смещению от начала реальных адресов, т.е после первых 512 байт. Об этом можно узнать из протокола загрузки ядра Linux, а также увидеть в исходном коде grub2:

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

После перехода на метку , необходимо соблюсти следующие условия:

  • Убедиться, что все значения всех сегментных регистров равны
  • Правильно настроить стек, если это необходимо
  • Настроить BSS
  • Перейти к C-коду в main.c

Давайте посмотрим, как эти условия выполняются.

4. запуск Systemd

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

Systemd использует файл /usr/lib/systemd/system/default.target для определения состояния или цели, в которую должна загружаться система Linux.

  • Для настольной рабочей станции (с графическим интерфейсом пользователя) целевое значение по умолчанию graphical.target.
  • Для сервера целью по умолчанию является multi-user.target.

Вот виды целей systemd:

  • poweroff.target: выключение системы.
  • rescue.target: запускает сеанс спасательной оболочки.
  • multi-user.target: настраивает систему на неграфическую (консольную) многопользовательскую систему.
  • graphical.target: настройка системы на использование графического многопользовательского интерфейса с сетевыми службами.
  • reboot.target: перезагружает систему.

Чтобы проверить текущую цель в вашей системе, выполните команду:

systemctl get-default

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

sudo systemctl set-default multi-user.target

Эта команда переводит систему в неграфическое состояние (после перезагрузки).

А эта команда возвращает в загрузку в графический интерфейс:

sudo systemctl set-default graphical.target

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

Init

После загрузки и инициализации ядра запускается первое приложение в пространстве пользователя /sbin/init, которое обращается к файлу /etc/inittab (или /etc/init/rc-sysinit.conf) для того, чтобы определить уровень выполнения (run level).
Есть следующие уровни выполнения:

  • 0 — выполняются действия по выключению системы.
  • 1 — однопользовательский режим (single user mode). Предназначен для различных административных действий по восстановлению системы. По своему смыслу аналогичен Safe Mode Windows, но полностью его не повторяет. На этом уровне выполнения система полностью сконфигурирована, но не запущен ни один сервис, а из пользователей может работать только один root.
  • 2 — не используется, но сконфигурирован как уровень выполнения 3. В RedHat и SuSE Linux сконфигурирован как уровень выполнения 3, но без поддержки сетевых файловых систем. В Ubuntu и Debian используется как многопользовательский режим.
  • 3 — многопользовательский режим (multiuser mode). Нормальный режим работы сервера.
  • 4 — В Slackware Linux используется для графического входа в систему. В RedHat и SuSE Linux не сконфигурирован.
  • 5 — В RedHat и SuSE Linux используется для графического входа в систему. В Slackware Linux не сконфигурирован.
  • 6 — выполняются действия по перезагрузке системы.

Посмотреть текущий уровень исполнения и задать дефотлный:

root@:~# runlevel
N 2
root@:~# vim /etc/init/rc-sysinit.conf
...
env DEFAULT_RUNLEVEL=2
...

Так же можно на прямую вписать в grub.cfg.

А наибольшую гибкость обеспечивает GRUB

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

title FreeBSD			# Указываем имя ОС
root (hd0,2,a)			# Выбираем корневой раздел для загрузки
kernel /boot/loader		# Указываем файл для передачи управления

В этом случае GRUB передаст управление сразу на загрузчик ядра FreeBSD, который и выполнит дальнейшую загрузку

Обратите внимание, что в силу особенностей разбиения раздела, присущих FreeBSD (см. врезку Особенности именования разделов), нужно помимо диска и номера раздела указать еще букву подраздела FreeBSD (в нашем случае — a)

Для загрузки Windows из GRUB больше подойдет использование передачи управления по цепочке:

title Windows
rootnoverify (hd0,0) 
makeactive
chainloader +1

То есть будет выбран первый раздел, сделан активным, и на него будет передано управление. Дальнейшая загрузка, как и в случае с LILO, будет определяться настройками NTLoader (если он имеется).

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

title FreeBSD
chainloader (hd0,2)+1

Кстати говоря, по цепочке можно передать управление не только на тот или иной сектор, но и на образ сектора, сохраненный в файле. Например, если у вас установлены системы Windows 98, Windows 2000 и Linux, то Windows 98 можно загрузить и сразу из GRUB, минуя меню NTLoader. Для этого можно использовать такую конфигурацию:

title Windows 98
chainloader (hd0,0)/bootsect.dos

Файл bootsect.dos уже должен быть на вашем диске C: (именно его использует NTLoader, когда вы выбираете загрузку Windows 9x из меню NT-загрузчика). Если в boot.ini установить нулевую задержку и в качестве варианта по умолчанию выбрать загрузку Windows 2000, то вы вообще не будете видеть второе меню, делая выбор загружаемой системы только в меню GRUB.

Принципы загрузки операционных систем

При включении компьютера управление процессором получает BIOS, и если он настроен на загрузку (boot) с винчестера, то он подгружает в оперативную память компьютера первый сектор диска (MBR) и передает управление ему. Если у вас несколько жестких дисков, то каждый из них содержит свою MBR. В этом случае можно или менять порядок загрузки дисков в BIOS, или же прописать все операционные системы с разных дисков в один PBR загрузчик, об этом ниже.

Сразу оговоримся, что если у BIOS у вас включен режим загрузки UEFI, то структура разделов диска у вас должна быть не MBR, а GPT. GPT имеет не только другую структуру разделов, но и другую структуру загрузочной области. Там в первый сектор записывается «заглушка» для BIOS (Protective MBR), которая служит для того, чтобы старый Legacy BIOS мог загрузиться с GPT диска в режиме совместимости, если ОС была установлена на GPT (часто в BIOS его называют CSM – Compatibility Support Module). Однако, вы никогда не сможете загрузить ОС с MBR диска, если в BIOS выставлена загрузка в режиме UEFI.

При загрузке операционной системы, сначала считывается первый сектор с устройства загрузки, представляющий собой главную загрузочную запись (Master Boot Record — MBR). Стандартно, в качестве MBR выступает первый сектор загрузочного диска. MBR содержит список разделов, признак активного раздела (раздела, с которого будет выполняться загрузка ОС), некоторые служебные данные, а также программный код для считывания в память загрузочного сектора активного раздела (Partition Boot Record — PBR) и передачи ему управления.

Размер сектора на жестком диске — 512 байт. В секторе MBR хранятся данные, которые должны заканчиваться специальной сигнатурой. Этим словом называется специальная, строго установленная, последовательность из 2 байт с шестнадцатеричными значениями 55h AAh, которая записывается в последние 2 байта сектора и соответственно имеет смещение от начала сектора 1FEh. Если хотя бы один из двух последних байтов отличается по значению, считается, что первый сектор не является MBR и не содержит осмысленной информации. Если компьютер при старте, прочитав первый сектор, не обнаружит правильной сигнатуры, он не будет передавать управление располагающемуся там коду, даже если он правильный, а выдаст сообщение о том, что главная загрузочная запись не найдена.

Общая структура MBR может быть представлена следующей таблицей:

Смещение Длина Описание

000h      446  Код загрузчика

1BEh       64  Таблица разделов

                16  Раздел 1

1CEh       16  Раздел 2

1DEh       16  Раздел 3

1EEh       16  Раздел 4

1FEh        2  Сигнатура (55h AAh)

Длина указана в байтах.

Как видно, MBR может содержать информацию максимум о 4 разделах. Каждый 16-байтовый блок, содержащий информацию о разделах, в своем начале содержит признак активности раздела — т.е. признак того, что операционную систему следует загружать именно из этого раздела — может иметь значения 80h (раздел активен) и 00h (раздел не активен). Количество активных разделов должно быть не более одного.

Шестнадцатеричный однобайтовый код далее указывает на тип (ID) раздела. Например, 07h – раздел типа NTFS, 0Bh – FAT32, 17h – скрытый NTFS раздел, 27h – системный скрытый NTFS раздел для восстановления системы.

Немного про GRUB 2

GRUB 2 в настоящее время является основным загрузчиком для большинства систем Linux. Он позволяет запустить не только ядро Linux, но и Windows систему. Он имеет собственную командную строку с помощью которой можно, например устранить некоторые ошибки при загрузки.

Существует две версии загрузчика GRUB 2: для BIOS и для UEFI. Но для UEFI он не имеет цифровой подписи для режима Secure Boot.

Ubuntu, кстати, поддерживает Secure Boot. Для этого используется загрузчик Shim подписанный подписью от Microsoft. И этот загрузчик запускает GRUB 2, который подписан цифровой подписью от Canonical.

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

Когда отображается меню, вы можете нажать:

  • «Enter» — чтобы немедленно загрузить выбранную строку меню;
  • любую другую клавишу — чтобы остановить тайм-аут;
  • «e» — чтобы отредактировать запись;
  • «c» — чтобы войти в командную строку GRUB2.

Если ваш тайм-аут установлен на 0, то GRUB 2 немедленно загружает систему не показывая подобное меню.

На следующем уроке подробнее разберём загрузчик GRUB 2.

Сводка

Имя статьи
Алгоритм загрузки linux (BIOS/UEFI)

Описание
Если вам интересно узнать как загружается Linux, то эта статья для вас. Рассмотрим алгоритм загрузки Linux на компьютерах с BIOS и UEFI

Некоторые особенности работы с несколькими дисками

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

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

BootEasy для передачи управления на другой диск предложит вам еще один вариант выбора — F5. Если в MBR второго диска также установлен BSD-загрузчик, то будет выполнен анализ его таблицы разделов и сформировано меню для этого диска. Вернуться на первый можно той же клавишей F5.

А вот если вы используете NTLoader, то тут есть свои особенности…

В случае с LILO вы по-прежнему можете использовать описанную выше схему — сохраняя в файл образ соответствующего boot-сектора и подключая его в boot.ini. Но вот если на первом диске у вас установлена система Windows, а на втором — FreeBSD, и вы хотели бы использовать для загрузки NTLoader (в частности, чтобы иметь возможность безболезненно отключить второй диск), то, просто передав управление на образ загрузочного раздела (файл boot1), вы поставленную задачу не решите. Дело в том, что boot1 обращается к таблице разделов текущего диска, чтобы определить координаты сектора с системой FreeBSD. А поскольку текущим диском останется первый, то и поиск будет выполняться в его MBR-секторе. В результате вы вместо загрузки системы получите сообщение об ошибке.

Чтобы этого избежать, можно использовать образ MBR второго диска, в который должен быть установлен один из загрузчиков, и передавать управление на него. В случае с Linux особых проблем возникнуть не должно — во время инсталляции укажите, что хотите поставить LILO или GRUB в MBR второго диска (hdb), а после установки системы сохраните в файл образ MBR:

root# dd if=/dev/hdb of=bootsect.hdb bs=512 count=1

Теперь перепишите этот файл в Windows-раздел и настройте NTLoader, как было описано выше, и при выборе соответствующего пункта меню вы попадете в LILO или GRUB, который сделает всю оставшуюся работу.

Однако будьте предельно осторожны с загрузчиком BSD — он обязательно должен быть установлен, в нашем случае — в MBR второго диска, и использовать лучше образ этого сектора, снятый утилитой dd. Если это не было сделано, то файл boot0 не будет содержать таблицы разделов. А, как вы, должно быть, помните, BSD-загрузчик перезаписывает MBR, чтобы проставить признак активности раздела, загружавшегося последним. В итоге, если вы просто будете использовать boot0 в качестве образа MBR, то получите следующую схему:

  • Стандартный загрузчик из MBR первого диска находит активный раздел и загружает его boot-сектор.
  • Находящийся там NTLoader при выборе пункта FreeBSD загружает bootsect.bsd (который является копией boot0).
  • Загрузчик BSD, получив управление, загружает выбранную систему, проставляет признак активности в пустой таблице разделов и записывает ее в MBR.
  • Включив в следующий раз компьютер, вы обнаружите свой винчестер девственно чистым.

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

Разметка диска для MBR

cfdisk /dev/sda

Раздел загрузки и рута должны быть primary.

Размер загрузочного раздела должен быть 200 мегабайт или больше.

Для загрузочного раздела нужно поставить флаг Bootable.

Изменение типов разделов не требуется (тип Linux).

В результате должно получиться примерно так:

Раздел загрузчика должен быть отформатирован на выбор в ext2, ext3, ext4. Я выбираю ext2, поскольку он быстрее, а журналирование для раздела загрузки не требуется:

mkfs.ext2 /dev/sda1

Рут и пользовательские разделы на выбор в ext2, ext3, ext4 (рекомендуется ext4):

mkfs.ext4 /dev/sda2

Форматирование и инициализация раздела SWAP (если вы его сделали):

mkswap /dev/sda3
swapon /dev/sda3
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: