众所周知,安装双系统时需要先安装windows,再安装linux。linux安装时,grub会探测到已有的windows,并且一并进行启动引导。

但这次是先装了Ubuntu, 再装Windows11,并且原有的启动引导被覆盖。这时候便需要重新安装grub。

跟安装linux时一样,准备一个可用于启动的U盘/镜像,准确的说法是Live CD, 通过它启动到机器上。跟正常安装系统不同,这次不要走安装程序,直接用上Live CD的终端。

现在大多数机器均是用uefi方式启动的了,因此硬盘上一定会有一个EFI分区(在Windows中又叫ESP分区,本质上都是同一个东西)。

先挂载该EFI分区(假如说是sdX1)

mount /dev/sdX1 /boot/efi

用grub-install指令安装grub。(target参数是机器的架构,efi-directory是方才挂载的efi分区路径,bootloader-id是启动项的名称,在bios页面可以看到的,可自行定义)

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

注,在该步骤时如果出现错误提示 error: failed to get canonical path of '/cow(或者别的什么鬼名字)',可以创建一个空文件系统在这个位置,以绕开该问题

dd if=/dev/zero bs=1M count=1 of=/tmp/cowfile	#创建一个空文件,大小1M,用0填充。文件位置在哪无所谓
mkfs -t vfat /tmp/cowfile	#格式化这个文件为fat文件系统
mv /tmp/cowfile /cow	#把刚才的文件移到根目录下,命名为报错那个

最后,生成grub的配置文件,并放到efi分区对应的启动项目录中(注意目录名称要与前面设置的bootloader-id一致,例如这里为GRUB)

grub-mkconfig -o /boot/efi/EFI/GRUB/grub.cfg

补充知识 grub如何识别操作系统、

grub在安装或者执行"update-grub"时,会扫描所有分区,看分区中是否存在已知的操作系统引导文件。

例如,对于Windows的系统分区(即C盘),检查\Windows\Boot\EFI\bootmgfw.efi或者\bootmgr

对于Linux的根目录,检查/boot/vmlinuz文件;对于boot分区,检查/vmlinuz文件

识别到,即创建为启动项