文章简介
无
前言
每个人都有可能在自己的设备上安装一个 Linux 发行版。不论什么原因,如果你的手头没有 U 盘,或者需要在受限环境(比如说,在 VPS 上安装不被服务商支持的发行版)中安装,那么不妨看一下这篇文章中的解决方案。
不过,也有一个方法是将系统中的其他闲置存储设备(如 CD、空硬盘或 SD 卡)“当作”U 盘刻录进 Live CD,这个本质上还是 U 盘,因此不在本文讨论范围内。
下面的方法可能需要一定的系统维护能力和知识,且很多方法极有可能损坏你本来的系统。如果你不知道你在做什么,请不要继续。
PXE
- 适用情况:在本地电脑上安装。
- 材料:局域网(如果电脑直连校园网就别想了)、另一台设备(路由器、另一台电脑,或 Android 手机)
概述
PXE(Preboot eXecution Environment)是一套协议,定义了一个计算机该如何从网络下载和运行操作系统。通常来说 PXE 被用在网吧电脑等环境,也会用在企业批量配置(通常称为 Kickstart)新电脑上。
由于该方案需要较强的专业知识和能力,因此,在你走投无路之前,不推荐使用。
操作
下载发行版的网络启动版本,有些会直接提供 PXE 用的文件,并使用路由器或另一台电脑/手机在局域网内架设 PXE 服务器。在你要安装的计算机上使用 PXE 启动,届时它会自动从 PXE 服务器拉取系统文件并最终进入安装程序。
由于 PXE 是一个相当古老通用且广泛使用的东西,具体的操作步骤在网上有很多讲解,我就不再赘述了。
“分区当 U 盘”法
- 适用情况:目标计算机支持 UEFI 启动,且系统上有一块 GPT 分区表的硬盘。
注意这里的 GPT(GUID 分区表)指的是 UEFI 规范定义的一个硬盘分区表格式,而不是现在常听到的生成式预训练 Transformer 网络。
概述
和以往的 BIOS/CSM 系统相比,UEFI 系统启动时的工作机制不同——它的启动机制完全基于文件系统,可以遍历整个硬盘里的所有 FAT16/FAT32 分区并在从中找到启动文件,而不局限于磁盘的前几千字节。
这为我们的方案提供了可能性:我们可以从已有的文件系统中挤出一个 FAT32 分区,并往里面存放新系统的启动文件,然后就可以直接从本地硬盘启动目标系统。
操作步骤
1. 是不是 UEFI?
首先,需要判断电脑是否支持 UEFI 启动。
- Windows:按 Win-R,输入
msinfo,查看“系统摘要”中“BIOS 模式”的值。如果你是用 UEFI 启动的 Windows,它应该显示“UEFI”。 - Linux:运行
ls /sys/firmware/efi,如果没有报错“找不到文件”,说明你是用 UEFI 启动的。 - 通用:如果开机动画会显示你主板的 Logo,说明是用 UEFI 启动的。
如果上述三个方法表明你的系统不是 UEFI 启动,别急,也还有希望。请你打开 BIOS 设置,并寻找以下字眼:
- Secure Boot(安全启动)
- CSM(Compatibility Support Module)(兼容性支持模块)
- Legacy
- ...
如果找到了以上字眼,说明你的主板其实是支持 UEFI 启动的,只是你当前运行的 OS 不是 UEFI 启动的而已。
2. 是不是 GPT 硬盘?
UEFI 模式下,固件只支持读取 GPT 硬盘内的分区。因此为了让我们的方法成功,有必要确认硬盘是否是 GPT 格式。
- 如果你的电脑是 UEFI 启动的,那么恭喜你!你的硬盘一定是 GPT 格式的。
- 如果你的电脑不是 UEFI 启动,那么你可以打开分区软件查看。
一些网络资料可能会提到,可以从 MBR “无损”转换成 GPT 硬盘。虽然从理论上而言这是可能的,并且 Windows 确实提供执行这一操作的工具(
mbr2gpt.exe),但如果你的主板不支持 UEFI,执行转换之后有可能无法启动系统。Legacy+GPT 启动方式需要硬盘中有一个单独的用于存放启动代码的分区,且 Windows Boot Manager 不支持该模式, MBR->GPT 转换工具极有可能无法处理此类情况。因此,请不要随意执行转换。
黑苹果生态中的一些引导加载程序,即 Clover 或 OpenCore,支持在老旧设备上模拟 UEFI 固件,或许可以借助它们完成下面的内容。不过这不在本文的讨论范围之内。
3. 安装 Windows
如果你要用这个方法安装的系统是 Windows 10/Windows 11,那么请跟随以下步骤:
- 在 GPT 硬盘里创建两个分区:一个 2GB 的 FAT32,一个 6GB 的 NTFS。
- 下载 Windows 安装 ISO。
- 把安装 ISO 中的所有文件复制进 NTFS 分区中;把安装 ISO 中除了
sources/install.wim的文件复制进 FAT32 分区中。 - 重启到 BIOS 设置界面,从 FAT32 分区启动。
- 打开 cmd.exe,启动
diskpart.exe。 - 在里面卸载(
REMOVE删除盘符)2GB FAT32 分区,并挂载(ASSIGN分配盘符)6GB NTFS 分区。 - 退出
diskpart.exe。 - 切换到 NTFS 分区(如,输入
E:并回车),启动setup.exe。 - 按照正常流程安装。注意在 Windows 安装器中分区步骤内对分区表的更改是即时生效的,并且不要删除 6GB NTFS 分区。
- 进入系统后可以正常删除。
4. 安装 Linux
这里以 Fedora Linux 为例。
核心原理:见Linux 启动过程叙述。通过修改内核命令行参数1,可以介入 initramfs/initrd 寻找根分区的过程并指导它的行为,来让它找到正确的、不在 U 盘上的系统资源文件。
- 获取 Fedora 的安装介质
.iso文件。
附录 1. Linux 启动过程
- Linux 发行版, Linux 操作系统, 发行版
- 以 Linux 内核为核心所构建的一整套宏内核操作系统。
- Linux, Linux 内核, 内核
- Linux 操作系统的核心程序。x86_64 架构的内核本体大小在 20MB 以下。
- 根目录
- Linux 系统中最外层的目录,一切文件都放在这里。
- initramfs, initrd
- 在系统的主要根目录加载之前的临时微型根目录,其内通常包含一系列文件系统驱动、必要硬件驱动等。它通常会在内核启动前被完全加载进内存,承担着搜索和挂载真实根目录的职责。(initramfs 和 initrd 两个名词在技术上有区别,但从职责来看是相同的)
- 引导加载程序
- 运行在 UEFI/BIOS 内的程序,由主板固件直接启动,承担启动操作系统的职责。
市面上主流的 Linux 发行版的启动步骤是这样的:
- 主板固件启动引导加载程序。
- 引导加载程序将内核和 initramfs/initrd 加载进内存。
- 引导加载程序启动内核。
- 内核加载驱动并启动 initramfs/initrd 中的初始化程序。(通常是来自 initramfs 打包系统的程序,少数情况下有可能是
systemd) - 初始化程序找到根分区并挂载后,
switch_root(8) 到真实根分区上,并运行系统实际的 init(PID 1)命令(通常是systemd)。 - init(PID 1)执行系统启动流程。
-
内核命令行参数:引导加载程序在启动内核时,向内核传递的字符串。它一般来说可以指定根分区位置、内核开机行为、屏蔽/强制加载某一特定的内核模块等。如果你有一个 Linux 系统,可以查看
/proc/cmdline来看到内核命令行参数。 ↩