前言

我的台式电脑上,装了 Windows 和 Linux 双系统。

我有两块 1 TB 硬盘,就把它们叫作硬盘 0 和硬盘 1 吧。最开始的时候,硬盘 0 上装了 Windows 系统,而我的数据分区装在硬盘 1 上面。

后来呢,我想体验 Ubuntu,于是用安装程序调整了硬盘 1 的 Data 分区大小,然后在那里装了系统。

一切都很好,直到一天 Ubuntu 提示我空间不足。

经过一些合理的构思,我打算这么做:

  1. 清理 Windows 磁盘空间
  2. 调整 Windows 分区大小到 500 G
  3. 清理磁盘 1 上的数据
  4. 复制 Data 分区到磁盘 0 的空闲区域
  5. 扩展磁盘 1 的 Ubuntu 系统分区
  6. 调整系统引导,正确启动系统

话不多说,我们先来看看一开始的分区示意图。

然后,我们要达到的目标:

结果在迁移过程中,耗费最久时间的不是数据复制,而是引导的配置。

所以,本文就从电脑启动开始,带你深入了解双系统的工作原理,相信你看完就能随便调整电脑了。

从 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 查看磁盘分区。

然后 ls 后面加上磁盘分区,一个个试一试,直到找到如下的 linux 根目录。

现在我们就可以用命令行启动了。

输入类似下面的命令:

linux /boot/vmlinuz-... ro text root=/dev/sda1

你的 root 后面跟着的东西可能不同,取决于你的硬盘和分区。你可以执行下面的命令找到分区标识:

cat (hd2,gpt2)/etc/fstab

把 (hd2,gpt2) 换成你刚刚找到的 linux 主分区。输出应该类似下面:

这样找到了安装时的分区。然后你就可以推算了。sda 表示安装时使用的硬盘。后面数字表示分区编号。把 sda 后面的数字一个个试一试,直到找到正确的分区。

然后指定 initrd:

initrd /boot/initrd.img-...

再输入 boot 启动系统。

出现下面这种就是分区错了,只启动了内核,重启换一个 root 分区:

否则,就能直接进入系统。

重新配置 Grub

为了避免每次启动都要输入命令,在系统中有 update-grub 命令用于修复配置文件。

直接执行即可。可以看到它识别了 Linux 和 Windows 双系统,至此引导程序修复完毕。

从 UEFI 启动到双系统——记一次双系统 Linux 分区迁移的更多相关文章

  1. UEFI+GPT引导实践篇(一):切换到UEFI启动,准备安装介质

    如果只单纯比较UEFI引导和BIOS引导,那么毫无疑问UEFI引导要简单很多.不过现在的主板大都是同时兼容BIOS和UEFI引导方式,所以在实际操作前还需要确认一些东西.详见下文. 1.我的电脑支不支 ...

  2. (译)UEFI 启动:实际工作原理

    本文是我翻译自国外技术博客的一篇文章,其中讲述了 UEFI 的一些基本概念和细节. 本文的原始链接位于: https://www.happyassassin.net/2014/01/25/uefi-b ...

  3. UEFI启动(翻译)

    本文是我翻译自国外技术博客的一篇文章,其中讲述了 UEFI 的一些基本概念和细节. 本文的原始链接位于: https://www.happyassassin.net/2014/01/25/uefi-b ...

  4. 重装win10+ubuntu 双系统 UEFI启动模式

    有较强的时效性!!先看一眼日期是否太古老! 任务 卸载双系统中的Ubuntu14,安装Ubuntu16 环境 操作系统: Win10 + Ubuntu14双系统 硬盘: 固态硬盘 + 机械硬盘,电脑的 ...

  5. 【教程】在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统

    本文为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/9949789.html 动机 最近在自学MIT6.828 Operating S ...

  6. 安装Win10+Ubuntu14.04双系统(uefi启动版)

    说明 本教程基于个人电脑(型号:神舟K550d-i7 D1)成功安装测试发布,不同硬件环境可能有细微差异,为预防安装过程中出现意想不到的报错,重要数据请提前备份 硬件环境 cpu:Intel i7-4 ...

  7. 默认系统为UEFI启动的GPT分区的WIN7(8),如何安装VHD的UEFI WIN8(7)

    默认系统为UEFI启动的GPT分区的WIN7(8),如何安装VHD的UEFI WIN8(7) 情况A:如果默认系统为UEFI启动.GPT分区的WIN7,想安装个VHD的UEFI WIN8.1 1:系统 ...

  8. UEFI 启动GPT分区 Win10和Ubuntu16.04双系统安装

    测试机器:联想小新锐7000 工具:UltraISO 系统下载 为Ubuntu分配空间 右键“我的电脑”——>“管理”——>“磁盘管理”,(win+x快捷键)选择一个有很大空闲空间的磁盘, ...

  9. (转载)uefi启动解析:由原理到实例

    这是本文的全部内容:A:什么是UEFI,其含义B:UEFI模块包含的文件逐个分析及其引导流程+ESP分区的本质C:判断自己的机器是X64(64 bit)构架还是IA32(32 bit)的构架D:给传统 ...

  10. UEFI启动视频详解:启动分析+N项操作实例

    ============================================================= ※※※※最给力的视频解说※※※※ 2011hiboy全部共享资料:立刻去   ...

随机推荐

  1. 聊聊 FocusSearch/focus_mcp_sql:Text2SQL 的新玩法

    最近在 GitHub 上逛的时候,发现了一个挺有意思的项目--FocusSearch/focus_mcp_sql.作为一个对 Text2SQL 有点小研究的前端码农,我忍不住想和大家聊聊这个工具.它不 ...

  2. 最优化算法动量法Momentum

    动量法的结论: 1.动量方法主要是为了解决Hessian矩阵病态条件问题(直观上讲就是梯度高度敏感于参数空间的某些方向)的. 2.加速学习 3.一般将参数设为0.5,0.9,或者0.99,分别表示最大 ...

  3. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(9)

    1.问题描述: 通过push token向鸿蒙手机推送一条通知,收到通知后,通知右侧不展示图片. 解决方案: 检查一下是否存在图片风控:https://developer.huawei.com/con ...

  4. 基于RAG的MaxKB知识库问答系统如何选择向量模型

    在MaxKB中替换向量模型前,我们需要先了解向量相关的原理和技术,此处不做赘述,大家可以自行学习.可以了解下Embedding.Embedding核心,向量库等内容. 一.MaxKB 默认向量模型 M ...

  5. Codeforces Round 1006 (Div. 3) 比赛记录

    Codeforces Round 1006 (Div. 3) 比赛记录 比赛链接 这场的题目名称都很长啊~. 很简单的一场(毕竟是div3,能不简单嘛)赛时切掉了A - F,C题花的时间有点多,G题偶 ...

  6. camunda工作流实战项目【PRO版】(表单设计器+流程编辑器,零代码创建流程)

    pro版本主要对流程设计器.表单模块做了优化和改造,下面是各版本功能对比 一.整体情况介绍 基于ruoyi平台和camunda工作流开发而成,结合bpmn.js流程编辑器和vform表单设计器,实现常 ...

  7. linux系统批量查找网站源码并替换字符,查找替换指定内容

    问题描述:维护中需要批量修改代码中某个字符,如果单个打开页面进行修改则效率过低,linux系统下借助grep命令快速查找替换 命令示例1: grep -rl '查找的内容' . | xargs sed ...

  8. 云服务器Linux 时间与本地时间不一致

      云服务器Linux 时间与本地时间不一致 问题解释: 云服务器和本地计算机之间的时间不一致可能是因为它们使用的时间同步服务不同,或者云服务器没有配置自动对时. 解决方法: 手动同步时间:可以使用d ...

  9. Appflowy cloud 部署测试避坑指南

    在进行 Appflowy cloud 部署测试时,我可谓是踩坑无数.下面,我想从几个关键方面来分享一下我的经验. 先给大家讲讲我的基础情况.Appflowy cloud 的部署是在 docker 环境 ...

  10. 李沐动手学深度学习V2-chapter_convolutional-modern

    李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...