构建 EFISTUB

构建 EFISTUB

几天来,我到处搜索,看看是否有人遇到过和我一样的问题。这是我的 Lenovo Z50-70 上的 Linux 内核(也许这很重要)

 $ 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 自引导程序)

efistub 上的官方 Debian 维基Debian 和 efistub 的位二进制指南

但它们都不起作用。

问题一: 我的固件找不到EFI/Debian/vmlinuz.efi(但它确实找到了 rEFInd efi 应用程序,以及我第一次安装 Debian 时的 grub)

问题2: 当启动vmlinuz.efi通过时rEFInd,它会停止启动过程,并显示 initramfs 提示并错误告诉我它无法挂载/找到根目录。

cat /proc/cmdline 

不回显 my /proc/cmdline,而是一个通用的,没有任何指定的根安装选项

问题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

使用 binutils 包中的 objcopy 工具。

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 $!

上面的命令基本上获取您的 kernel 、 iniramfs 和内核参数,并将它们转换为单个 EFISTUB ,您可以直接从固件 (UEFI) 启动。

这里: $cmdline基本上是您的内核参数,它必须至少包含根路径,例如在您的情况下root=/dev/Debian/root $SPLASH应该是您希望在启动时显示为启动屏幕的图像。

$EFISTUBlinuxx64.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代表create(创建一个新的启动项)
  • -d用于指向ESP所在的磁盘。
  • -p指向该磁盘的分区号。
  • -L用于为启动项提供合适的标签。
  • -l指向加载器(基本上是efistub)。我假设它位于 ESP 中的 EFI/debian 目录下,并且安装在 /efi 下。

提示:在启动时efistub,我发现使用UEFIshell 非常方便。您可以从该 shell 尝试很多事情,包括使用自定义内核参数引导内核efistub等。

上面的指南是在没有任何引导加载程序帮助的情况下引导 EFISTUB。如果您要启动多个操作系统(内核),那么您可以添加启动加载程序来管理不同的efistubs.

答案2

我想,你可以找到debian安装盘并插入PC。然后从磁盘启动并通过故障排除菜单并恢复 vmlinuz 文件和其他启动文件。

相关内容