我试图在我的笔记本电脑(华硕 Zenbook UX305)上双启动基本操作系统和 Windows。为此,我使用 Windows 磁盘管理器缩小了 Windows 分区,然后使用基本安装程序的“与 Windows 一起安装”选项自动设置 Linux 分区。当我安装后重新启动时,我进入了 grub 控制台。我能够使用命令手动启动Linux
grub> set root=(hd0,gpt4)
grub> linux /boot/vmlinuz-3.19.0-26-generic root=/dev/sda4
grub> initrd /boot/initrd.img-3.19.0-26-generic
grub> boot
我发现运行命令
grub> configfile (hd0,gpt4)/boot/grub/grub.cfg
会按预期加载正常的 grub 菜单 - 所以配置文件本身似乎没有任何问题。我还发现根和前缀都在(hd0,gpt1)上,所以运行
grub> set root=(hd0,gpt4)
grub> set prefix=(hd0,gpt4)/boot/grub
grub> insmod normal
grub> normal
还加载了正常的 grub 菜单。那么问题可能是 grub 正在寻找错误的分区吗?
在我的 BIOS 中,我可以选择使用 grub 和 windows 引导加载程序进行引导。选择 Windows 引导加载程序可以直接引导我进入 Windows,没有任何问题。
但是,我找不到任何方法可以在重新启动后保留任何修复。我尝试过重新运行grub-install /dev/sda
、重新创建配置文件grub-mkconfig
以及使用 Ubuntu 启动修复 gui 工具 - 这些都不起作用。有什么方法可以解决重新安装一个或两个操作系统的问题吗?如果可能的话,我宁愿不必重新安装Windows。
答案1
我遇到了同样的问题,找到了解决方案:
1)在 grub 救援模式下,运行“set”
2) 它显示 prefix=(hd1,gp1)/boot/efi/EFI/ubuntu/
3) 就我而言,由于我有 KDE NEON,文件夹 /boot/efi/EFI/ubuntu/ 不存在,但文件夹 / /boot/efi/EFI/neon/ 它确实存在。所以问题是指向一个不存在的文件夹
4)所以我将所有文件夹 /boot/efi/EFI/neon/ 复制到 /boot/efi/EFI/ubuntu/ 。在我的例子中,这
也是错误的(hd1,gp1),因为它应该指向 hd1,gpt5。但我 DINDT 改变了这一点并且它起作用了。
我更改的是文件 /boot/efi/EFI/ubuntu/grub.cfg,以使用 msdos 格式:
search.fs_uuid xkjdiw-18e9-4d0a-ac55-2skjdh8425f root hd1,gpt5
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
答案2
GRUB 菜单似乎无法加载,因为它正在读取/boot/efi/EFI/grub/
.
启动进入elementaryOS后,运行以下命令来替换grubx64.efi
该文件夹中的文件。
cd /boot/efi/EFI/grub
sudo cp grubx64.efi grubx64.efi.backup (just in case)
sudo rm grubx64.efi
sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/grub/grubx64.efi
该解决方案来自用户讨论elementaryOS 中报告的错误。详情请见:https://bugs.launchpad.net/elementaryos/+bug/1492801
我遇到了与您完全相同的问题(我已经与 Windows 10 一起安装了elementaryOS Freya 0.3.1),并按照您描述的步骤操作,然后找到了此解决方案。
值得注意的是,在应用修复程序之前,我在 Windows 10 中禁用了快速启动,这可能会也可能不会产生影响。看http://www.tenforums.com/tutorials/4189-fast-startup-turn-off-windows-10-a.html
此外,我必须禁用安全启动才能使其正常工作。启用安全启动后,我的 UX305 无法完全加载 grub。在启动时按第一个屏幕上的 Esc 键,然后进入设置并从那里关闭安全启动。或者,可能有一种方法可以让安全启动正常工作,但我现在对这个解决方案很满意 - 我的 UX305 现在加载带有 Windows 选项的 GRUB 菜单!
答案3
我们可以
我找到了一个解决方案,如何永久更改前缀。但是,它有以下警告:我们必须直接在 grubx64.efi 二进制文件中更改它,并且必须保持文件相同的长度。给你多少空间可能取决于你的分布。请继续阅读以获得进一步的解释。磁盘和分区的设置取决于您在启动时选择的 UEFI 引导选项加载的分区。
免责声明
- 如果你想这样做,你必须关闭安全启动因为哈希值将发生变化并且二进制文件将被拒绝。不确定是否可以通过安装您自己的哈希值来解决此问题(搜索 MOK)。
- 始终做好备份您正在更改的文件的数量。如果您像我一样操作,您将能够通过可启动 U 盘。如果您手头没有其他系统,请立即创建一个可启动 USB 并测试是否可以启动它。
首先是问题:
基本上,整个问题是安全启动的限制。为了让安全启动接受 grubx64.efi 文件,它必须签名由公认的权威机构。因此,该 grub 可执行文件已签名并且预烤的。当前设置此前缀的标准似乎是/EFI/$(lsb_release -i -s)
.这当然也意味着 - 无论您在创建新的引导选项时指定哪个加载程序路径(例如efibootmgr--loader \\EFI\\other\\SSHIMX64.efi
),它都不会影响 grub 引导加载程序中的前缀变量。
解决方案:
假设我们的发行版是ubuntu
,出于某种原因我们想将其重命名为longubuntu
,我们可以按照以下步骤进行操作:
# List contents of EFI directory
find /boot/efi/EFI;
# Rename the directory
mv /boot/efi/EFI/ubuntu /boot/efi/EFI/longubuntu;
# List contents of EFI/longubuntu for easy access
find /boot/efi/EFI/longubuntu;
# Always make a copy of the original
cp /boot/efi/EFI/longubuntu/BOOTX64.CSV /boot/efi/EFI/longubuntu/BOOTX64.CSV.bak
# Inside the .csv-file change 'ubuntu' to 'longubuntu'
nano /boot/efi/EFI/longubuntu/BOOTX64.CSV
在继续之前:
检查是否有有足够的空字符可用在二进制文件中。重要的是要保持总长度相同。如果你不这样做,它会抛出一个错误 - 如果这种情况发生在你身上,那么复制回原来的grubx64.efi然后再试一次。什么时候使用 VS Code 检查我的 grubx64.efi-binary我确实有足够的可用空间来更改我心中内容的前缀:
现在到有趣和关键的部分:
正如我已经说过的,我们需要确保二进制文件保持相同的长度。我们可以通过用 nul-chars ( ) 填充新前缀\0
或用 nul-chars 填充文本来替换。
因此,如果您想指定更长的前缀(如我的情况),您可以这样做:
# Parameter -pi.bak will create a backup for you
perl -pi.perlbak -e 's/EFI\/ubuntu\0\0\0\0/EFI\/longubuntu/g' /boot/efi/EFI/longubuntu/grubx64.efi
如果您选择较短的前缀(例如bent
),则用 填充新值\0
:
# Parameter -pi.bak will create a backup for you
perl -pi.perlbak -e 's/EFI\/ubuntu/EFI\/bent\0\0/g' /boot/efi/EFI/longubuntu/grubx64.efi
您可以检查操作结果,它将打印包含前缀的行。
$~: grep -a 'EFI\/longubuntu' /boot/efi/EFI/longubuntu/grubx64.efi
不要忘记添加新的启动选项!
我会用efibootmgr
。我们efibootmgr
可以删除旧的启动选项并添加新的启动选项。
# Print current boot options
:~# efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000
Boot0000* ubuntu HD(1,GPT,28bd5547-5802-4f9c-97da-22ddd968dea6,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
# Delete current
:~# efibootmgr -b 0 -B
# List disks
:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
[...]
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot/efi
└─nvme0n1p2 259:2 0 238G 0 part /
# Create new boot option
:~# efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Long Ubuntu Name" --loader \\EFI\\longubuntu\\shimx64.efi
享受:
当你现在重新启动时。您仍然应该像以前一样启动到您的发行版。
如果没有,则引导至 USB 记忆棒并安装 EFI 分区。然后撤消更改或复制回原始文件。在我的设备上,我像这样安装 EFI 分区:
:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
[...]
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot/efi
└─nvme0n1p2 259:2 0 238G 0 part /
:~# mkdir -p /media/efi; mount /dev/nvme0n1p1 /media/efi