这几天在VirtualBox虚机里玩Modular MAX下的LLama3大模型,实在受不了这执行速度,于是下决心把Ubuntu系统安装在硬盘上跟Windows11做双系统共存。之前在传统BIOS引导模式下做过不少次双系统引导,EFI模式下第一次做,加之windows系统比较霸道,安装过程中踩了不少坑,略记以备忘。
在安装了Windows11的电脑上安装Ubuntu2404系统并实现双系统共存,首先要在windows下给Ubuntu系统腾出磁盘空间,一般腾出一个100BG大小的分区,Windows下基本上都EFI Boot + GPT分区,需将windows的快速启动功能关闭。其次在ubuntu官网下载系统镜像,制作U盘启动安装盘。第三步在电脑的UEFI配置界面里(华为电脑是按F2)将Sercure Boot特性关闭,使用启动U盘启动。第四步是用启动U盘安装Ubuntu系统,安装程序会自动配置EFI启动记录,并在GRUB启动管理器里增加Windows系统的引导项(通过ChainLoader)。一切正常的话安装会很顺利,重新启动进电脑的Boot选项界面(华为电脑是按F12,各家品牌不完全一样)就可以看到ubuntu和windows两条启动项,默认第一条是ubuntu,可以在ubuntu下使用efibootmgr调整启动顺序。
第一步,Windows下的准备工作。
首先是给Ubuntu系统安装腾出足够的磁盘空间,可使用磁盘管理器进行操作:在开始按钮上点击鼠标右键,弹出菜单中选择“磁盘管理”快速进入磁盘管理器,也可以按开始按钮或开始键,输入“磁盘管理”选择“创建并格式化硬盘分区”应用进入磁盘管理器。在磁盘管理器可以看到EFI分区是第1个分区,windows使用的是GPT分区(分区即是卷)。比较简单的方式是找个大的分区把数据备份出来,删除分区再重新划一个给Ubuntu安装使用。
还一个很重要的操作是将Windows的快速启动功能关闭掉,否则会很麻烦:安装完ubuntu后,重启进入windows会把EFI引导记录给恢复到原来状态,即把ubuntu的引导项给删除掉,到时不得不用Ubuntu的启动安装U盘启动做修复。操作的方法是进入控制面板的电源选项(不是设置里的电源选项),在开始菜单下输入“控制面板”进入控制面板应用,进入“系统与安全”,在“ 电源选项 ”下进入“更改电源按钮的功能” ,点击“更改当前不可用的设置”,取消勾选“启用快速启动(推荐)”项。这项功能是在Windows独占电脑的情况下,对各磁盘分区和EFI启动进行缓存,启动时使用缓存信息以加快启动速度,但双系统启动模式下就必须将其关闭。
第二步,下载Ubuntu安装镜像并制作启动安装U盘。
这一步比较简单,属于常规操作。到www.ubuntu.com官网下载Ubuntu桌面版最新推荐镜像即可,下载到本地硬盘。然后按官网推荐下载使用使用Etcher (https://etcher.balena.io/#download-etcher )制作启动安装U盘,按操作提示做即可。需要注意是此操作会清除U盘中的所有数据,需提前做好数据备份。
第三步,启动系统安装Ubuntu。
这也是常规操作,把启动安装U盘插入电脑U口,启动电脑按F2(各品牌不一样)UEFI配置界面里将Sercure Boot特性关闭,保存退出重启后按F12进入Boot启动选项,选择U盘启动。启动后进入Ubuntu引导界面,选择try and install ubuntu项进入,按提示一步一步安装即可。安装时选择手动分区,将根分区/安装在预留给Ubuntu系统的分区上,在这里可以打开terminal窗口,通过sudo blkid、sudo lsblk命令找到预留安装的分区和EFI分区。对于传统的IDE和SATA等接口硬盘设备文件名一般是/dev/sd*,对于nvme接口的固态盘一般是/dev/nvme*,如EFI分区一般为/dev/nvme0n1p1。Windows的引导数据和Grub的引导数据都会写在这个EFI分区上(FAT32格式),在Ubuntu里会mount到/boot/efi目录,EFI引导文件在/boot/efi/EFI/ubuntu目录下。
安装完后拔出U盘重启,按F12进入EFI的boot启动选择界面即可看到ubuntu和windows两条启动项,可按需进入不同系统。如果想把windows引导项设备默认项,可以进入ubuntu后使用efibootmgr命令调整启动顺序。
查看EFI引导项信息
sudo efibootmgr
调整EFI启动顺序
sudo efibootmgr -o num1, num2, ..., numx
其中numx是各引导项的序号,通过第一条 sudo efibootmgr命令的输出结果中可以看到。
附:各种异常处理
安装过程中可能会出现各种各样的异常情况,都可以通过命令行操作或第三方工具来修复。
1、Ubuntu的EFI引导记录被删除后的修复
前面提到过如果没有关闭windows的快速启动功能,安装完ubuntu后重新进入windows后Ubuntu的EFI引导项会被删除掉,这里就需要使用ubuntu的启动安装盘重新启动进行EFI引导项的修复。
重新启动进入ubuntu的Live环境后(即安装界面),可以打开terminal窗口通过efibootmgr命令修复或通过重新安装grub修复,或通过boot-repair工具修复。
1)通过boot-repair工具修复
使用boot-repair工具修复比较简单,安装工具后执行boot-repairy自动修复即可。
首先在live环境下安装boot-repair工具:
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt update
sudo apt install -y boot-repair
执行boot-repair进行自动修复:
sudo boot-repair
按照boot-repair的指示进行操作即可。
2)手工进行修复
使用Ubuntu的启动安装U盘启动,进入ubuntu的Live环境,挂载硬盘上Ubuntu的各系统分区,chroot到硬盘Ubuntu系统,重新安装grub,退出重启即可。
a. 挂载硬盘上安装的Ubuntu和各系统分区。
在Ubuntu Live环境中,打开terminal终端,sudo blkid、sudo lsblk命令找到EFI分区和系统分区。如前所述SATA接口的硬盘一般为/dev/sd*,如果是nvme接口的则是/dev/nvme*,如/dev/nvme0n1pX,其中X是分区序号,而EFI分区一般是/dev/nvme0n1p1。
将ubuntu根分区/挂载到/mnt下,其他分区在/mnt下相应目录挂载。
挂载根系统分区(例如根root分区是/dev/nvme0n1pX):
sudo mount /dev/nvme0n1pX /mnt
挂载boot分区(如果/boot是单独的boot分区 /dev/nvme0n1pY)
sudo mount /dev/nvme0n1pY /mnt/boot
挂载EFI分区(即/boot/efi,/dev/nvme0n1p1)
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
挂载系统生成的文件系统:
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt/$i; done
b.使用chroot切换到硬盘上的Ubuntu系统:
sudo chroot /mnt
c.重新安装GRUB:
grub-install
update-grub
d.退出chroot并重启:
exit
sudo reboot
2、通过efibootmgr命令修改EFI引导项
如果想修改EFI引导项顺序和引导项名称,可以通过电脑EFI引导界面提供的功能调整,如果电脑本身没有提供这功能,可以通过efibootmgr命令实现。前面提到过通过sudo efibootmgr -o命令调整引导顺序,但efibootmgr并没有提供直接修改引导项名称的功能,只能通过删除引导项再增加引导项的方式实现修改引导项名称:
#删除对应的bootnumX数字对应的引导项
sudo efibootmgr -d bootnumX -B
#添加引导项,其中EFI分区在/dev/nvme0n1硬盘的第1分区,--lable是引导项的名称
sudo efibootmgr --create --disk /dev/nvme0n1 --part 1 --label 'Ubuntu 24.04.1 LTS' --loader \\EFI\\ubuntu\\shimx64.efi
也可以通过第三方工具rename-efi-entry实现:
#通过git下载工具
git clone https://github.com/s-n-ushakov/rename-efi-entry
cd rename-efi-entry
#bootnumX是EFI引导项的标号
sudo ./rename-efi-entry.bash '*' 'Ubuntu 24.04.1 LTS' bootnumX
详细操作说明可查看github上相应的说明
GitHub - s-n-ushakov/rename-efi-entry: A Bash script to rename EFI boot entriesA Bash script to rename EFI boot entries. Contribute to s-n-ushakov/rename-efi-entry development by creating an account on GitHub.https://github.com/s-n-ushakov/rename-efi-entry