- Как загрузиться с раздела GPT?
- Это похоже на способ MBR, когда нужен раздел с установленным флагом загрузки?
- Как сделать раздел GPT загрузочным в Linux?
решение1
Как загрузиться с раздела GPT?
Загрузка установки Linux включает в себя несколько этапов и программных компонентов, включаяпрошивкаинициализация, выполнениезагрузчик, загрузка и запускядро Linuxизображение и исполнение различныхскрипты запускаидемоны. Для каждого из этих этапов и компонентов существуют различные вариации и подходы, например,GRUB,ЛИЛО,СИСЛИНУКСилиЛоадлинмогут использоваться как загрузчики, в то время как сценарии запуска могут быть как традиционными, так ив этом-стиль, или конфигурация системы может быть выполнена с помощью современных альтернатив, таких каксистемдилиВыскочка.
Еще одна популярная программа для загрузки —пересмотретьаМенеджер загрузки UEFIспособный запускатьЭФИСТУБядра.
TheЭФИ(Расширяемый интерфейс прошивки)системный разделилиЭСПраздел на устройстве хранения данных (обычно жестком диске или твердотельном накопителе), который используется компьютерами, придерживающимисяУнифицированный расширяемый интерфейс встроенного ПО(UEFI). Когда компьютерзагруженПрошивка UEFI загружает файлы, хранящиеся на ESP, для запуска установленных операционных систем и различных утилит.
ESP содержитзагрузчикиилиобразы ядрадля всех установленных операционных систем
Это похоже на способ MBR, для которого нужен раздел с установленным флагом загрузки?
Theфлаг загрузкиидет из древних времен, где вы могли бы указатьМБРзапись раздела как загрузочного, так что вы можете указать, где находится загрузчик. Так что, отвечая на ваш вопрос, нет, вам не нужно помечать загрузочный раздел как загрузочный.
Theглобальный уникальный идентификатор(GUID) дляЭФИсистемный раздел вТаблица разделов GUID(ГПТ) схема естьC12A7328-F81F-11D2-BA4B-00A0C93EC93B, в то время как его идентификатор вГлавная загрузочная запись(МБР) схема таблицы разделов - это0xEF.
Как сделать раздел GPT загрузочным в Linux?
- Вгдиск, вы устанавливаете код типа EF00. (gdisk использует двухбайтовые коды типов, которые расширяются до реальных кодов типов на диске; «EF00» — это просто мнемоническое обозначение для «C12A7328-F81F-11D2-BA4B-00A0C93EC93B".)
- ВGPartedили parted, вы устанавливаете «загрузочный флаг». Однако следует отметить, что это работает только на дисках GPT; вы не можете установить код типа ESP на дисках MBR с помощью этих программ. (Обычно это не имеет большого значения, поскольку компьютеры на базе EFI обычно загружаются с дисков GPT.)
- В последних версиях Linuxfdisk, вы задаете тип раздела по его номеру (1 для «EFI System» на GPT-дисках или 0xEF на MBR-дисках) или вводя полный код типа на GPT-дисках.
решение2
Это похоже на способ MBR, для которого нужен раздел с установленным флагом загрузки?
Хм, прежде чем мы кратко вспомним, как BIOS передает управление загрузкой, давайте рассмотрим следующее.
- BIOS считывает первый сектор (512 байт) загрузочного носителя.
- Если последние два байта сектора 55 AA, он выполняет этот сектор. Так что на этом заканчивается ответственность биоса.
Этот 440-байтовый фрагмент кода называется MBR (Master Boot record). Его цель — искать в записях таблицы 4 разделов флаг загрузки. Если он для какого-то раздела отмечен как загрузочный, он загрузит его первый сектор и передаст поток выполнения загрузки коду в этом секторе.
Обратите внимание, что для обеспечения совместимости так называемая защитная MBR присутствует даже при использовании GPT. (GPT начинается со второго сектора)
Так что это MBR-код, который заботится о «загрузочном флаге». Однако этот 440-байтовый MBR-код может быть изменен или отличаться. И когда действительно происходит установка GRUB, это как раз тот случай. Например, установка GRUB2 так:
sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb -v
Полностью заменит стандартный код MBR на свой собственный код. (обратите внимание, что копию этого кода можно найти по адресу /boot/grub/i386-pc/boot.img)
Вывод: -> Код Grub не будет обращать внимания на какие-либо загрузочные флаги.
Установка grub на не-EFI GPT-устройство
Под «не-EFI» я подразумеваю старое устройство, в BIOS которого нет UEFI или на котором UEFI работает в режиме CSM (модуль поддержки совместимости) и загружается традиционным способом, описанным выше.
Когда Grub устанавливается через «blocklists», он устанавливается в зазор между MBR и первым загрузочным сектором. Однако, когда мы используем GPT, Grub отказывается идти по этому пути зазора раздела. Вместо этого он хочет создать небольшой раздел, в который он может безопасно установить свой код.
Вот как мы это настраиваем, используяGparted:
- Создайте отформатированный раздел размером 1 МБ
- Пометьте этот раздел как «bios-grub». Когда вы установите флажок «bios-grub» в gparted, тип GPT изменится на «Загрузочный раздел BIOS».
В качестве альтернативы вы можете использовать:
gdisk -l /dev/sdb
для проверки и ...
sgdisk -t 3:ef02 /dev/sdb
^- помечает 3-й раздел как ef02 => 'Загрузочный раздел BIOS'
... чтобы сделать то же самое без gparted. Примечание: "ef02" — это сокращение от "BIOS boot partition" или GUID 21686148-6449-6E6F-744E-656564454649
.
Хорошо, вот и все. Теперь мы можем запустить установку Grub.
Смонтируйте Linux (или раздел /boot/grub) в /mnt/boot и запустите
-
sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb -v
Если вам повезло и все прошло хорошо, и вы видите:
grub-install: Info: setting the root device to `hostdisk//dev/sda,gpt6'.
grub-install: Info: saving <556324864,0,512>.
...
Так что содержимое /boot/grub/i386-pc/core.img
напрямую копируется в этот 1 МБ 'загрузочный раздел BIOS',
--force
иначе grub откажется устанавливаться через списки блоков. Если это не удастся, вот ярлык, чтобы снова попробовать начать с части списка блоков установки:
grub-bios-setup --verbose --force --directory= /mnt/boot/grub/i386-pc /dev/sdb
Итак, короче говоряgrub-bios-setupскопирую
/mnt/boot/grub/i386-pc/boot.img -> Sector 0 (MBR)
/mnt/boot/grub/i386-pc/core.img -> Sector 556324864 (BIOS boot partition)
Однако самая важная часть — «компиляция» core.img — им не выполняется.
я используюВиртуалбоксдля проверки процесса загрузки:
sudo chmod 666 /dev/sd*
VBoxManage internalcommands createrawvmdk -filename ~/sdb.vmdk -rawdisk /dev/sdb
Эта команда особенно полезна для помещения всего физического устройства в виртуальную машину.
<Правый ctrl> + R перезапускает виртуальную машину
«Веселье» со спасением личинок>
Просто краткий рывок, так как вы, вероятно, столкнетесь с этим по пути. Хорошо, цель — заставить эти 2 команды выполняться без ошибок:
> insmod normal
> normal
set
полезно для просмотра настроек.
ls
показывает, какие разделы есть,
ls (hd0,2)
показывает, какие файлы находятся на разделе №1, если найдена папка grub на (hd0,2),
set prefix=(hd0,2)/boot/grub
это команда, которая выведет вас. now insmod normal
и normal
перенесет вас в «обычное» меню grub. как только вы запустите normal.mod, стоит упомянуть еще одну интересную вещь:
ls (hd0,<tab>
предоставит вам более подробную информацию о том, какие разделы имеются, каковы их названия и какая файловая система используется.
Однако вернемся к теме.
Как разметить раздел с помощью grub.cfg?
Это происходит косвенно при установке grub. После этого это исправлено и почти невозможно изменить. Благодаря некоторым глупым решениям дизайна. Хорошо, давайте рассмотрим более подробно эту не очень хорошо спроектированную часть grub.
Ключ к этому core.img. Во время установки grub, который напрямую записывается в раздел размером 1 МБ, созданный нами для этой цели, он содержит скрипт, который может выглядеть примерно так
set prefix=(hd0,2)/boot/grub
insmod normal
normal
Этот скрипт и все драйверы файловой системы, которые ему понадобятся для доступа к разделу с файлами grub, будут склеены и сжаты (!!!) в core.img. Из-за сжатия вы не сможете использовать редактор дисков для его просмотра или изменения небольших вещей, таких как изменение (hd0,2) на (hd0,4) или подобных вещей, которые могут понадобиться вам для сортировки разделов GPT или внесения других изменений. Также нет возможности отключить сжатие (или, ну, есть переключатель, но он не работает). Кроме того, этот скрипт генерируется автоматически, и у вас нет возможности изменить его, чтобы сделать его немного более умным. Например, используйте search.label, чтобы найти нужный раздел Grub вместо фиксированных номеров разделов. Все, что вы можете частично сделать, это перезапустить установку grub и надеяться, что все будет в порядке для загрузки.
Примечание: Как ни странно, при использовании EFI все более открыто и удобно для быстрой настройки.
К сожалению, я все еще изучаю, как работает 'grub-install'. В настоящее время я возлюсь со странностями, как с ним возится сПДДхотя я явно указываю, что следует использоватьсдб.
Я могу отредактировать этот пост позже, если узнаю больше. EDIT: Хорошо, поехали. Вот как сделать «невозможное»:
nano /mnt/boot/grub/i386-pc/load.cfg
с
search.fs_uuid 39ff90d3-00b1-4cb9-8b94-03a7a9053352 root hd0,gpt6
set prefix=($root)'/mnt/boot/grub'
это дерьмо и не то, что мне нужно. Я меняю его на:
search.fs_label boot root hd0,gpt5
set prefix=($root)/grub
ух ты, выглядит лучше. :) ... теперь сгенерируем 'core.img'... :
grub-mkimage -O i386-pc -o /mnt/boot/grub/i386-pc/core.img -C none \
--prefix /grub -c /mnt/boot/grub/i386-pc/load.cfg \
ext2 ntfs part_gpt biosdisk search_label normal
Примечание: кроме ntfs я также добавил модуль 'normal' для большего комфорта в спасательной консоли. Теперь tab для завершения команды, а также курсор вверх-вниз для прокрутки истории команд будут работать.
И как уже упоминалось ранее, в настоящее время --Compression none
не имеет никакого эффекта. Core.img всегда сжимается с помощью xz.
... и записать его на диск:
grub-bios-setup -v -f -d /mnt/boot/grub/i386-pc /dev/sdb
То есть, с какого раздела начинать, зависит от того, что написано в grub.cfg и, конечно же, какие пользователи выбраны для загрузки.
Создание grub.cfg
Смонтируйте вашу систему Linux в /mnt/MINT, затем выполните:
grub-mkconfig -o /mnt/MINT/boot/grub/grub.cfg
Добавление поддержки UEFI
Подготовка: С помощью Gparted добавьте раздел FAT32 размером 1 МБ и установите Тип на «системный раздел EFI ef00». Я использую
sgdisk -t 11:ef00 /dev/sdb
^-, чтобы обозначить 11-й раздел как ef00 => «системный раздел EFI».
gdisk -l /dev/sdb
для проверки результата. Однако в большинстве случаев уже есть какой-то 'системный раздел EFI'. Так что в этом случае просто используйте его, вместо создания дополнительного.
«Системный раздел EFI» будет хранить grubx64.efi, который впоследствии загружается и запускается BIOS EFI.Обратите внимание, что EFI-Bios по умолчанию умеет читать как GPT, так и FAT32. Теперь монтируем
/mnt/boot -> Linux System containing grub.cfg
/mnt/UEFI -> The 'EFI system partition'
Теперь запустите grub-install:
sudo grub-install --boot-directory=/mnt/boot \
--efi-directory=/mnt/UEFI --target=x86_64-efi /dev/sdb -v
Не так уж много изменилось. Ну, --force больше не нужен, есть еще --target и нужны дополнительные аргументы --efi-directory