Как файловые системы поддерживают загрузку в «старом» стиле?

351
sherrellbc

Я нахожусь в процессе написания простого загрузчика ОС (сначала загрузка в устаревшем режиме). После понимания процесса загрузки ( MBR, загрузка VBR и т. Д.) Я начал изучать спецификации для разных файловых систем, чтобы понять, как они справляются с этим старым стилем загрузки.

Это необходимо, поскольку загрузочная запись тома (VBR) по своей конструкции расположена на диске в первом секторе «активного» раздела. Другими словами, байты первого сектора (обычно 512 байтов) на самом деле представляют собой не структуры данных файловой системы, а загрузочный код операционной системы.

Сначала я посмотрел на FAT за его простоту. К своему удивлению я обнаружил ссылки на « загрузочный сектор », встроенный прямо в спецификацию. В частности, когда вы форматируете диск с помощью файловой системы FAT, можно вначале «зарезервировать» некоторое количество секторов для специальных блоков кода, таких как VBR. В этом случае все структуры данных файловой системы смещаются на это количество зарезервированных блоков. Большой! Это именно то, что я искал.

Однако я не смог найти что-то похожее в других файловых системах (в частности, ext). Эти другие файловые системы должны поддерживать «унаследованный» стиль загрузки (например, пространство для VBR для начальной загрузки ОС), поскольку они были доступны задолго до спецификации загрузки UEFI.

1
Вы ошибаетесь в том, как работает процесс загрузки Linux. Нет необходимости в VBR, если код MBR понимает достаточно файловой системы для загрузки следующего этапа, который не подвержен ограничениям пространства. Daniel B 6 лет назад 0
Кроме того, [ext2 имеет 1024-байтовую область загрузочного кода] (http://www.nongnu.org/ext2-doc/ext2.html#DISK-ORGANISATION). Daniel B 6 лет назад 0
[Btrfs, кажется, имеет 64 КБ] (https://superuser.com/a/1208690/432690). Kamil Maciorowski 6 лет назад 0
@DanielB Процесс не специфичен для Linux. DOS загрузился таким образом. Процесс хорошо известен. MBR получает выполнение в `0x0000: 0x7c00`, он перемещает сам себя, определяет« активный »раздел и загружает свой VBR (первый сектор) по тому же адресу,` 0x0000: 0x7c00`. Этот VBR был первым этапом загрузчика, специфичным для установленной ОС. Конечно, именно так это и было сделано изначально, и этот процесс развивался в течение последних 40 лет. Вы, конечно, не _не нуждаетесь в VBR, особенно если установленный вами загрузчик, такой как GRUB, перезаписывает MBR своим собственным кодом, специфичным для его схемы загрузки. sherrellbc 6 лет назад 0
@DanielB В MBR и VBR есть только 512 байт для работы, поэтому я ожидал, что реализация будет довольно упрощенной. Также спасибо за ссылку про доп. Я ковырялся в вики и не мог найти его там. sherrellbc 6 лет назад 0

1 ответ на вопрос

2
Kamil Maciorowski

Эти другие файловые системы должны поддерживать «унаследованный» стиль загрузки (например, пространство для VBR для начальной загрузки ОС), поскольку они были доступны задолго до спецификации загрузки UEFI.

Нет, им не нужно. См. GNU GRUB Руководство 2.02 :

Формат таблицы разделов, традиционно используемый на платформах BIOS компьютера, называется форматом основной загрузочной записи (MBR); Этот формат позволяет использовать до четырех основных разделов и дополнительных логических разделов. С этим форматом таблицы разделов GRUB можно установить двумя способами: он может быть встроен в область между MBR и первым разделом (называемый различными именами, такими как «загрузочная дорожка», «разрыв MBR» или «встраивание»). область », которая обычно составляет не менее 31 КиБ), или образ ядра может быть установлен в файловой системе, и список блоков, из которых он состоит, может быть сохранен в первом секторе этого раздела.

У каждого из них свои проблемы. Невозможно зарезервировать пространство в области встраивания с полной безопасностью, и известно, что некоторые проприетарные программы используют его, чтобы пользователям было сложно обойти лицензионные ограничения; и системы иногда разбиваются, не оставляя достаточно места перед первым разделом. С другой стороны, установка в файловую систему означает, что GRUB уязвим к перемещению своих блоков такими функциями файловой системы, как хвостовая упаковка, или даже агрессивными fsckреализациями, поэтому этот подход довольно хрупок; и этот подход можно использовать только в том случае, если файловая система / boot находится на том же диске, с которого загружается BIOS, поэтому GRUB не нужно полагаться на угадывание номеров дисков BIOS.

Команда разработчиков GRUB обычно рекомендует встраивать GRUB перед первым разделом, если у вас нет особых требований. Вы должны убедиться, что первый раздел начинается не менее 31 КиБ (63 сектора) с начала диска; на современных дисках зачастую преимущество в производительности заключается в том, чтобы выровнять разделы по большим границам, так что первый раздел может начинаться на 1 МБ с начала диска.

Это означает, что загрузчик может находиться перед первым VBR или даже внутри самой файловой системы.

Хорошо обязательно. Я не собирался подразумевать, что это был _only_ способ загрузки. Раньше так было до того, как GRUB предпринял попытку "единого загрузчика". Я также могу убедиться, что это реализовано на практике. На прошлой неделе я провел некоторое время, изучая код GRUB в QEMU. Я извлек три его этапа (загрузка из моего поста в [this] (https://forum.osdev.org/viewtopic.php?f=1&t=32764&sid=47b854391c0c8fc2fd8e77f0526f5a3f) теме). Я обнаружил, что GRUB перезаписал MBR в 0-м секторе и имел его эквивалент VBR в 1-м секторе, а затем его второй этап во 2-м секторе. sherrellbc 6 лет назад 0
Спасибо за ссылку и цитату. Мои исследования привели к тому, что я обнаружил, что GRUB хранит свои MBR и этапы в первых секторах на диске (после MBR, но до первого раздела), но я нигде не смог найти ссылки на это. Это заставило меня задуматься, как бы это компенсировало случай, когда пользователь попытался установить в существующую систему, в которой не было этого «зарезервированного» пространства. Эта цитата показывает, что это требуется, если только файлы не хранятся в файловой системе. Я также обнаружил, что `fdisk` резервирует первые 2048 секторов, а` cfdisk` резервирует первые 63. sherrellbc 6 лет назад 0
@sherrellbc: Я полагаю, что некоторые загрузчики (например, Lilo) помещают этап 2 в файл, а затем жестко кодируют местоположение LBA этого файла в коде MBR. Возможно, рискованно, но очень широко распространено. (Разве в MSDOS не было чего-то подобного?) grawity 6 лет назад 0

Похожие вопросы