几天来,我到处搜索,看看是否有人遇到过和我一样的问题。这是我的 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
应该是您希望在启动时显示为启动屏幕的图像。
$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
代表create(创建一个新的启动项)-d
用于指向ESP所在的磁盘。-p
指向该磁盘的分区号。-L
用于为启动项提供合适的标签。-l
指向加载器(基本上是efistub)。我假设它位于 ESP 中的 EFI/debian 目录下,并且安装在 /efi 下。
提示:在启动时efistub
,我发现使用UEFI
shell 非常方便。您可以从该 shell 尝试很多事情,包括使用自定义内核参数引导内核efistub
等。
上面的指南是在没有任何引导加载程序帮助的情况下引导 EFISTUB。如果您要启动多个操作系统(内核),那么您可以添加启动加载程序来管理不同的efistubs
.
答案2
我想,你可以找到debian安装盘并插入PC。然后从磁盘启动并通过故障排除菜单并恢复 vmlinuz 文件和其他启动文件。