用了一段时间的X280后,突然想在M.2接口上加装一个 NVMe 2242 的SSD,发现 Lenovo 的BIOS设置的非常奇特。能够检测到这个硬盘,但是启动项里就是不能识别!或许是直接就给禁用从 NVMe0 启动也不一定,反正就是在 加装硬盘上安装了 Ubuntu 之后就再也找不到它的存在了。在原 Windows10 下只能看到几个需要格式化的盘符,或者连盘符也有可能看不到。
Ubuntu (GPT) 分区如下:@ /dev/nvme0n1
需要工具 DiskGenius 加载 GPT的分区盘 /EFI,发现在 /dev/nvme0n1 下的 /EFI 是空的, 在 /dev/sda1 下仅仅有 /EFI/Microsoft 和 /Boot 两个文件夹 —— 正常情况下至少还有一个 Ubuntu 的文件夹。
成功的解决办法:
使用工具 Rufurs 和 Ubuntu-18.04-LTS-amd64.iso 制作一个 GPT分区 的 UEFI 启动盘,然后把其中的 /EFI 下的 /boot/grub 和 /boot/grubx64.efi 和 /boot/bootx64.efi 等文件复制到 /dev/sda1 下的 /EFI/Ubuntu 的目录下。(例如:/EFI/Ubuntu/grubx64.efi 和 /EFI/Ubuntu/boot/)
使用下面的 命令 在windows10下 win+x +a, 更改 Window Boot Manager 的启动项:
bcdedit /enum firmware # 查看本机的启动项
# bcdedit /set {fwbootmgr} default {bootmgr}
# bcdedit /set '{bootmgr}' path \EFI\Microsoft\Boot\BOOTMGFW.EFI
bcdedit /set '{bootmgr}' path \EFI\Ubuntu\GRUBX64.EFI
bcdedit /set '{bootmgr}' path \EFI\Ubuntu\SHIMX64.EFI
或者新建一个 Ubuntu Boot Manager 的启动项:
efibootmgr -v
sudo efibootmgr -c -w -L "Ubuntu Boot Manager" -d /dev/sda -p 1 -l \\EFI\\Ubuntu\\shimx64.efi
# or
# sudo efibootmgr -c -w -L "Linux Boot Manager" -d /dev/sda -p 1 -l \\EFI\\Ubuntu\\grubx64.efi
(后来发现,其实这个过程也可以省略。可以使用工具 EasyBCD 工具新建一个 Ubuntu Linux 启动,在启动界面选择 Ubuntu Linux 引导启动,然后按 ESC 键盘进入 GRUB2 系统)
事先在/EFI/目录下建立 Ubuntu 文件夹,然后把 fw fwupx64.efi grub.cfg grubx64.efi mmx64.efi shimx64.efi 复制到目录(/EFI/Ubuntu/)下即可。
再进行Ubuntu登陆操作前,还需要使用U盘的Live系统去查看一下Ubuntu系统根目录所在的分区:
例如,/dev/nvm01n1p4
启动的时候,系统一般会直接跑到引导系统 grub2.02 下,然后输入下面的命令就可以进入 Unbuntu Linux 的登陆界面了。
grub> ls # 显示硬盘分区符
grub> ls (hd1,gpt1)/EFI/Ubuntu # 逐个盘符,确认分区盘位置
# 需要提前确认的信息
# a) EFI分区 (hd1,gpt1)
# b) Ubuntu 系统根目录 / 所在分区 /dev/nvme01n1p4
# 然后
root=(hd1,gpt1)//EFI/Ubuntu/boot
linux $root/vmlinuz-5.0.0.23-generic ro text root=/dev/nvme0n1p4
initrd $root/initrd.img-5.0.0.23-generic
boot
成功地 进入Ubuntu 系统登陆界面了,后面的事情就好办了。使用 efibootmgr 命令 把 (hd0, gpt1) 即 /dev/nvme0n1中 p1 分区的 /EFI/Ubuntu/shimx64.efi 链接到启动项:\\EFI\\Ubuntu\\shimx64.efi ,并给该启动项起个名字 "Ubuntu Boot Manager",命令如下:
$ sudo efibootmgr -c -d /dev/nvme0n1 -p 1 -l \\EFI\\Ubuntu\\shim.efi -L "Ubuntu Boot Manager"
$ sudo efibootmgr -v
如果还不行,那就再次通过 GRUB2 进入系统,使用工具 repair-boot 修复。
Ubuntu 引导修复成功后,在 /etc/default/grub 中可修改 默认启动项:
sudo gedit /etc/default/grub
将文件 grub 中的 GRUB_DEFAULT=0 根据需求作修改。
将数字改成你想要启动的项,修改完保存关闭。然后再在终端中执行
sudo update-grub
首先,需要知道系统的 ESP (EFI System Partition) 在哪,然后在 Windows 和 Linuxs 系统下分别进行如下操作。
#(没有盘符的情况下,程序自动识别)
bcdboot C:\Windows /l zh-cn
#(假设已经知道 ESP 盘符为 X: ,一般建议在 Win PE 或 Win RE 中分配盘符)
bcdboot C:\Windows /s X: /f UEFI
#(假设 ESP 挂在 /boot/efi 下)
grub-install --efi-directory=/boot/efi --boot-directory=/boot --target=x86_64-efi
列出所有引导项:
efibootmgr -v
删除指定引导项:
efibootmgr -b XXXX -B # XXXX 为对应的后四位数字
一般来说,每个系统的引导在 ESP 根目录下的 EFI 目录下都有自己的目录,像这样:
如果你不想要某个系统的引导,直接把它删掉就行了。
比如你想要删除 Windows 的引导,那就:
引导无论是在 Windows ,Win PE ,Win RE 还是 Linux,Live CD 下安装都是可以的。学会用这几条命令以及他们的相关参数,你想装哪都可以,装 U 盘上也没人管你,只要你的 UEFI BIOS 能识别出来就行了。
最后,这是我的 ESP:(那个 101MB 的 rescx64.efi 是因为它包含了一个完整的 GRUB 环境,还有 SystemRescueCD 的 vmlinuz 和 initramfs ,以及 SuperGRUB2Disk 的一些配置文件和我自己写的配置文件在里面,通过 grub-mkstandalone 命令制作。)
编辑于 2018-05-25
作者:知乎用户
链接:https://www.zhihu.com/question/276289613/answer/400414145
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
sudo gedit /etc/default/grub
sudo update-grub
没法子,只能设法从 Windows10 启动,然后引导 ubuntu 起来干活了。
方法一:
使用easybcd。安装好Ubuntu后,按照教程设置EasyBCD,重启动。选择Linux,提示:
文件:\NST\AutoNeoGrub2.mbr
状态:0xc000007b
信息:无法加载应用程序或操作系统,原因是所需文件丢失或包含错误。
猝!
方法二:
来自《Windows下设置Ubuntu引导项》(Windows下设置Ubuntu引导项 - yhjoker - 博客园)
(我很奇怪,为什么很多人在windows下添加ubuntu引导时都用easybcd - Ubuntu中文论坛)
使用Windows自带的引导程序对linux进行引导,即将Ubuntu的相关引导信息加入Windows引导程序的配置文件中(一般是修改boot.ini文件),从而通过Windows的引导程序进行引导。这种方法对于Windows XP和Windows 7更为有效,因为这两个系统的引导程序和配置文件都位于活动分区中,对其的修改更简单,而之后的Windows引导程序好像不再使用boot.ini作为配置文件了,引导的设置更加复杂了。Windows 7下的具体引导设置可以参考这里。具体的操作流程包括将Linux的启动扇区作为一个文件拷贝至Windows的活动分区,并在boot.ini中设置一个指向该启动扇区文件的项目,从而使得引导程序可以根据该设置去引导Linux系统。借助安装有linux安装程序的U盘,选择试用linux,找到安装linux启动模块的设备名,如/dev0/sda5等,使用dd命令获得所需的文件。
dd if=/dev0/sdax of=ubuntu.mbr bs=512 count=1 //从指定文件/dev/sdax读取数据,读取512个字节,并输出到ubuntu.mbr文件中,从而得到linux启动的mbr
再将该文件放置到默认开机Windows系统的活动分区,修改相关的boot.ini文件即可。
该种方法笔者做过尝试但并未成功。个人认为这应该是最符合自身需求的方式,但失败原因不详,望能得到指点。(好像有结论说该种方式只能在Legacy BIOS模式系统中使用)
通过Windows8.1 / Window10自带的工具bcdedit来进行开机启动设置。该工具在Windows NT之后的系统中提供。可通过bcdedit工具修改Win8.1下的BCD配置文件 和 设置对应的引导文件路径,这样Windows引导程序可以根据配置文件内容生成对应的引导菜单,引导程序也可根据设置路径信息找到对应的系统程序。bcdedit的操作指令在文章开始的链接中有介绍。或者可以直接通过图形界面工具easyBCD进行配置。
若自行手动配置,则需要新建一个启动引导项,给出相应的引导文件所在分区和路径、引导描述等参数。该种方式对于Windows系统引导其他Windows系统,如Win8.1引导Win10启动是有效的。但貌似在Windows8.1中引导Linux系统无法成功(最大的问题在于无法设置对应的path路径)。图示为笔者设备双系统Win10的相关信息。
Ubuntu12.04以及后续版本引入了对EFI模式的支持,所以可以将Ubuntu的引导程序GRUB安装在设备的EFI分区中(原系统Win8.1在安装时会划分,可以在磁盘管理中定位),此操作会在EFI分区中生成引导Ubuntu的文件,从而可以引导Ubuntu,《EFI GPT 预装Win8下ubuntu12.04的安装与引导》原帖。但该贴的内容仍旧是通过Linux系统来引导Windows系统。笔者这里并没有使用Linux系统来引导Windows系统,而是让两个系统的引导程序相互独立,想要使用另一个系统时,则通过BIOS修改引导程序的使用顺序。
首先将Ubuntu安装至EFI分区,其中的目录内容会发生改变,在EFI文件夹下新增了ubuntu的引导程序。
linux下的启动分区即EFI分区挂载在/boot/efi下(可以通过df指令查看)
可以看到原EFI目录中新增了ubuntu目录
目录中的内容如图所示,其中的grubx64.efi和shimx64.efi均可进行Ubuntu系统的引导。其中前者无法在开启安全启动选项下进行启动。
此方法的实际原理是Ubuntu和Windows使用两个不同的引导系统,通过BIOS可以设置使用引导程序的顺序。当默认首先使用bootx64.efi作为引导程序时,则会引导Windows系统,而首先使用grubx64.efi作为引导程序时,则会引导Linux系统。这样的两个系统之间无法进行相互引导,但也保证了两个系统本身的情况不会相互干扰。设备开机时总是会默认载入BIOS中设置的第一顺序的引导程序对应的操作系统。这种方法相当于将Linux启动引导安装在EFI分区,从而多出一个启动文件grubx64.efi。通过选择grubx64.efi/bootx64.efi来对不同的系统进行引导。
Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)