如何将UEFI启动下的双系统Linux分区迁移到新硬盘?

摘要:本文介绍 UEFI 的工作原理,以及在双系统(Windows与Ubuntu)环境下,通过调整分区大小、迁移数据、扩展Linux分区及修复Grub引导配置,解决空间不足问题的完整流程。重点解析了UEFI启动机制下,因分区移动导致的引导失效现象
前言 我的台式电脑上,装了 Windows 和 Linux 双系统。 我有两块 1 TB 硬盘,就把它们叫作硬盘 0 和硬盘 1 吧。最开始的时候,硬盘 0 上装了 Windows 系统,而我的数据分区装在硬盘 1 上面。 后来呢,我想体验 Ubuntu,于是用安装程序调整了硬盘 1 的 Data 分区大小,然后在那里装了系统。 一切都很好,直到一天 Ubuntu 提示我空间不足。 经过一些合理的构思,我打算这么做: 清理 Windows 磁盘空间 调整 Windows 分区大小到 500 G 清理磁盘 1 上的数据 复制 Data 分区到磁盘 0 的空闲区域 扩展磁盘 1 的 Ubuntu 系统分区 调整系统引导,正确启动系统 话不多说,我们先来看看一开始的分区示意图。 然后,我们要达到的目标: 结果在迁移过程中,耗费最久时间的不是数据复制,而是引导的配置。 所以,本文就从电脑启动开始,带你深入了解双系统的工作原理,相信你看完就能随便调整电脑了。 从 BIOS 到 UEFI 电脑电源接通之后,BIOS(基本输入输出系统,电脑内置)会自动检查各个核心部件(CPU,内存,硬盘……),然后获取启动优先级配置。 如果你 USB 啥都没插,也没有对 BIOS 进行设置,那么肯定直接从硬盘启动。 怎么启动呢?传统的 BIOS 会从硬盘第一扇区找到 MBR(主引导记录,里面记录了分区表,和启动引导程序),执行其中的引导程序。引导程序会执行启动操作系统。然而,现在的系统引导或许放不下,那么 MBR 中的引导就不会直接启动系统,而是传递给硬盘指定位置上的二级引导程序。 好了,现在引导程序已经运行,而我们的系统也随之启动,这样整个启动过程也就完成了。 但是先等等!我们有两个硬盘啊!我怎么知道该启动哪一个? 前面说过了,BIOS 中配置了启动优先级,因此,可以有多个 MBR 放在不同硬盘上,而用哪一个都是由 BIOS 配置的。 但是这种启动方式现在已经不常见了,因为它老旧、只支持最大 2 TB 硬盘,所以已经被淘汰了。 它的后继者,叫作 UEFI。 我们再来看看上面的图片。 EFI 分区是啥!? 相信你也注意到了,我们的硬盘上有叫作 EFI 分区 的东西。 EFI 分区中,就保存着启动操作系统所需的引导程序。 EFI 分区可以随意调整大小,因此突破了 MBR 大小受限、位置必须在第一扇区的问题。 和 BIOS 传统启动一样,UEFI 也可以配置启动顺序。每个 EFI 分区都会列出,然后你可以选一个来启动。 引导程序 Windows 的引导叫作 Windows Boot Manager。很简单,上面图里硬盘 0 的 EFI 里存着的就是它。而 Linux 通常用的是 Grub,它可以启动 Linux 系统。当我们在安装时,安装程序会自动配置 Grub 的配置文件,向启动添加多个启动项。 默认的启动项如下: Ubuntu(自己启动 Linux) Windows Boot Manager(交给 Windows 引导处理) 你可以在启动时自由选择,根据你的选项来启动不同系统。 迁移硬盘 既然我们已经知道了系统是怎样启动的,那么就开始迁移分区吧!这里用 Disk Genius PE 版本对分区进行修改。 提示:这里我们用虚拟机模拟操作,因为物理机没办法截图…… 首先打开 PE 系统,缩容 Windows 分区到一半大小。 然后复制 Data 分区到硬盘 0 的空闲区域中。 再删除 Data 分区。 然后磁盘就变成了这样。 EFI 分区夹在中间,导致 Ubuntu 无法完全利用空间。因此想办法移动到硬盘最前端。 先记录总扇区数量: 然后扩容分区,再缩小到原来的大小。 最后扩容 Linux 分区: 然后启动系统。 你会发现,Grub 的配置文件还在,但是由于分区移动,配置文件并不能正常启动 Ubuntu,只能启动到内核阶段: 命令行启动系统 注:这里没 Windows 是因为开了虚拟机演示。 按下 c,进入命令行。我们来通过命令行启动系统。 你应该可以看到 grub> 这个东西。 输入 boot,提示要先加载内核。 内核的话,在 /boot 里面。 输入 linux(指定内核),然后输入路径,然后按下 Tab 自动补全: 加上 ro 指的是内核只读。 再输入 boot 命令,然后你会发现系统并没有正常启动。 这是因为没有指定根目录的位置。 按 Ctrl+Alt+Delete 重启,然后同样进入命令行,输入 ls 查看磁盘分区。
阅读全文