в течение нескольких дней я гуглил везде, чтобы узнать, были ли у кого-то такие же проблемы, как у меня. вот мое ядро Linux на моем Lenovo Z50-70 (возможно, это важно)
$ uname -a
Linux Z50-Debian 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux
$ lvdisplay |grep -i path
LV Path /dev/Debian/Home
LV Path /dev/Debian/Root
LV Path /dev/Debian/Swap
# gdisk /dev/sda -l |grep 0
GPT fdisk (gdisk) version 1.0.1
Disk identifier (GUID): 4A75B640-D8A2-03A2-906D-9D9228B6E800
Partitions will be aligned on 2048-sector boundaries
Total free space is 3707 sectors (1.8 MiB)
1 2048 3653631 1.7 GiB 2700 Basic data partition
2 3653632 4601855 463.0 MiB EF00 EFI system partition
3 4601856 6752255 1.0 GiB EF00 Basic data partition
4 6752256 7014399 128.0 MiB 0C01 Microsoft reserved ...
5 7014400 907063665 429.2 GiB 0700 Basic data partition
6 907065344 908787711 841.0 MiB 2700
7 908787712 910155775 668.0 MiB EF00
8 910155776 953745407 20.8 GiB 8E00 Linux
9 953745408 976773119 11.0 GiB 2700 Basic data partition
Я следовал двум руководствам по использованию efi-stub (самозагрузчик ядра UEFI)
официальный Debian Wiki на efistub и руководство bitbinary по Debian и Efistub
но ни один из них не сработал.
проблема 1:
Моя прошивка не находит EFI/Debian/vmlinuz.efi
(но она нашла приложение rEFInd efi, а также grub, когда я впервые установил Debian)
проблема 2:
при запуске vmlinuz.efi
через rEFInd
, он останавливает процесс загрузки с приглашением initramfs и ошибками, сообщающими мне, что не удалось смонтировать/найти root.
также
cat /proc/cmdline
не отображает мой /proc/cmdline
, а является общим без какой-либо указанной опции для монтирования root
проблема 3:
как в руководстве, которое я использовал efibootmgr
, но при каждой перезагрузке моя новая запись удаляется.
Я довольно новичок в мире (U)EFI, но мне бы очень хотелось, чтобы это сработало. Поскольку у меня сейчас почти нет идей, если вы знаете что-то, что может мне помочь, пожалуйста, кричите об этом!
Спасибо.
решение1
Этот вопрос старый, но поскольку на него нет ответа, и я недавно загрузил свою систему Archlinux с указанной конфигурацией, позвольте мне описать, как я это сделал. Моя спецификация:
OS : arch Linux (mainline kernel, Linux-zen kernel, linux-clear kernel).
System : HP laptop with UEFI 2.
Помимо этого я также пытался настроить безопасную загрузку с помощью собственных ключей (что еще больше усложнило настройку). Но я не буду касаться этой части здесь.
Первое, что вам нужно сделать, это настроить ваш, initramfs
чтобы иметь правильный hooks
. Это суть всей проблемы, с которой вы столкнулись (вероятно, и я тоже). Я имею опыт только в том, как Arch Linux собирает свой ramdisk/initramfs. Вам, возможно, придется преобразовать процесс для Debian (или любого другого дистрибутива, который вы можете использовать ).
Я начал с трех хуков, доступных в процессе сборки makinitcpio initramfs:
base hook ( this is the main and necessary hook )
udev hook ( it does the detection of the devices of the system including the hard disk and root filesystem ).
LVM hook ( since you have LVM, this hooks would include the device mapper and set up the LVM volumes ).
Создание EFISTUB
Используйте инструмент objcopy из пакета binutils.
objcopy \
--add-section .osrel="/etc/os-release" --change-section-vma .osrel=0x20000 \
--add-section .cmdline=<(echo -n "${cmdline}") --change-section-vma .cmdline=0x30000 \
--add-section .splash="${SPLASH}" --change-section-vma .splash=0x40000 \
--add-section .linux="${linux}" --change-section-vma .linux=0x2000000 \
--add-section .initrd=<(cat "${INITRD_PREPEND[@]}" "${initrd}") --change-section-vma .initrd=0x3000000 \
"${EFISTUB}" "${output}"
wait $!
Приведенная выше команда по сути берет ваше ядро, iniramfs и параметры ядра и преобразует их в единый EFISTUB, который вы можете напрямую загрузить из прошивки (UEFI).
Здесь:
$cmdline
- это в основном параметры вашего ядра, и они должны, как минимум, содержать корневой путь, например, в вашем случае root=/dev/Debian/root $SPLASH
это должно быть изображение, которое вы хотите отображать в качестве заставки при загрузке.
$EFISTUB
является общим linuxx64.efi.stub
, который поставляется с systemd
. На Arch Linux
, он обычно размещается в /use/lib/systemd/efi/
каталоге.
$output
- это место, куда вы хотите вывести файл (которое, очевидно, должно находиться в ```ESP (системном разделе EFI), чтобы прошивка могла его обнаружить).
Затем с помощью efibootmgr
можно сделать загрузочную запись вновь созданного EFISTUB
:
# efibootmgr -c -d /dev/sda -p 2 -L "Debian EFISTUB" -l /efi/EFI/debian/linux-efi.efi
В приведенном выше примере:
-c
означает создать (создать новую загрузочную запись)-d
предназначен для указания на диск, где находится ESP.-p
указывает на номер раздела этого диска.-L
предназначен для предоставления подходящей метки для загрузочной записи.-l
указывает на загрузчик (в основном efistub). Я предположил, что он находится в каталоге EFI/debian в ESP и который смонтирован в /efi.
Советы: работая над загрузкой efistub
, я обнаружил, что очень удобно иметь UEFI
оболочку. Вы можете попробовать много вещей из этой оболочки, включая загрузку ядра efistub
с пользовательскими параметрами ядра и т. д.
Руководство выше здесь загружает EFISTUB БЕЗ ПОМОЩИ КАКОГО-ЛИБО ЗАГРУЗЧИКА. Если вы загружаете несколько ОС (ядер), то вы можете добавить загрузчик для управления различными efistubs
.
решение2
Я думаю, можно сделать так, что найдёшь установочный диск Debian и подключишь к ПК. Потом загрузишься с диска и пройдёшь меню устранения неполадок и восстановление файлов vmlinuz и других загрузочных файлов.