我之前是把Linux放在移动硬盘里,而我近期都是在使用Linux而不是Windows,所以需要从原来的NVME固态硬盘里腾出空间给Linux,以更方便地进入Linux。作为一个多年微软软件受害者,涉及到硬盘的事情第一反应是进入WinPE操作分区并拷贝分区,而非在Linux下进行操作。这大概是一种路径依赖。本文讲述的就是软盘君在使用这个不优雅的方式进行操作的过程和导致的一些问题。

本文包括了把Windows添加到GRUB菜单中以提供Dual boot支持。使用EFI。

操作分区 链接到标题

进入WinPE后,压缩Windows分区。我顺手删除了Windows用于恢复的分区,不知道有什么负面影响。主要是我觉得分区太多了看起来很烦。以及我删除了Windows的EFI分区,但是请你注意,如果你接下来还需要通过grub启动Windows,请不要这样操作以避免产生额外的步骤。

启动DiskGenius、傲梅分区工具之类的分区工具,把已有的EFI分区和Linux根目录所在的分区拷贝到nvme硬盘的空闲空间中,另外按照原样创建一个Linux swap分区。如果原先的ext分区不够大的话,该扩容的扩容,当然如果在Linux下扩容ext4分区更方便。

之后,重启电脑,结果发现不能进入grub。

修复grub 链接到标题

进入Debian安装盘,修复grub。本人使用的是Debian发行版,所以参考Debian Wiki。

先开机进入Debian的Live CD,进入Rescue Mode。之后简单配置一下,到网络那一步就可以退出来然后进行我们需要的操作了。

选择进入急救模式,选择你安装Linux的分区(nvmeXnXpX),下一步,挂载/boot/efi,下一步。

进入Shell,然后按照Wiki上(GrubEFIReinstall)的进行操作。

在控制台中运行

mount -t efivarfs none /sys/firmware/efi/efivars

进行这一步之后可以避免在安装grub时无法为EFI设置GRUB的环境变量(我不是特别了解,所以描述的大概不是很精确)。

随后,把该挂载的都挂载上。由于我只分了一个区,所以没有太多麻烦的步骤。如果你分了很多区,请按照Wiki描述的进行操作。

随后,部署grub

grub-install /boot/efi
update-grub

下一步,不出意外的话,重启电脑就能见到GRUB的界面了。如果你没有执行update-grub,则会出现grub的命令行界面。

(可选)修复Windows引导 链接到标题

由于我一开始手贱删掉了Windows的EFI分区,所以有了这一步。如果按照我总结的经验,大概是没有这一步的。

进入WinPE,使用UEFI修复工具,修复Windows的引导,然后重启电脑就没事了。本人使用的是EasyU,没有遇到什么问题。

添加Windows到GRUB菜单 链接到标题

运行

sudo os-prober

如果能看到Windows,则说明你它可以识别到Windows的引导了。如果没有,则会输出空。e.g.:

iruanp@Floppy-Laptop:~$ sudo os-prober
/dev/nvme1n1p5@/efi/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager:Windows:efi

接下来,编辑/etc/default/grub,修改GRUB_DISABLE_OS_PROBER为false。

然后,更新grub。

sudo update-grub2

重启电脑,不出意外就可以直接启动Windows了。

遇到的问题 链接到标题

上文基本上把我踩了的坑都踩了。

目前还有一些问题,就是我完成了这些操作之后,Linux启动的时候,日志输出一会儿会卡在那里一会儿,然后继续,显示启动gdm之后,屏幕上只显示一个白色的文字光标。在等待很长时间之后,才会进入登录界面。

我不清楚这是什么问题,看dmesg,gnome-shell有segfault报错。我是Linux的Newbie,所以暂时还没能够解决该问题。希望有人能告诉我该怎么处理。除了重装。