我在我的笔记本电脑上安装了 Linux Mint 以及预装的 Windows 10。 当我打开电脑时,大部分时间都会出现正常的 GRUB 菜单:
但是在启动 Linux 或 Windows 然后重新启动后,我 GRUB 以命令行模式启动,如下面的屏幕截图所示:
可能我可以键入一个命令以从该提示符启动,但我不知道。有效的是使用 Ctrl+Alt+Del 重新启动,然后反复按 F12 直到出现正常的 GRUB 菜单。使用这种技术,它总是加载菜单。不按 F12 重新启动总是在命令行模式下重新启动。
我认为 BIOS 启用了 EFI,并且我在 /dev/sda 中安装了 GRUB 引导加载程序。
为什么会发生这种情况,我如何确保 GRUB 始终加载菜单?
正如评论中所建议的,我尝试清除grub-efi软件包并重新安装它。这并没有解决问题,但现在当它在命令提示符模式下启动时,GRUB 显示以下消息:
error: no such device: 6fxxxxx-xxxx-xxxx-xxxx-xxxxxee.
Entering rescue mode...
grub rescue>
Run Code Online (Sandbox Code Playgroud)
我检查了blkid命令,这是我的 linux 分区的标识符。也许这些额外的信息可以帮助弄清楚发生了什么?
我一直在搜索,但没有找到一种明显的方法来了解 GRUB 是在系统引导中使用 UEFI,还是 BIOS 兼容模式,或完整的 BIOS。我只找到了Windows 方法。GRUB 或内核引导日志中是否有显示我使用的是 UEFI、EFI 或 BIOS 的内容?
大多数发行版会在 UEFI 系统上安装额外的引导加载程序。UEFI 本身是一个引导加载程序,它提供了一个菜单来选择不同的操作系统或单个内核。此外,UEFI 设置可以使用用户空间工具轻松更改,例如efibootmgr.
内核从 3.3 开始支持 EFI_STUB,这意味着内核可以直接从 UEFI 加载。发行版决定使用额外的引导加载程序的原因是什么?大多数关于 Linux/UEFI 的教程主要关注如何设置额外的引导加载程序(rEFInd、grub2、ELILO 等),而不是使用 EFI_STUB 引导 Linux。
发行版中唯一缺少的是支持。由于大多数发行版链接了第二个引导加载程序,因此内核不会添加到 UEFI 引导菜单,也不会复制到 EFI 系统分区。
三个脚本足以完成所有魔术。一种将 initramfs 复制到 ESP 的方法。第二个将内核复制到 ESP 并在 UEFI 启动菜单中创建一个新条目。第三个脚本从 ESP 中删除旧内核和 initramfs,并删除 UEFI 启动菜单项。这允许完全自动化的内核/initramfs 更新/清除,而无需用户交互。一年多以来,我一直在使用这种方法,并且效果很好。
为什么大多数发行版使用 grub 而不是 EFI_STUB?
链接:
编辑:我不是在谈论完全删除 grub 支持,而是为那些出于各种原因想要使用它的人提供选择。发行版可以grub-efi为那些想要链接 UEFI 和 grub 的人提供一个包,以及一个efistub-boot包含我上面提到的脚本的包。
我正在尝试使用 QEMU (kmv) 模拟 EFI 环境;使用 archboot 在 EFI 模式下启动 virtualbox 需要 15 分钟。
使用传统 BIOS 模式,我可以使用以下命令启动:
root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -kernel ../bzImage -initrd ../rootfs.gz -append "rw root=/dev/ram0 ramdisk_size=40960"
Run Code Online (Sandbox Code Playgroud)
它适用于我的自定义内核和文件系统。
file ../bzImage
../bzImage: Linux kernel x86 boot executable bzImage, version 3.6.1 (root@citsnmaiko-deb) #4 , RO-rootFS, swap_dev 0x3, Normal VGA
Run Code Online (Sandbox Code Playgroud)
它也有 EFI 支持。
我正在尝试对从此处下载的 EFI 文件执行相同操作
wget http://ufpr.dl.sourceforge.net/project/edk2/OVMF/OVMF-X64-r11337-alpha.zip -P ovmf
cd ovmf/
unzip -x OVMF-X64-r11337-alpha.zip
# rename the files for QEMU find them
mv OVMF.fd bios.bin
mv CirrusLogic5446.rom vgabios-cirrus.bin
# start QEMU
root@citsnmaiko-deb:/home/maiko/uefi/ovmf# …Run Code Online (Sandbox Code Playgroud) 作为背景,我刚刚用现代硬件构建了一台新机器,包括:
鉴于此,我尝试在 SSD 上安装各种版本的 Linux,几乎每次都失败。我尝试从 USB 拇指驱动器安装 Arch、Debian stable、Debian sid 和 Ubuntu 12.10,但是当 BIOS 看到 USB 驱动器并开始从它启动时,一旦操作系统尝试枚举 USB 设备,我就失去了所有 USB 功能(包括引导设备)。
最后我刻录了一张 DVD 并将 Ubuntu 12.10 安装到 SSD 上。应该注意的是,我的 USB 键盘(和鼠标)在 American Megatrends UEFI/BIOS 中工作正常。即使我在 Live Ubuntu DVD 上的预安装菜单中,键盘也能正常工作。
一旦 Linux 启动(Live DVD 或 SSD),我就失去了所有 USB 功能,只能使用 PS/2 键盘导航操作系统。
我在 dmesg/syslog 中看到的是关于“ failed to load microcode amd_ucode/microcode_amd_fam15h.bin”的几行,我可以看到 USB 设备初始化失败。
如果我这样做,lsusb我可以看到所有 USB 主机控制器,但看不到任何设备。做一个lspci向我展示了我期望的所有硬件。并且做一个lsmod我没有看到加载的任何 USB …
我正在尝试将 Arch linux 安装到新的(非常糟糕的)HP Pavillion 15 笔记本电脑上。
这是一台基于 UEFI 的机器。经过几次摆动后,我已经走得很远了。传统模式在系统设置中被禁用,我已经通过 EFI 引导到我刻录的 Arch DVD,并通过 Arch初学者指南和更高级的安装指南进行到我安装 grub 的地步。
在chrooted 时,我执行:
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
Run Code Online (Sandbox Code Playgroud)
这会发出大量输出,包括:
此系统不支持 EFI 变量
我第一次到这一步时,我继续安装,不知道这是否是一个实际问题。原来是这样,因为当我重新启动机器时,找不到可启动的媒体,机器拒绝启动。那时我可以进入 UEFI 设置菜单并选择要启动的 EFI 文件,然后 Arch Linux 就会启动。
但我现在要回去重新安装,试图解决上述问题。
如何让 GRUB 正确安装?
我有一个现有的 Windows 7 GPT 安装,它已经有一个 EFI 系统分区。
我现在正在尝试在单独的硬盘上安装 Linux,该硬盘也是 GPT 格式。我没有找到任何可以在没有 EFI 系统分区的情况下启动 grub 的工作方法,所以我的问题是:
grub2 是否可以使用与 Windows 相同的 EFI 系统分区?我如何告诉 grub2 使用它?
澄清我的设置:
gpt /dev/sda:
1 EFI System partition created by windows (100MB)
2 "Microsoft reserved partition" (200MB)
3 Windows root (rest of disk)
gpt /dev/sdb:
# After answering my own question: this partition is not needed
1 boot partition containing grub, kernels etc.(32MB)
2 crypto LVM partition (rest of disk)
Run Code Online (Sandbox Code Playgroud)
我希望 grub2 使用现有的/dev/sda1EFI 分区。
PS:我的主板支持 EFI。
我正在阅读一些如何使用 EFI 存根 (efistub) 加载 Linux 内核的教程。这些指令经常使用内核引导参数add_efi_memmap。预期的硬件是具有 8GB RAM 的 Intel x64。我当前的设置正在运行grub-efi引导加载程序和内核 v3.13。
GRUB引导,而不在add_efi_memmap引导参数:
23BIOS-e820 线数dmesg | grep BIOS-e820: | wc -l 243EFI 内存行计数dmesg | grep efi:\ mem | wc -l24保留的页面GRUB引导与 add_efi_memmap和EFI存储器映射大小似乎确实有所不同:
23 BIOS-e820线57 EFI 内存线22保留的页面EFI 存根启动没有 add_efi_memmap:
22 BIOS-e820线60 EFI …我目前在这件事上找到的所有信息都不足以满足我的口味。它要么是过时的,要么是误导性的,要么是错误的,似乎过于复杂或没有涵盖这个特定问题。
目标:
原因:
没有解决办法:
Debian live 和 install 映像是isohybrid 的,可以方便地使用dd. 它们确实可以通过这样的 USB 驱动器工作,这非常好!但是,如果不编辑包含在实时 ISO 映像的只读 ISO9660 文件系统中的 grub 和 isolinux 配置,则默认情况下将没有持久性,也无法从非英文键盘布局开始。因此,即使将 live ISO 写入 USB 驱动器后,这些参数仍然无法更改。
我打算在未来几天购买一台新笔记本电脑,我对新的、酷炫的超极本印象深刻。作为 GNU/Linux 的长期用户,我当然会在其上安装我选择的发行版。
很有可能我必须购买一台预装了 Windows 8 的电脑;并且很有可能它会运行 UEFI 并具有“安全启动”,在该安全启动上未签名的内核将无法启动。
UEFI 可能不错,BIOS 可能需要退休。我猜毛茸茸的东西是Secure Boot。
据我所知,一些受信任的证书将嵌入到固件中,因此嵌入到内核等中。如果内核的证书可以追溯到固件中的任何一个,内核将启动,否则 UEFI 会告诉我关闭并拒绝启动。此过程将阻止未经认证的软件启动。这可能有好处,尽管我看不到它们。
我想知道开源内核如何获得这些密钥之一并且仍然是免费的。我已经阅读了 Linux 邮件列表上的一个线程,其中 Red hat 员工要求 Linus Torvalds 提取一个变更集,该变更集实现了解析 PE 二进制文件的工具并采取一组复杂的操作让内核在安全启动模式下启动(据我所知)。他们想这样做是因为微软只对 PE 二进制文件进行签名。Torvalds 先生善意地拒绝了这个变更集,指出内核已经实现了标准,而不是 PE。RedHat 正在尝试将此代码推送到内核,以便他们有一天不必分叉它。
看,这是一件复杂的事情。让我问我的问题:
这将如何影响开源和免费内核、爱好者/学术内核开发人员等。例如,这会引导吗(一个非常基本的引导扇区代码):
hang:
jmp hang
times 510-($-$$) db 0
db 0x55
db 0xAA
Run Code Online (Sandbox Code Playgroud)这个网站上的一条新闻是对这个问题的启发。一个名为 …
uefi ×10
grub2 ×4
boot ×3
linux-kernel ×3
boot-loader ×2
dual-boot ×2
arguments ×1
bios ×1
debian ×1
gpt ×1
linux ×1
live-usb ×1
persistence ×1
qemu ×1
secure-boot ×1
ubuntu ×1
usb ×1
windows ×1