четверг, 21 мая 2015 г.

Мультизагрзочная флешка с GRUB2 + UEFI

<< К статьям по программированию микроконтроллеров


В интернете нашел много разных вариантов как сделать мультизагрузочную флешку с UEFI. Но везде кругом костыли. Всякие ухищрения, чтобы эта гремучая смесь заработала. Сейчас расскажу как сделать ее на базе GRUB2.

1. Для Windows пользователей

Сейчас существуют два стандарта загрузки mbr и UEFI. Grub2 поддерживает оба. Есть такой нюанс, загрузка в этих двух стандартах отличаются, и я выложу сюда два архива. В одном архиве файлы настроены так, что несмотря на то, какой стандарт загрузки использовался (mbr или UEFI), будет подгружаться один и тот же конфигурационный файл (:\boot\grub\grub.cfg) ссылка
либо же будут использованы разные файлы для mbr загрузки (:\boot\grub\grub.cfg) и для UEFI загрузки (:\efi\grub\grub.cfg) ссылка
Для того, чтобы сделать загрузочный диск, просто запускаем скрипт createdisk.bat от имени администратора.

Дальше указываем нашу флешку,

и она готова через минуту.
Скрипт сделан на основе небезызвестной программы RMpartUSB - части проекта RMprepUsb

2. Настройка GRUB2


Grub2 настраивается через файл /boot/grub/grub.cfg

Документация от archlinux: ссылка (русский)

Официальная документация: ссылка

Переменные обозначаются в GRUB2 с помощью $ когда вы к ним обращаетесь.

Примеры загрузки:

Загрузиться с диска 1

menuentry 'boot from hd1' {
set root=hd1
chainloader +1
}

root - это переменная, которая говорит, какая файловая система считается основной. комманда chainloader +1 вызывает загрузчик устройства root

menuentry "Windows 7" {
search -s root --file /bootmgr
ntldr /bootmgr
}

первая комманда ищет раздел с файлом /bootmgr и загружает его

аналогично для загрузки windows 8 UEFI

menuentry "Windows 8 UEFI" {
  search --file --no-floppy --set=root /efi/Microsoft/Boot/bootmgfw.efi
  chainloader /efi/Microsoft/Boot/bootmgfw.efi
}

Для загрузки разных видов Linux'а делаем следующее:

menuentry "Arch Linux" {
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw
 initrd /boot/initramfs-linux.img
}

Заметьте, что необходимо передать в ядро параметры. Например, root=... В данном примере используется метка тома. Но возможно например указать его UUID

Если вам нужно загрузить ISO файл из GRUB2 то вот тут есть примеры (ссылка). Нужно смонтировать iso файл в loopback устройство и так же запустить ядро. В прниципе, с теми же параметрами, что оно вызывается в iso файле. Например:

menuentry 'ISO Ubuntu ' {
set isofile="/iso/ubuntu-12.04-desktop-amd64.iso"
loopback loop (hd0,5)$isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
initrd (loop)/casper/initrd.lz
}

Если вы хотите например загрузить PARTED MAGIC. его версия 2015_03_06 ищет файл \pmagic\pmodules\PMAGIC_2015_03_06.SQFS Вытащите его из образа и скопируйте на флешку. В эти же каталоги. так же нужно вытащить ядро и initrd файл. И запустить их например этими командами

linux /pmagic/bzImage edd=on vga=normal
initrd /pmagic/initrd.img /pmagic/fu.img /pmagic/m32.img

или же еще скопировать grub.cfg и вызвать его:
configfile /EFI/boot/grub.cfg

запустить например GRUB4DOS

menuentry "Grub4Dos" {
linux /boot/grub.exe --config-file=/boot/grub/menu.lst
}

3. Установка из Linux


Установить GRUB2 на флещку:

sudo grub-install --recheck --root-directory=/run/media/user/8260-A46C2 /dev/sdb

конечно, параметры нужно указать от своей системы. Все что после media. Важно правильно задать путь до флешки. без сокращений * и туда, куда она впервые примонтирована. А то GRUB2 выдаст ошибку.

собрать EFI образ:
grub-mkimage --compress=xz -O x86_64-efi -d /usr/lib/grub/x86_64-efi
-o /home/user/bootx64.efi -p "/boot/grub" part_gpt part_msdos
ntfs ntfscomp hfsplus fat ext2 normal chain boot configfile linux
multiboot efi_gop efi_uga font gfxterm

файл будет в /home/user.
опция -p "/boot/grub" говорит о том откуда будет читаться config файл и дополнительные модули, дальше перечисление встроенных модулей.

чтобы собрать efi файл, в который встроена и конфигурация и модули делаем так:

mkdir -p /tmp/grub.temp/boot/grub
создаем /tmp/grub.temp/boot/grub/grub.cfg
cd /tmp/grub.temp/
grub-mkstandalone  --directory="/usr/lib/grub/x86_64-efi/" --format="x86_64-efi" --compress=xz --output=/home/user/bootx64.efi boot/grub/grub.cfg

почему то важен относительный путь boot/grub/grub.cfg

и потом нужно для архитектуры x86_64 скопировать /usr/lib/grub/x86_64-efi в /boot/grub/

20 комментариев:

  1. Простите, я являюсь виндопользователем (качать образ бубна и дебиан неохота) и я хочу грузить ISO-файлы. для этого (как я понял), мне необходимы файлы vmlinuz и initrd.lz (это, как я понял, ядра системы???). Главный вопрос - не поделитесь этими файлами? Или где мне их скачать?

    ОтветитьУдалить
  2. Добрый день, те файлы, которые вы перечислили - это система инициализации linux. Если вы хотите грузить из образа именно линукс систему, то вам нужны файлы инициализации именно того образа, который вы собрались подгружать.

    ОтветитьУдалить
  3. Благодарю! Очень полезная статья с примерами. Помогла мне разобраться что и как делать. Раньше делал флешки на grub4dos, теперь он старал неактуален из-за этого uefi. Одно непонятно. Хотел обновить refind_x64.efi до последней версии, но он отказывается стартовать из Grub2. Вероятно автор знает какую-то хитрую команду, чтобы его самому собрать для этой цели, как это делает grub-mkimage? :) Архив для тестирования использовал grub2sep.zip

    ОтветитьУдалить
    Ответы
    1. Спасибо. А зачем refind запускать из grub? не легче его установить напрямую?
      у меня archlinux и там довольно приличная wiki. Вот статья по refind https://wiki.archlinux.org/index.php/rEFInd
      Сам я им не занимался, если честно.

      Так а может проблема в GRUB2? и нужно просто собрать свежий?

      Если нужно, могу собрать его.

      Удалить
    2. Вот и я тож потом подумал "а зачем refind?" ... просто на горизонтальное меню загляделся. :)
      Основываясь на Вашей инструкции и примерах, собрал всю флешку на чистом grub2. Теперь грузится по mbr и uefi. Модули grub2 для efi тож собрал под свои нужды (командой "grub-mkimage") - bootx64.efi и добавил bootia32.efi (у жены нетбук 32 битный). Тему соорудил свою, в общем удобно и красиво получилось - супер универсальная EFI-x86 - EFI-x64 - MBR флеха. :)
      После того, как разобрался с grub2, тоже не понимаю зачем костыли прикручивать, если все можно сделать средсвами grub2 ...

      Удалить
    3. Этот комментарий был удален автором.

      Удалить
    4. Кстати, у меня на grub4dos gfxmenu анимашка с пингвинами бегала. Симпатишная такая ... вот бы ее прикрутить к grub2 ... Вы не знаете КАК?
      Хочу сказать, что ненавижу всякие инструкции читать, я и так понятливый, пару языков программирования выучил не читая инструкции всякие. :) Примерчик бы живой или это из области unreal? ...

      Удалить
    5. Вот и славненько ^_^.
      Честно говоря, я не слышал про анимацию в grub2. Но моя специальность - электроника, я могу и не знать этого. А статью написал, чтобы в том числе самому не забыть. Если хотите какой-то свой вариант флешки скинуть, могу выложить здесь.

      Удалить
  4. может, кстати просто для rfind нужен модуль какой-то дополнительно в Grub2

    ОтветитьУдалить
  5. Если тема загрузки rEFInd из Grub2 кому-то еще актуальна, то у меня под EFI это работает так:

    search --fs-uuid --no-floppy --set=root 244C-62FA
    chainloader (${root})/EFI/Microsoft/Boot/refind.efi

    Я это дописал это в "грубый.конфиг" ручками, но в зависимости от того, как был установлен Grub2, в каждом конкретном случае могут быть и более правильные решения (чтобы запись не слетала при обновлениях).

    ОтветитьУдалить
  6. Как добавить в grub.cfg установку windows 10

    ОтветитьУдалить
  7. Добрый день!
    В скрипте createdisk.bat у вас есть команда:
    RMPARTUSB DRIVE=%drive% FAT32 USBHDD VOLUME=GRUB2DISK
    Ни в одном описании синтаксиса утилиты RMPARTUSB я не нашёл упоминания об "USBHDD". Что делает это включение?

    ОтветитьУдалить
    Ответы
    1. Я полагаю, что отформатировать как USB HDD. Может быть в новых версиях нет такого ключа?

      Удалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Добрый день.
    Подскажите пожалуйста как добавлять образы на флешку (какие нужны папки с ISO образа) win7/win8.1/win10/winsrv2016

    ОтветитьУдалить
  10. Можно ли оживить систему опенсусе, загрузчик которого сам из за конфликта с обновлением удалил. Там груб2 в отдельном физическом разделе, а система на LVM. Используются снапшоты, но не могу никак загрузить систему, чтобы лечить. Live CD, USB-образы не помогают, из них не узнает и не найдет папку x86_64_efi , a из винды решения не найду пока, линукс на GPT, win7 на MBR на другом HDD. Ваш метод позволит мне из вин7 создать флешку с груб2 и из него загрузить не образ нового линукса, а мой опенсусе, где много настроил и сайт лежит на сервере, а резервную копию пока там не делал. Советуйте мне что нибудь, чтобы не переустановить, а лечить систему. Заранее спасибо.

    ОтветитьУдалить
  11. Флэшка вместо exFAT или NTFS форматится в FAT32 - что исключает размещение на ней больших файлов (( Как быть?

    ОтветитьУдалить
  12. Этот комментарий был удален автором.

    ОтветитьУдалить