LINUX.ORG.RU

Скопировать Debian на новый диск с EFI и Grub

 , ,


0

2

Пытаюсь для общего развития развить понимание как работают все эти загрузчики и EFI и все такое. И вот чего-то понимаю, что не понимаю.

Экспериментирую в virtualbox.

Сделал виртуальную машину, разбил там диск на три раздела: efi, boot и корневой. (sda1, sda2, sda3). Установил туда debian 9. Загрузка efi вроде как. Все нормально, все работает.

Пытаюсь скопировать такой debian на другую виртмашину. Тоже также ее разбил (но нарочно другие размеры дисков), но пытаюсь обойтись копированием файлов с первой машины и ничего не получается.

Прописал флаги boot,esp на /dev/sda1 второй машины, отформатировал с fat32 и просто скопировал EFI с первой на вторую.

Еще раздел boot линукса тоже отформатировал и скопировал.

Не получается, при загрузке сразу консоль EFI и все. Изменил UUID sda2 на второй машине на туже, что у первой - и ничего.

Что я не допонимаю тут? И вот еще что, везде пишут, что в efi должен быть каталог Boot и там лежать загрузчик bootx64.efi но в работающей машине только EFI/debian/grubx64.efi и больше ничего.

Мда, говорили, efi - это проще MBR, никаких смещений, просто fat32 и загрузчик и вот фигня какая-то.

EFI есть для двух платформ 32 и 64 битной.

Для 64-битной версии имя efi файла, который будет по умолчанию грузиться /EFI/Boot/bootx64.efi, для 32-битной - /EFI/Boot/bootia32.efi.

Если имя файла отличается от имени по умолчанию, то в efi нужно вносить соответствующую запись.

Это делается через efivars.

Поэтому сходит в гугл, либо на wiki Arch Linux или Gentoo и почитай как работать с efivars, либо просто переименую файл с efi образом загрузчика.

А так у тебя установщик системы прописал в efivars загрузку нестандартного efi файла.

anonymous ()

Мда, говорили, efi - это проще MBR, никаких смещений, просто fat32 и загрузчик и вот фигня какая-то.

EFI - это просто, даже вообще всё просто, только нужно прочитать документацию. А не действовать наобум.

anonymous ()
Ответ на: комментарий от anonymous

либо просто переименую файл с efi образом загрузчика.

Переименовал (создал /EFI/Boot скопировал туда grubx64.efi и переименовал в bootx64.efi) - не помогло. Сразу shell uefi-шный по-прежнему.

praseodim ★★★★ ()
Ответ на: комментарий от anonymous

В документации на EFI много чего и там нет ничего про grub. В документации на grub много чего и там нет про efi (подразумевается, что всем все понятно). Понять как они совместно работают в итоге непросто. А есть еще порог вхождения. Если для «простой EFI» надо потратить многие часы, прежде чем ее попробвать на практике - что-то тут не то.

praseodim ★★★★ ()
Последнее исправление: praseodim (всего исправлений: 2)

Бред какой-то. Какие три раздела? Для EFI-загрузки ОС достаточно двух: первого GPT EFI с бинарным загрузчиком и второго GPT с файловой системой ОС. По крайней мере, так FreeBSD загружается с M.2 NVMe SSD.

iZEN ★★★★★ ()
Ответ на: комментарий от praseodim

Путь по умолчанию – /EFI/Boot/bootx64.efi – переименуй. Но лучше добавить запись по человечески как говорил анонимус.

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

Сейчас у тебя про груб EFI ни чего не знает. Читай ту же арчвики.

mandala ★★★★ ()
Последнее исправление: mandala (всего исправлений: 1)
Ответ на: комментарий от praseodim

Только что поставил VirtualBox 6.0.4, Extension Pack для него, создал виртуалку, включил поддержку EFI.

Загрузился с systemrescuecd-5.3.2 в режиме EFi.

В загруженной системе посредством gdisk создал GPT разметку и один раздел:

gdisk /dev/sda
ввёл:
o
n
1
2048
+1G
l
1
ef00
w
Далее создал файловую систему:
mkfs.fat -F32 /dev/sda1
Затем смонтировал его:
mount /dev/sda1 /mnt/custom
и скорировал EFI загрузчик из загруженной системы:
cp /livemnt/boot/efi /mnt/custom -R
cp /livemnt/boot/boot /mnt/custom -R
Всё, далее выключил виртуалку, изъял ISO образ и включил виртуалку.

Запустился EFI загрузчик.

Проделай теже операции, заметь что в ISO образе имя EFI файла загрузчика /efi/boot/bootx64.efi.

Более я ничего не прописывал.

Пробуй, должно получиться, а далее разбирайся что ты сделал не так.

Если скопируешь также директорию isolinux и файл sysrcd.dat, то сможешь загрузить Live систему и проверить, что есть /sys/firmware/efi/efivars - это показатель что система запустилась в EFI режиме.

anonymous ()
Ответ на: комментарий от anonymous

Спасибо. Пробую сейчас по-разному. И как mandala написал тоже. Debian действительно в efivars прописал загрузку с EFI/debian/grubx64.efi

Разберусь и что получится/не получится - отпишусь.

praseodim ★★★★ ()
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от Vsevolod-linuxoid

Да, у меня с помощью bootmgr удается прописать загрузку из EFI\debian\grubx64.efi и видно, но после выключения VM, эта запись пропадает. Судя по гуглу это давняя проблема. Может в 6 -й версии пофиксили наконец-то. (из шелла впрочем загрузчик вызывается нормально)

Ща дальше разбираюсь с копированием. Где и как править uuid диска, а то дальше не идет.

praseodim ★★★★ ()
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от praseodim

Да, у меня с помощью bootmgr удается прописать загрузку из EFI\debian\grubx64.efi и видно, но после выключения VM, эта запись пропадает. Судя по гуглу это давняя проблема. Может в 6 -й версии пофиксили наконец-то

Должно работать с именами файлов по умолчанию, т.е. bootx64.efi.

Проделай для понимая операции как я описал с использованием загрузчика systemrescuecd.

Прописывать ничего не нужно будет в данном случае.

Где и как править uuid диска, а то дальше не идет.

Нужно смонтировать корневую файловую систему, /boot и efi раздел, /dev, /proc, /sys, сделать chroot, поправить UUID в /etc/fstab и перенерировать конфиг загрузчика.

anonymous ()
Ответ на: комментарий от anonymous

Должно работать с именами файлов по умолчанию, т.е. bootx64.efi.

Проделай для понимая операции как я описал с использованием загрузчика systemrescuecd.

Это я уже понял. Что тут у виртуалбокса (и говорят у многих матерей тоже) кривой uefi тоже понял. Тут тогда надо прописать в «removable media path» - что не совсем правильно.

Нужно смонтировать корневую файловую систему, /boot и efi раздел, /dev, /proc, /sys, сделать chroot, поправить UUID в /etc/fstab и перенерировать конфиг загрузчика.

Я вместо этого нашел как править готовый initramfs https://backreference.org/2010/07/04/modifying-initrdinitramfs-files/ - если вкратце, то или ганзипнуть его и потом смонтировать образ (если там raw-образ) или в текущей директории gunzip -c initrd |cpio -i затем редактировать и упаковать заново. Если там не образ, а cpio

find . | cpio -H newc -o | gzip -9 > ../initrd.img-4.9.0-8-amd64 в моем случае

Все пошло, поехало, но тут еще детище Поттеринга - systemd откуда-то старые uuid нашло, сейчас разбираюсь где и чего ему не сидится, почти уже загружает даже, то есть пошла работа и бац systemd. Или fstab не доредактировал оказывается...

praseodim ★★★★ ()
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от anonymous

В общем, получилось скопировать!!!

Если совсем вкратце для этого надо после копирования (с точностью до конкретной системы, у кого-то они другие будут):

1. efibootmgr -c -d /dev/sda -p 1 -w -L debian -l \EFI\debian\grubx64.efi

Если глючное uefi такого не понимает или еще какие глюки, то ставится в efi removable path то есть, создается каталог \EFI\boot и туда копируется grubx64.efi и переименовывается в bootx64.efi

2. Для нового /dev/sda2 с помощью tune2fs -U выставить старый uuid (узнается blkid) или поменять в grub.cfg uuid (а также номера /sda2 /sda3 и прочие, если надо)

3. Отредактировать initramfs если надо.

4. Отредактировать /etc/fstab с правильными uuid и другими номерами.

5. Должно грузиться.

praseodim ★★★★ ()
Ответ на: комментарий от praseodim

А можно проще.

После копирования корневой ФС загрузится в лайвсд, чрутнутся в скопированную ФС и переустановить груб. Ну и в fstab поправить UUID

FireFighter ★★ ()
Последнее исправление: FireFighter (всего исправлений: 3)